Fdtd3d: 并行计算中的问题

创建于 2020-01-08  ·  9评论  ·  资料来源: zer011b/fdtd3d

嗨格列布,

我是成毅感谢您开发这个宏伟的项目。 这对研究FDTD及其并发性非常有帮助。 但是我在使用 MPI/GPU 计算时遇到了一些问题。

  1. 问题是当我使用以下命令调用 fdtd3d 代码时,
    ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    在其中我通过插入以下代码基于“vacuum3D.txt”创建了“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

  1. 另外,当我用MPI模拟“vacuum3D.txt”时,fdtd3d呈现的可扩展性不是很理想。 例如,网格大小是 40 x 40 x 40 等于 64000。我有一个芯片,它有 18 个内核。 当它与 1 个进程一起使用时,它将花费 67.74 秒,启用 8 个处理器时将花费大约 11.34 秒。 加速比约为 6。当我应用更多处理器(如 18)时,时间减少是微不足道的,比如从 11.34 秒到 9.6 秒。 这合理吗? 请问是否有可以调整并行计算性能的模拟配置?

如果您需要更多模拟细节,请告诉我。 非常感谢你。

带着许多感谢和祝福,
诚毅

Question

所有9条评论

  1. 我不认为它卡住了,它只是执行计算,即使在RelWithDebInfo模式下也慢得多。 此外,如果 Cuda 启动,则会在执行结束时打印完整的日志。

小提示:如果您确切知道将使用哪种模式,则指定-DSOLVER_DIM_MODES会更快(在编译和执行方面)。 默认情况下,所有模式都编译成二进制文件,这在 Cuda 构建的情况下会显着增加编译时间。 在你的情况下-DSOLVER_DIM_MODES=DIM3就足够了。

  1. 这里有几件事要记住。 首先,每个时间步的总执行时间是计算时间和共享时间的总和。 当网格相对较小时,例如您的情况,共享时间可能很重要,并且需要仔细选择虚拟拓扑(fdtd3d 在其输出中显示指定网格大小的最佳虚拟拓扑)。

但是,在具有共享内存的系统上,根本不需要共享操作(线程同步除外)。 这就是为什么 OpenMP 在此处比 MPI 更适用的原因,基于 MPI 的程序不会显示出最佳的加速。 不幸的是,fdtd3d 还不支持 OpenMP。

考虑到这一切,fdtd3d 中仍有一些需要调整的地方。

  • 默认情况下,只有 Ox 轴分布在计算节点之间,但您可以使用-DPARALLEL_BUFFER_DIMENSION=xyz更改它,这将在所有维度的块之间划分网格。 检查 fdtd3d 输出,因为它会建议最佳虚拟拓扑。
  • 缓冲区的大小可以用--buffer-size B设置,共享操作只会在每B步执行。 在这种情况下,fdtd3d 建议的最优虚拟拓扑不能保证是最优的。 但是您可以使用--manual-topology --topology-sizex X --topology-sizey Y --topology-sizez Z手动设置虚拟拓扑。

请注意,当进程数不是网格整体大小的除数时,fdtd3d 建议的最佳虚拟拓扑也不能保证是最佳的。

感谢您的及时回复。

  1. 至于单 GPU 计算,我用以下标志重新制作了 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)

  1. 当我想启用多 GPU 计算时
    mpiexec --mca btl ^openib -n 2 ./Release/Source/fdtd3d --cmd-from-file ./Examples/vacuum3D_test.txt
    和 CUDA cmds
--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 的可扩展性。
挺好看的,谢谢!!!

如果有更多问题,请随时重新打开此问题。

此页面是否有帮助?
0 / 5 - 0 等级