ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Windows下用WSL2编译运行VASP 6.5.0完整指南

Windows下用WSL2编译运行VASP 6.5.0完整指南

VASP也能在Windows上跑?问出这个问题的不只你一个人。我在多个技术群里反复看到有人问“VASP有没有Windows版”“能不能在笔记本上直接算”,得到的回复基本都是“老老实实用Linux”。这个认知不算错,VASP官方确实没有发布Windows原生安装包,但这不代表Windows用户就没有路可走。借助WSL2这套兼容层,我在这台Windows工作站上完整编译并运行了VASP 6.5.0,跑了结构优化、自洽计算和态密度计算,结果和纯Linux环境下的计算结果对得上,效率也在可用范围内。这篇内容就围绕“Windows环境下编译和运行VASP 6.5.0”这件事展开,把从环境搭建、依赖安装、makefile配置到性能实测和排错的全过程写清楚,给那些手头只有Windows机器、又确实需要跑VASP的人一条可以复现的路。

先说清楚一个前提:这篇文章里的“Windows版VASP 6.5.0”,本质是指VASP跑在Windows系统自带的WSL2里,不是那种点击setup.exe就能安装的图形界面版本。VASP这种紧密依赖Fortran编译器、MPI并行库和数学库的科研软件,原生Windows生态很难伺候好,而WSL2提供了一个系统调用兼容的Linux环境,让VASP的整个编译链可以像在服务器上一样工作。你不需要双系统、不需要虚拟机,也不用再买一台Linux机器,就靠手头这台Windows设备就能把这个事情落地。

1. 为什么要在Windows上编译VASP 6.5.0

1.1 谁需要这个方案

很多人以为VASP是集群专属软件,普通PC跑不动。这个想法在体系规模很大的时候是对的,但对日常教学、小体系验证、参数调试和快速测试来说,一台配置中等的Windows工作站完全够用。我自己常干的一件事就是先在本地Windows机器上把输入文件、K点密度、截断能这些参数调好,跑到收敛,再丢到远程集群去跑大规模任务。本地机器越顺手,调试效率越高。

另一个典型场景是学生和青年教师。很多课题组里的计算资源有限,排队是常态,而VASP的参数调试往往需要反复试错,每一次排队都让人抓狂。如果能在自己电脑上先处理掉70%的“试错型计算”,剩下真正吃资源的任务再上集群,整体周转时间能明显缩短。我自己用这台Windows工作站实测下来,16原子左右的小超胞、适度K点密度下,单个结构优化步骤也就在几十秒级别,完全不是那种“无法接受”的跑法。

还有一类人是被“Windows使用习惯”绑住的。习惯了图形界面、Windows Terminal、远程桌面,突然切到纯命令行Linux虽然不难,但确实需要一个适应期。WSL2方案的好处是你仍然在Windows体系内,文件可以通过\\wsl$路径直接访问,也可以用VSCode的WSL插件编辑代码和提交任务,学习成本比换整台Linux系统低得多。

1.2 这个方案能做什么

我不建议在Windows上跑超大体系的分子动力学或大规模DFT生产计算,但以下几个场景非常合适:

  • 小体系的结构优化和自洽计算,比如小分子吸附、单胞或小超胞的电子结构验证
  • 参数收敛性测试,包括截断能、K点密度、展宽参数这些需要反复扫描的工作
  • 学习和教学演示,用来理解DFT计算输入输出、理解VASP的INCAR参数逻辑
  • 作为操作练习环境,在本地把脚本流程、作业提交习惯、数据处理链路跑通,再无缝迁移到集群

实测下来,吞吐量比不上同价位的Linux服务器节点,但胜在“随时可用、零排队、零占用公共资源”。对于个人学习和小型预研,这个体验非常有价值。

2. 编译环境的搭建思路与工具选型

2.1 为什么选WSL2而不是Cygwin或MSYS2

很多人在Windows上跑Linux软件时第一个想到的是Cygwin。Cygwin本质上是把Linux系统调用翻译成Windows系统调用,很多软件能跑,但性能和兼容性都有折扣。VASP这种大量调用MPI、OpenMP和底层BLAS/LAPACK库的软件,在Cygwin里很难编译出稳定高效的版本。MSYS2情况类似,更适合做构建工具链而不是跑科学计算。

WSL2是完全不同的思路,它运行了一个真正的Linux内核,系统调用不再需要翻译,而是直接执行。编译器、MPI运行时、数学库这套生态,跟你在物理Linux机器上面对的几乎完全一致。这也是我用它编译VASP毫无障碍的最核心原因。说白了,WSL2就是你Windows系统里的一个“Linux虚拟机”,只是启动速度和资源开销比传统虚拟机轻得多。

安装WSL2本身很简单。Windows 10较新的版本或Windows 11系统基本都支持,管理员权限下打开PowerShell执行:

wsl --install

这条命令会默认安装合适的Linux发行版和WSL2内核组件。如果你想要特定发行版,可以在命令后面加-d参数指定。注意安装完以后需要重启系统,重启之后首次启动会进入发行版初始化流程,设置用户名和密码。

2.2 依赖库与编译器的选择

VASP 6.5.0的编译核心依赖以下几类组件:

  • Fortran编译器,官方支持路径是Intel的ifort或ifx编译器,这也是VASP计算性能最稳妥的选择
  • MPI并行库,用于分布式并行计算,可以用Intel MPI,也可以用开源MPICH
  • BLAS/LAPACK数学库,推荐直接使用oneAPI工具包里的oneMKL,省去自己编译底层线性代数库的麻烦
  • FFTW库,这是VASP做平面波快速傅里叶变换的核心依赖
  • NetCDF、HDF5,用于输出和读写结构化数据

我的实际选型是:oneAPI工具包选完整安装方式,把编译器、MPI和MKL一次性装齐,再用系统包管理器补上FFTW、NetCDF和HDF5。这样搭配最省心,也最不容易出现库之间版本不匹配的问题。

进入WSL2环境后,先把基础编译工具补上:

sudo apt update sudo apt install -y build-essential gfortran cmake git

然后安装oneAPI工具包。安装方式是下载安装包后执行脚本,这里我以常见的命令行静默安装为例:

wget 安装包下载地址 sudo sh ./安装包文件 -a --silent --eula accept

安装完成后有一步非常关键,很多人在这里翻车:每次打开新的WSL终端,都需要加载oneAPI的环境变量文件:

source /opt/intel/oneapi/setvars.sh

不执行这一步,你敲 ifort、mpiifort、mkl 相关命令时终端会提示找不到命令。为了避免每次手动source,建议把它写进~/.bashrc,让终端每次启动时自动加载。这一点在后面的编译排错章节会再提到。

FFTW使用系统的包管理安装最方便:

sudo apt install -y libfftw3-dev libnetcdf-dev libnetcdff-dev libhdf5-dev

这些库装好之后,编译环境就齐活了。

3. VASP 6.5.0在Windows兼容层下的编译细节

3.1 源码准备与makefile.include的配置

把VASP 6.5.0源码包放进WSL2环境,建议放在Linux根目录下,不要放在/mnt/c/下面。这一点非常重要:跨文件系统访问Windows盘符下的文件,I/O性能和文件权限行为都很怪,编译过程中可能出现莫名其妙的权限错误或性能大幅下降。我一开始放在D盘,编译到一半就报Permission denied,换成Linux目录后一次通过。

源码解压:

tar -zxvf vasp.6.5.0.tar.gz cd vasp.6.5.0

VASP编译的关键在makefile.include文件。源码包arch目录下提供了多个预置模板,比如makefile.include.linux_intel、makefile.include.linux_gnu。由于编译器选的是Intel,复制Intel模板:

cp arch/makefile.include.linux_intel makefile.include

然后打开makefile.include,重点检查几个关键位置:

  • FC和FCL,确认指向ifort或mpiifort
  • MKLROOT相关路径是否正确,通常oneAPI安装好后自动设置好
  • FFTW相关路径是否指向实际安装位置
  • 预编译宏定义,特别是有没有打开-Dparall之类MPI支持

在我的环境里,FFTW和数学库的配置类似这样:

CPP_OPTIONS = -DHOST=\"Linux\" -DMPI -DMPI_BLOCK=8000 -Duse_collective -DCACHE_SIZE=4000 -Davoidalloc -DNGXhalf -DCORE_SIZE=16 FFTW = -lfftw3 BLAS = -L$(MKLROOT)/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core LAPACK = -L$(MKLROOT)/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core

需要说明的是,VASP每个版本对宏定义和依赖库的组合要求不完全一样。6.5.0这个版本对NetCDF和HDF5的功能支持比旧版更完整,如果编译时提示找不到NetCDF相关符号,大概率是-Dlink_netcdf这个宏没有打开,或者NetCDF的Fortran接口库没有装全。

3.2 典型编译过程与常见报错

环境变量加载好、目录配置好之后,执行:

source /opt/intel/oneapi/setvars.sh make std -j8

std会把标准版本编译出来,-j8表示8个并行编译任务。编译过程会持续一段时间,中间如果出现报错,优先检查三类问题:

第一,编译器许可证没有初始化。现象是ifort: error #10052: could not obtain a license for Compiler。出现这个报错基本不是许可证购买问题,而是环境变量没加载,或者系统时间不对。执行一次source /opt/intel/oneapi/setvars.sh再看。

第二,MPI指令找不到。现象是mpiifort: command not found。这说明Intel MPI组件没有正确安装,或者setvars.sh没有把MPI路径放进PATH。如果安装oneAPI时自定义了组件,要确保勾选了Intel MPI那一项。

第三,FFTW模块文件找不到。现象是编译某个文件时提示Cannot open include file: 'fftw3.f03'。这个问题多半是FFTW库没装或者路径没对上。系统包安装的FFTW头文件通常在/usr/include,Fortran模块文件在/usr/include/fortran等位置,如果还是找不到,在makefile.include里显式加上include搜索路径。

编译成功的标志是bin/目录下生成了vasp_std这个可执行文件。验证一下文件是否存在,以及MPI运行是否正常:

ls -lh bin/ mpirun -np 4 bin/vasp_std

如果vasp_std能正常识别并响应参数,说明编译基本成功了。

4. 运行实测与性能表现

4.1 在Windows环境下实际跑VASP的感受

我用一个小体系做了实测,选的是一个小分子的表面吸附模型,原子数大概在20个左右。这台Windows机器的配置是时下很常见的消费级CPU加32GB内存,WSL2分配了16GB内存。

结构优化跑起来后,单个离子步用时基本在几十秒量级,电子自洽迭代的收敛曲线和Linux环境下的结果完全一致。这个没有悬念,因为计算内核就是同一个VASP二进制,底层数学库是同一个MKL,浮点运算逻辑不会有差别。关键是WSL2的I/O性能拖了多少后腿。实测下来,小规模计算时I/O开销微乎其微,速度受WSL2的影响很小。如果读写频率高,比如频繁重启计算、大量写CHGCAR/WAVECAR,I/O消耗会更明显一些,但仍在可用的范围内。

对计算规模和并行核数的建议是:单机跑VASP,总核数不建议超过物理核数的一半到三分之二,尤其不要开超线程上去跑,性能反而可能下降。在我的机器上,8核左右最合理,内存控制在体系原子数×2GB以内的配置比较稳妥。

4.2 WSL2资源限制需要用.wslconfig控制

WSL2默认会使用相当比例的系统内存,如果不加以限制,它会逐渐占用越来越多的内存缓存,导致Windows本机出现卡顿。我的做法是在Windows用户目录下新增一个.wslconfig文件,手工限制内存和CPU数量:

[wsl2] memory=16GB processors=12 swap=0 localhostForwarding=true

改完保存后,在PowerShell中执行:

wsl --shutdown

然后重新进入WSL2,配置就会生效。这个限制尤其重要,因为你一边在Windows上调试计算,一边在WSL2里跑VASP,两边都很吃内存,不做限制大概率会有一边被拖垮。

4.3 跨系统文件访问注意权限

在WSL2里可以通过cd /mnt/e/xxx访问Windows的E盘文件,反过来在Windows资源管理器里也可以看到Linux目录。这个跨访问很便捷,但编译和运行VASP不建议把工作目录放在/mnt/下。

原因有两方面:一是性能,WSL2访问Windows文件系统时走的协议开销远大于访问Linux原生文件系统,跑大规模IO时效率差距很大;二是权限,Windows盘符默认是drvfs挂载方式,文件权限和所有权经常让VASP的脚本和动态库加载出问题。顺手测试过,同样一套输入文件,在/mnt/d/vasp_test下跑和放在/home/xxx/vasp_test下跑,每一步计算速度相差明显。后续我把所有VASP项目都固定放在Linux目录下,Windows侧需要查看时再用资源管理器导航过去。

如果确实要在Windows和Linux之间频繁拷贝数据,建议用tar打包后传输,而不是直接操作单个大文件。这里有个细节可以留意:直接拖拽或复制大批量小文件到/mnt/下会很慢,用rsync或tar统一搬运会快得多,而且能保留文件权限。

5. 常见问题与排查技巧实录

5.1 编译与运行问题速查表

时间段这一副表格我自己在教别人的时候经常用,放在这里可以直接照表排查:

异常现象根本原因有效解法
ifort命令找不到oneAPI环境变量未初始化执行source /opt/intel/oneapi/setvars.sh
mpiifort命令找不到Intel MPI组件未安装重装oneAPI并勾选MPI组件
ifort许可证报错环境变量未加载或系统时间异常检查setvars.sh自动加载,并校准系统时间
找不到 fftw3.f03FFTW的Fortran模块路径缺失在makefile.include中显式添加include路径
编译过程中Permission denied源码放在了/mnt/跨文件系统目录将源码移动到/home目录再编译
VASP运行时识别不到文件文件权限Windows与Linux冲突用Linux侧创建输入文件,或用dos2unix清理换行符
计算速度明显偏慢工作目录在/mnt/c或/mnt/d切换到Linux文件系统目录
wsl: Detected localhost proxy configuration代理配置影响WSL2网络访问检查Windows代理设置,必要时关闭或修正地址

5.2 几个反复出现的操作细节

先说说换行符问题。在Windows下编辑INCAR、POSCAR、KPOINTS这些输入文件的人很容易踩坑,Windows记事本保存的文本文件默认是CRLF换行,Linux程序读取时可能出现解析异常。VASP对一些无关条件的容忍度还算可以,但字面靠后的话,写出半截文件的情况也有。最稳妥的做法是保存文件时选择LF换行,或者用dos2unix批量转换:

sudo apt install -y dos2unix dos2unix INCAR POSCAR KPOINTS

编辑输入文件最顺手的还是VSCode加WSL插件。在Windows里打开VSCode,连接到WSL环境,直接编辑Linux目录下的文件,左侧是Windows界面,右侧是Linux文件系统,既不怕换行符,也不怕权限问题。

再说运行脚本。很多人习惯直接把计算命令丢在终端里,任务一多就乱了。我建议在WSL2里用tmux管理任务。比如:

tmux new -s vasp01

在这个会话里提交任务,用Ctrl+b d暂时退出,整个计算任务在后台继续跑。这样即使你关掉Windows终端窗口,计算也不会被中断。之后再tmux attach -t vasp01回到会话。这个习惯帮我避免了好几次误关终端导致的长任务中断,算是我个人最推荐的操作方式。

5.3 如何判断编译出的VASP是否可靠

编译完成、能跑起来,不代表VASP就真的可用了。推荐做两轮验证:

第一轮是内置测试。VASP源码包里通常带testsuite,直接进入对应目录,用刚编译好的vasp_std跑标准算例,与参考输出比对。比对指标主要是能量收敛值和原子受力,如果最大误差在指定范围外,说明编译过程有隐藏问题,而不是结束就能用。

第二轮是自己物理体系的小测试。拿一个已知结果的体系,比如简单金属块的晶格常数、小分子的基态几何,用Windows环境下的VASP跑一遍,与集群结果或公开文献数据比对。我之前用这个方式验证过,BEEF交换关联近似的表面吸附能,跟Linux下的标准结果完全对得上,这时候对编译质量才算彻底放心。

还有一点是版本混淆风险。如果系统里装过多个VASP版本或者多套MPI,很容易出现调用了错误的vasp二进制或者MPI库版本冲突的问题。每次运行前用下面命令确认用的是哪一个二进制:

which vasp_std mpirun --version

防止忙了半天发现跑的是旧版本或者别的路径下的执行文件。

6. 一些建议和我的经验小结

关于在Windows上跑VASP,很多讨论停在“理论上可行”的阶段,真正动手把整个过程跑通并长期使用的人不多。我在自己机器上把这条路径完整规划并稳定运行起来之后,最大的感受是:这个方案的定位不是替代Linux集群,而是把你的本地设备和集群工作流无缝串联起来。

如果你打算在自己机器上也搭一套,有几个原则值得坚持:

第一,环境固定之后不要频繁变动。WSL2发行版的版本、oneAPI的版本、依赖库的版本,尽量少做升级。每次升级都可能牵一发动全身,连带影响到VASP的二进制兼容性。我自己就曾因为更新了一次系统依赖库版本,导致VASP运行时报GLIBC版本不匹配,当时排查了大半天最后还是从备份环境恢复过来,那次的教训就是“能不动就不动”。

第二,做好备份。编译一套可用的VASP环境并不轻松,建议把关键配置文件和安装脚本存入笔记,环境装好后可以直接重建。至少把makefile.include备份出来,这个东西即使过几年后重装也能省下很多时间。

第三,在Windows和WSL2之间建立清晰的工作目录习惯。比如Windows的C:\vasp_work只放输入输出归档,真正计算全部放在WSL2的/home/xxx/vasp_projects下。计算完成后,再通过\\wsl$把结果目录映射到Windows侧做后处理分析。这个流程清晰,也不会因为文件系统差异踩坑。

最后分享一个小技巧:写完输入文件后,可以先跑一个极短的自洽迭代,比如NELMDL保持默认、把NELM设为1,看POSCAR解析是否正确、体系初始化能否顺利完成。一次能通过,再投入完整计算,远比一开始就跑正式任务靠谱。这个小习惯不少老用户也在用,就属于“早知道能省事”的细节之一。

我记得刚把这套Windows环境搭好的那天,连续跑了好几个文献体系,在本地把参数都扫了一遍,心里是很畅快的。以后再也不用因为“电脑不是Linux”这种原因出门右转排队了。如果你也是手头只有Windows机器,却有VASP需求的人,不妨照着这篇内容试一把。过程会有些小波折,但跑通那一刻,你会发现这一切都值得。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进