嗨格列布,
我是成毅感谢您开发这个宏伟的项目。 这对研究FDTD及其并发性非常有帮助。 但是我在使用 MPI/GPU 计算时遇到了一些问题。
./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
--use-cuda
--cuda-buffer-size 1
--cuda-gpus 0
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4
该程序将仅显示日志“从文件 ./Examples/vacuum3D_test.txt 加载命令行
” 一直等到我杀了它。我只是想知道是否有一些配置我没有正确设置?
顺便说一句,这是我的 cmake 标志,以防您需要它:
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCUDA_ARCH_SM_TYPE=sm_60 -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3
如果您需要更多模拟细节,请告诉我。 非常感谢你。
带着许多感谢和祝福,
诚毅
RelWithDebInfo
模式下也慢得多。 此外,如果 Cuda 启动,则会在执行结束时打印完整的日志。小提示:如果您确切知道将使用哪种模式,则指定-DSOLVER_DIM_MODES
会更快(在编译和执行方面)。 默认情况下,所有模式都编译成二进制文件,这在 Cuda 构建的情况下会显着增加编译时间。 在你的情况下-DSOLVER_DIM_MODES=DIM3
就足够了。
但是,在具有共享内存的系统上,根本不需要共享操作(线程同步除外)。 这就是为什么 OpenMP 在此处比 MPI 更适用的原因,基于 MPI 的程序不会显示出最佳的加速。 不幸的是,fdtd3d 还不支持 OpenMP。
考虑到这一切,fdtd3d 中仍有一些需要调整的地方。
-DPARALLEL_BUFFER_DIMENSION=xyz
更改它,这将在所有维度的块之间划分网格。 检查 fdtd3d 输出,因为它会建议最佳虚拟拓扑。--buffer-size B
设置,共享操作只会在每B
步执行。 在这种情况下,fdtd3d 建议的最优虚拟拓扑不能保证是最优的。 但是您可以使用--manual-topology --topology-sizex X --topology-sizey Y --topology-sizez Z
手动设置虚拟拓扑。请注意,当进程数不是网格整体大小的除数时,fdtd3d 建议的最佳虚拟拓扑也不能保证是最佳的。
感谢您的及时回复。
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVALUE_TYPE=f -DPRINT_MESSAGE=ON -DCUDA_ENABLED=ON -DCXX11_ENABLED=ON -DPARALLEL_GRID=ON -DPARALLEL_GRID_DIMENSION=3 -DSOLVER_DIM_MODES=DIM3 -DPARALLEL_BUFFER_DIMENSION=x
它在我的工作站上工作。 (顺便说一句,我的工作站有四个 Tesla P100,其中的拱门应该是 SM_60)
mpiexec --mca btl ^openib -n 2 ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
--use-cuda
--cuda-buffer-size 2
--buffer-size 2
--cuda-gpus 0,1
--num-cuda-threads-x 4
--num-cuda-threads-y 4
--num-cuda-threads-z 4
出现错误,如图:
Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at /home/t00540502/fdtd3d/Source/Scheme/InternalScheme.inc.h:912
*** FAILED - ABORTING
-------------------------------------------------------
Primary job terminated normally, but 1 process returned
a non-zero exit code.. Per user-direction, the job has been aborted.
第一步似乎很好,但在第二步中调用的函数InternalSchemeKernelHelpers::calculateFieldStepIterationKernel
有问题。 我想知道我在使用 MPI+CUDA 时一定犯了一些错误。 你能教我如何正确称呼它吗?
非常感谢。
最好的
可能sm_60 arch有问题,我没有测试过。 默认拱门是 sm_20,所以它应该适用于您的卡片。 但是,有时我会看到illegal memory access
当 cuda arch 与 GPU 的计算能力不匹配时。
多 GPU 计算的适用性有限。 如果所有数据都适合单个 GPU 的内存,那么在单个计算节点上在单个 GPU 上执行计算会快得多(因为 CPU/GPU 之间以及不同计算节点之间不会有中间数据共享)。
但是当网格非常大并且无法位于单个计算节点的内存中时,别无选择,只能使用多个计算节点,每个计算节点可能都有一个 GPU。 在这种情况下,CPU-GPU 和 CPU-CPU 数据共享将执行每个B
步骤,默认B=1
。 这比单个 GPU 上所有时间步的简单计算要慢得多。
fdtd3d 尚未完全支持多 GPU 计算,因为目前 fdtd3d 依赖于用户来确保所有数据都适合它应该适合的位置(以及仅在 CPU 模式下)。 所以,有了这样的限制,它应该可以工作。
@solotcy存在未设置拱门的错误(请参阅#140)。 请在该 PR 上与 sm_60 核对。
Illegal memory access
与访问全局变量 cudaSolverSettings 相关,该变量位于设备内存中(参见INTERNAL_SCHEME_BASE<Type, TCoord, layout_type>::calculateFieldStepIteration
):
if (SOLVER_SETTINGS.getDoUseTFSF ())
在我测试过 fdtd3d 的 3 个具有相同计算能力 sm_35 的 GPU 中的 2 个上,一切正常(所有 GPU 都是不同的型号)。 然而,由于某种原因,当输入getDoUseTFSF
方法时,cudaSolverSettings 变为 NULL(即,此 ptr 为 NULL)。 我无法理解为什么会发生这种情况,但据我发现这可能是由于设备故障而发生的。
看起来您至少能够在 4 个 GPU 中的一个上成功启动 fdtd3d。 分别在每个 GPU 上尝试仅 GPU 模式。 因为您的所有 4 个 GPU 都完全相同,所以 fdtd3d 行为应该没有任何区别。 如果存在差异,则设备故障的原因变得更有可能。
非常感谢您的回复。
我检查了 PR #140 并重建 fdtd3d 并添加了标志 -DCUDA_ARCH_SM_TYPE=sm_60。 不幸的是,同样的问题发生了。
但是,正如您所提到的,当我在单 GPU 模式下切换不同的 GPU 时遇到了同样的错误。 这不是第一步,而是第二步,和以前一样,
Estimated current size: 1437644553 byte.
Setup blocks:
blockCount:
Coord (X : 1.000000, Y : 1.000000, Z : 1.000000).
blockSize:
Coord (X : 200.000000, Y : 200.000000, Z : 200.000000).
Calculating time step 0...
Calculating time step 1...
Fatal error: an illegal memory access was encountered at ~/fdtd3d/Source/Scheme/InternalScheme.inc.h:912
事情变得有点奇怪,因为它只在第一个 GPU 上工作。 对于其他三个,它都失败了并且具有相同的错误信息。
感谢您的测试! 我终于能够弄清楚这个问题的核心原因。 PR #141 解决了这个问题。 现在 fdtd3d 应该可以在所有 GPU 上运行。 多 GPU 模式现在似乎也可以工作。
感谢您的回复和修改后的代码。 我已经能够在我的工作站上使用任意数量的 GPU 运行该程序。 然后我可以测试 CPU 和 GPU 的可扩展性。
挺好看的,谢谢!!!
如果有更多问题,请随时重新打开此问题。