openacc - ta=multicore 和 ta=nvidia 编译之间的差异

openacc - discrepancies between ta=multicore and ta=nvidia compilation

我有一段代码最初是用OpenMP写的。现在,我想将它迁移到 OpenACC。考虑以下:

1-首先,OpenMP的输出结果被认为是最终结果,OpenACC输出应该跟随它们。

2- 其次,代码中有 2 个函数是通过在终端上输入程序启用的。因此,F1F2 根据输入标志运行。

因此,如前所述,我将我的代码转移到了 OpenACC。现在,我可以使用 -ta=multicore-ta=nvidia 编译我的 OpenACC 代码,为不同的架构编译 OpenACC 区域。

对于F1,两种架构的输出都与OpenMP相同。所以,这意味着当我用 -ta=multicore-ta=nvidia 编译我的程序时,我得到正确的输出结果,类似于选择 F1 时的 OpenMP。

对于F2,有点不同。用 -ta=multicore 编译给我一个与 OpenMP 一样的正确输出,但同样的事情不会发生在 nvidia 架构上。当我用 -ta=nvidia 编译我的代码时,结果是错误的。

知道 F2 甚至 build process 有什么问题吗?

注意:我使用的是 PGI 编译器 16,我的 NVIDIA GPU 的 CC 等于 5.2。

两种架构之间存在一些差异的原因是主机和设备之间的数据传输不正确。在某些时候,主机需要一些阵列来重新分配数据。

感谢 Mat Colgrove 的评论,我找到了罪魁祸首数组并通过正确传输解决了问题。

起初,我启用了统一内存(-ta=nvidia:managed)以确保我的算法没有错误。这对我帮助很大。因此,我删除了 managed 以调查我的代码并找到导致问题的数组。

然后,我根据 Mat 的评论(超级有帮助)遵循了以下程序:

Ok, so that means that you have a synchronization issue where either the host or device data isn't getting updated. I'm assuming that you are using unstructured data regions or a structure region that spans across multiple compute regions. In this case, put "update" directives before and after each compute region synchronizing the host and device copies. Next systematically remove each variable. If it fails, keep it in the update. Finally, once you know which variables are causing the problems, track their use and either use the update directive and/or add more compute regions.