我有一个最初用OpenMP编写的代码。现在,我想将其迁移到OpenACC。请考虑以下事项:
1-首先,OpenMP的输出结果被视为最终结果,OpenACC输出应该遵循它们。
2-其次,代码中有2个函数通过输入到终端上的程序来启用。因此,基于输入标志运行F1
或F2
。
因此,如前所述,我将代码转移到了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。
答案 0 :(得分:0)
两个体系结构之间存在一些差异的原因是主机和设备之间的数据传输不正确。在某些时候,主机需要一些数组来重新分配数据。
感谢Mat Colgrove的评论,我找到了罪魁祸首阵列并通过正确转移解决了这个问题。
首先,我启用了统一内存(-ta=nvidia:managed
)以确保我的算法没有错误。这对我帮助很大。因此,我删除了managed
以调查我的代码并找到导致问题的数组。
然后,我根据Mat的评论(超级有用)遵循以下程序:
好的,这意味着您遇到了同步问题,其中主机或设备数据未得到更新。我假设您使用的是非结构化数据区域或跨越多个计算区域的结构区域。在这种情况下,在每个计算区域同步主机和设备副本之前和之后放置“update”指令。接下来系统地删除每个变量。如果失败,请将其保留在更新中。最后,一旦您知道哪些变量导致了问题,请跟踪它们的使用情况,并使用更新指令和/或添加更多计算区域。