-2

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

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

2-其次,代码中有两个功能可以通过输入终端上的程序来启用。因此,要么 要么F1运行F2基于输入标志。

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

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

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

任何想法可能有什么问题,F2甚至是build process什么?

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

4

1 回答 1

0

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

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

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

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

好的,这意味着您遇到了主机或设备数据未更新的同步问题。我假设您使用的是非结构化数据区域或跨越多个计算区域的结构区域。在这种情况下,在同步主机和设备副本的每个计算区域之前和之后放置“更新”指令。接下来系统地删除每个变量。如果失败,请将其保留在更新中。最后,一旦您知道哪些变量导致问题,跟踪它们的使用并使用更新指令和/或添加更多计算区域。

于 2017-01-05T21:07:44.623 回答