计算化学公社

标题: VASP 用 GPU 加速后似乎没有 CPU 并行快 [打印本页]

作者
Author:
Ionizing    时间: 2021-1-6 16:52
标题: VASP 用 GPU 加速后似乎没有 CPU 并行快
本帖最后由 Ionizing 于 2021-1-6 17:08 编辑

本人使用某超算中心集群,编译了 VASP 6.1.0 ,使用 GPU 加速后效率反而没有单纯 CPU 并行效率高:

测试体系:
  1. TiO2(110) rutile+O2, with LDAU, ISPIN=2, 36 k-points, symmetry off(见附件)
复制代码

测试环境

测试结果(每个电子步的时间):
  1. 1 node with no GPU: 20s, (i.e. 36 mpi tasks)
  2. 2 nodes with no GPU: 11s, (i.e. 72 mpi tasks)
  3. 1 node with V100x2: 83s, (1 mpi task)
  4. 1 node with V100x2: 88s, (36 mpi tasks)
  5. 1 node with V100x2: 44s, (2 mpi tasks)
  6. 1 node with V100x2: 43s, (4 mpi tasks)
复制代码



注:


[size=14.399999618530273px]提交脚本:
  1. #!/bin/bash
  2. #SBATCH --account some_account
  3. #SBATCH -p analysis
  4. #SBATCH -N 1
  5. #SBATCH -n 6
  6. #SBATCH -c 6
  7. ##SBATCH --ntasks-per-node=32
  8. #SBATCH -t 02:00:00
  9. #SBATCH --gres=gpu:volta:2
  10. #SBATCH --gres-flags=disable-binding

  11. source /etc/profile.d/modules.bash
  12. module purge

  13. ulimit -s unlimited

  14. export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK

  15. module purge
  16. module load intel/ips_18
  17. module load impi/ips_18
  18. module load cuda/11.1.0-intel
  19. echo "============================================================"
  20. module list
  21. env | grep "MKLROOT="
  22. echo "============================================================"
  23. echo "Job ID: $SLURM_JOB_NAME"
  24. echo "Job name: $SLURM_JOB_NAME"
  25. echo "Number of nodes: $SLURM_JOB_NUM_NODES"
  26. echo "Number of processors: $SLURM_NTASKS"
  27. echo "Task is running on the following nodes:"
  28. echo $SLURM_JOB_NODELIST
  29. echo "============================================================"
  30. echo

  31. srun ../bin/vasp_gpu
复制代码



编译参数(makefile.include):
  1. # Precompiler options
  2. CPP_OPTIONS= -DHOST="LinuxIFC"\
  3.              -DMPI -DMPI_BLOCK=8000 -Duse_collective \
  4.              -DscaLAPACK \
  5.              -DCACHE_SIZE=4000 \
  6.              -Davoidalloc \
  7.              -Dvasp6 \
  8.              -Duse_bse_te \
  9.              -Dtbdyn \
  10.              -Dfock_dblbuf

  11. CPP        = fpp -f_com=no -free -w0  $*$(FUFFIX) $*$(SUFFIX) $(CPP_OPTIONS)

  12. FC         = mpiifort
  13. FCL        = mpiifort -mkl=sequential

  14. FREE       = -free -names lowercase

  15. FFLAGS     = -assume byterecl -w -xHOST
  16. OFLAG      = -O2
  17. OFLAG_IN   = $(OFLAG)
  18. DEBUG      = -O0

  19. MKL_PATH   = $(MKLROOT)/lib/intel64
  20. BLAS       =
  21. LAPACK     =
  22. BLACS      = -lmkl_blacs_intelmpi_lp64
  23. SCALAPACK  = $(MKL_PATH)/libmkl_scalapack_lp64.a $(BLACS)

  24. OBJECTS    = fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d.o

  25. INCS       =-I$(MKLROOT)/include/fftw

  26. LLIBS      = $(SCALAPACK) $(LAPACK) $(BLAS)


  27. OBJECTS_O1 += fftw3d.o fftmpi.o fftmpiw.o
  28. OBJECTS_O2 += fft3dlib.o

  29. # For what used to be vasp.5.lib
  30. CPP_LIB    = $(CPP)
  31. FC_LIB     = $(FC)
  32. CC_LIB     = icc
  33. CFLAGS_LIB = -O
  34. FFLAGS_LIB = -O1
  35. FREE_LIB   = $(FREE)

  36. OBJECTS_LIB= linpack_double.o getshmem.o

  37. # For the parser library
  38. CXX_PARS   = icpc
  39. LLIBS      += -lstdc++

  40. # Normally no need to change this
  41. SRCDIR     = ../../src
  42. BINDIR     = ../../bin

  43. #================================================
  44. # GPU Stuff

  45. CPP_GPU    = -DCUDA_GPU -DRPROMU_CPROJ_OVERLAP -DUSE_PINNED_MEMORY -DCUFFT_MIN=28 -UscaLAPACK -Ufock_dblbuf

  46. OBJECTS_GPU= fftmpiw.o fftmpi_map.o fft3dlib.o fftw3d_gpu.o fftmpiw_gpu.o

  47. CC         = mpiicc
  48. CXX        = mpiicpc
  49. CFLAGS     = -fPIC -DADD_ -Wall -qopenmp -DMAGMA_WITH_MKL -DMAGMA_SETAFFINITY -DGPUSHMEM=300 -DHAVE_CUBLAS

  50. CUDA_ROOT  ?= /usr/local/cuda/
  51. NVCC       := $(CUDA_ROOT)/bin/nvcc -ccbin=mpiicc
  52. CUDA_LIB   := -L$(CUDA_ROOT)/lib64 -lnvToolsExt -lcudart -lcuda -lcufft -lcublas

  53. #GENCODE_ARCH    := -gencode=arch=compute_30,code="sm_30,compute_30" \
  54. #                   -gencode=arch=compute_35,code="sm_35,compute_35" \
  55. #                   -gencode=arch=compute_60,code="sm_60,compute_60" \
  56. #                   -gencode=arch=compute_70,code="sm_70,compute_70" \
  57. #                   -gencode=arch=compute_72,code="sm_72,compute_72"

  58. GENCODE_ARCH    := -gencode=arch=compute_35,code="sm_35,compute_35" \
  59.                    -gencode=arch=compute_60,code="sm_60,compute_60" \
  60.                    -gencode=arch=compute_70,code="sm_70,compute_70" \
  61.                    -gencode=arch=compute_72,code="sm_72,compute_72"


  62. MPI_INC    = $(I_MPI_ROOT)/include64/
复制代码




现在我的疑问是:




作者
Author:
KevinLee    时间: 2021-1-25 15:30
vasp本来就是cpu更合适
作者
Author:
abin    时间: 2021-1-26 09:28
#SBATCH -N 1 以下申请的资源请局限在一个节点,猜测是36个核心的机器
#SBATCH -n 6 分成六组,  
#SBATCH -c 6 每一个组6个MPI_thread?

如果设定的是NCORE=6, 那么-n -c选项都可以拿掉了。

另外,请确认
1    VASP_GPU版本,是100%纯GPU程序吗?
2    系统设定的一个GPU默认搭配几个CPU核心?
3    如果具有IB网络,可以尝试修改-DMPI_BLOCK=8000 -DCACHE_SIZE=4000 来获取更高的性能,可以google到部分论文。实际效果待测试,严重依赖硬件。
4    GPU加速严重依赖双精度的计算,效果一般,比如参考Gaussian16。
5    可以测试-O3优化。


作者
Author:
大懒猫王浩    时间: 2021-2-23 14:08
我现在也发现了了这个问题,不仅GPU版,包括ACC版本,有时候4块GPU的速度还不如单个CPU节点。。。ACC版本有时候会异常的慢。。。搞的我最近比较烦躁,不知道是不是跟算的原子数总数有关系。。。楼主有空可以测试一下。。。而且GPU没必要开那个多mpi进行,,貌似一个GPU开两个进程是比较快的。ACC版本只支持一个进程一个GPU。。。
作者
Author:
大懒猫王浩    时间: 2021-2-23 14:19
主要是现在GPU节点配备的CPU也基本上式非常好的CPU,但是一个GPU往往只用上一个CPU核心。所以单CPU节点和GPU节点的运行速度估计不好比较,应该是单CPU核心比单CPU核心+单GPU卡慢很多?
作者
Author:
vv_c    时间: 2021-3-13 00:06
试试 NSIM=4
作者
Author:
hgyhgy    时间: 2022-2-27 20:51
KevinLee 发表于 2021-1-25 15:30
vasp本来就是cpu更合适

我可是十分肯定地说,对于体系比较大的时候,肯定是GPU版本的速度会快很多的(官方说快10倍)。但如果体系比较小时,CPU版本的可能会更快,这个不能作为比较的标准。尤其是多K点并行时,效率会特别高,一个K点,一个GPU,几乎能按比例降低时间。但对于单K点多个GPU并行的效率就没那么高了。就是说你用两个GPU算一个K点的体系,效果可能就不佳,甚至与只用一个GPU时的速度一样。这是vasp5时gpu版本。

据说目前出了ACC版本,速度比起原来的GPU版本速度还快。我只编译过旧的GPU版本的,编译过程十分复杂,源代码有bug,要修改(在网上能找到解决办法,但说得不详细,也不全面)。新版本有可能对单K点多GPU的并行效率有提升。

vsap5 GPU时,如果只是使用官方的版本,其效果就是如果是多个K点,那么最好就只使用与K点相同数目的GPU数量(体系很大,不可约K点数目少),这样所花时间,就只与单个K点所花的时间几乎相同。但当GPU多于不可约K点数目,你想用更多GPU来计算,那旧基本就没用了,基本不能降低计算时间。

对于之前那个版本,使用magma(有一个网站专门开发这个的,在旧版中,有使用这个东西的编译选项)十分关键,可以很大程度地改善那种多个GPU算单K点并行效率不佳的情况。不清楚vasp6是否还能继续使用那个magma,以及是否依然有必要使用那个magma库。

GPU版最强的地方,就在于多K点并行。采用与不可约K点相同数量的GPU,就与采用单个K点所花的时间差不多。对时间降低作用可想而知,如果不可约K点不太少,能达到的速度不是CPU并行能够追得上的。

此外计算hybrid DFT的速度快,CPU版本难以算得动的体系,再多的CPU都没办法的体系,GPU版本的都可能能胜任。如果主要使用hybrid DFT,GPU版本的优势就特别明显了。

由于不清楚vasp 6 acc版本的具体情况,如果是算得慢的,很可能是因为你这个体系的K点数量太少了,比如只有1个,你采用多个GPU的效果可能就不佳了。可以考虑一下是否这种情况。也可以查看一下vasp 6是否依然可以使用那个magma,这个对于提高旧GPU版本的并行效率十分重要。

总结一下,对于旧GPU版,对于多个K点,使用与K点数量相同的GPU(比如2个K点,2个GPU)进行计算。更多的GPU,几乎没有效果。使用magma库编译,能够改善,但效果不能按比例减少计算时间。

旧GPU版的并行效率就是有这个K点数量太少,并行效率差的问题。
作者
Author:
彭祥凤    时间: 2022-7-5 13:13
hgyhgy 发表于 2022-2-27 20:51
我可是十分肯定地说,对于体系比较大的时候,肯定是GPU版本的速度会快很多的(官方说快10倍)。但如果体 ...

“对于旧GPU版,对于多个K点,使用与K点数量相同的GPU(比如2个K点,2个GPU)进行计算” 请问这里说的k点的数量是KPOINTS还是IBZKPI中的数量
作者
Author:
chenhang07    时间: 2022-7-20 05:07
vasp:6.3,GPU:8*A100(nvlink) ,计算稀土金属掺杂256个原子体系,使用GPU速度很快,比单纯cpu快多了。
作者
Author:
Q-Chembio-llg    时间: 2022-9-5 17:58
感觉GPU跑声子比CPU快好多的样子
作者
Author:
abin    时间: 2022-9-5 22:49
路过补充一下 A100,约八万人民币一块。
想用GPU加速的,可以看一下预算。

可能价格会跳水,但是也不是一万元一块的。
作者
Author:
gog    时间: 2022-9-6 07:32
H100快出来了,A100会降价让道吧。
用vasp最新版去测试哦。版本号是  6.3.x。没买许可的话,难拿到这个版本的代码。
作者
Author:
szp12345    时间: 2022-9-6 08:53
chenhang07 发表于 2022-7-20 05:07
vasp:6.3,GPU:8*A100(nvlink) ,计算稀土金属掺杂256个原子体系,使用GPU速度很快,比单纯cpu快多了。

真豪啊,8个A100的价格完全可以搞8台8375C的双路机器,有这样一套就没必要搞GPU加速了
作者
Author:
k64_cc    时间: 2022-9-6 09:51
前两天刚测的,RTX2060,128个水,gamma点跑AIMD,单GPU速度大概是24C的上百倍。当然这里有个重要的因素是VASP用CPU跑大体系实在是慢得太离谱了。
作者
Author:
KiritsuguPapa    时间: 2022-10-19 13:46
k64_cc 发表于 2022-9-6 09:51
前两天刚测的,RTX2060,128个水,gamma点跑AIMD,单GPU速度大概是24C的上百倍。当然这里有个重要的因素是V ...

您好 请问能否提供一下输入和输出文件?我想做一下对比测试 谢谢!
作者
Author:
houziyy    时间: 2022-12-17 20:49
我也来加入讨论一下。配置是AMD_epyc_7532【32 core, 128 GB内存】+ RTX3080 【10 GB显存】,系统Ubuntu22.10/窗口x11/NVIDIA-SMI 515.86.01
vasp_cpu版本:6.3.2+openmpi_4.1.4+fftw3.39+openblas0.3.20+scalapack-openmpi2.2.1,编译文件makefile.include.gnu_omp
vasp_gpu版本:6.3.2+nvhpc_22.5_(自带cuda11.7和openmpi3.1.5)+fftw3.3.8,编译文件makefile.include.nvhpc_omp

体系1:140Fe+10Si原子,普通aimd(ncore=2, ALGO=veryfast, ENCUT=400, EDIFF=1.E-4,TEBEG=300),都用的vasp_gam,分别跑30步
vasp_cpu | 20 cores | 823s
vasp_gpu | -np 1     | 1171.283s

体系2:Liquid Si - MLFF,vasp官网的机器学习文件,64Si原子 (NCORE=2), NSW=5000, 都用的vasp_gam
vasp_cpu | 6 cores | 801s
vasp_cpu | 10 cores| 436s
vasp_cpu | 20 cores| 377s
vasp_cpu | 30 cores| 335s
vasp_gpu | -np 1    | 1550s/1531/1693 (跑了三次)

总的来说,vasp_gpu版本可能在算大体系的时候会展现出优势,原子数小的时候,确实水平比cpu弱了很多。后面我再试试大体系吧,内存别爆炸就行。64atom的Si用了gpu1.2G显存吧。我再试试更大的体系。
作者
Author:
gog    时间: 2022-12-18 08:43
houziyy 发表于 2022-12-17 20:49
我也来加入讨论一下。配置是AMD_epyc_7532【32 core, 128 GB内存】+ RTX3080 【10 GB显存】,系统Ubuntu22. ...

用游戏显卡,跑经典分子动力学非常有优势。游戏卡的双精度计算核心,被砍了又砍,算第一性原理是,用的是游戏显卡的鸡肋功能。
作者
Author:
houziyy    时间: 2023-5-9 13:04
gog 发表于 2022-12-18 08:43
用游戏显卡,跑经典分子动力学非常有优势。游戏卡的双精度计算核心,被砍了又砍,算第一性原理是,用的是 ...

嗯,是的。明显的鸡肋。
作者
Author:
ddddnight    时间: 2024-4-21 21:50
请问怎么双精度跑vasp,我4090跑vasp比48和的7763CPU跑慢好多
作者
Author:
abin    时间: 2024-9-14 20:00
ddddnight 发表于 2024-4-21 21:50
请问怎么双精度跑vasp,我4090跑vasp比48和的7763CPU跑慢好多

你这句表述就有问题。

多数积分计算需要双精度,这是程序或者部分routine 自己决定的。

不是你怎么设定,就可以让程序跑在双精度模式。

一般而言,消费级的GPU,由于双精度运算性能弱,
对于严重依赖双精度积分计算的程序,
GPU能带来的加速不太明显,或者说,性价比不高。

也许,代码重构了,会有更好的表现。


作者
Author:
ljb874722957    时间: 4 day ago
大懒猫王浩 发表于 2021-2-23 14:19
主要是现在GPU节点配备的CPU也基本上式非常好的CPU,但是一个GPU往往只用上一个CPU核心。所以单CPU节点和GP ...

你好老师,最近想用到gpu编译,是只能一个gpu用上一个cpu核心吗?不想浪费cpu多核心的算力




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3