【问题标题】:not able to use cudaMemcpy with openacc无法将 cudaMemcpy 与 openacc 一起使用
【发布时间】:2018-05-12 02:28:17
【问题描述】:

我有以下代码

const int GL=100000;
Particle particles[GL];
int cp01[2][GL];
#pragma acc declare create(particles,cp01)
...

我从主人那里打电话

#pragma acc update self(cp01)
#pragma acc host_data use_device(particles) 
{ 
  cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1][0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice); 
}  

遵循建议 (use memcpy for device arrays in openacc)。 我使用标题

#include <cuda_runtime.h>

使用 cudaMemcpy() 并将项目构建为

cmake ../src -DCMAKE_CXX_COMPILER=pgc++ -DCMAKE_CXX_FLAGS="-acc -Minfo=all"

但是编译器给出了

CMakeFiles/AOS_GPU_LIFE.dir/nbody.cpp.o: In function `function_device()':
/home/70-gaa/source/GPU/AOS_GPU_LIFE_map_sort_new/nbody.cpp:175: undefined reference to `cudaMemcpy'
pgacclnk: child process exit status 1: /usr/bin/ld
CMakeFiles/AOS_GPU_LIFE.dir/build.make:94: recipe for target 'AOS_GPU_LIFE' failed
make[2]: *** [AOS_GPU_LIFE] Error 2
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/AOS_GPU_LIFE.dir/all' failed
make[1]: *** [CMakeFiles/AOS_GPU_LIFE.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

第 175 行是带有 cudaMemcpy 的行。如果我添加编译器参数“-Mcuda=8.0”,程序会编译并链接,但是当我启动它时,它只是挂起,控制台行没有输出。可能是,我没有正确链接一些 cuda 库? 我的编译器是 x86-64 Linux -tp sandybridge 上的 pgc++ 17.4-0 64 位目标。 我打开了一个新主题,因为无法将评论中的代码发布到上一个主题。请帮我解决这个问题。

【问题讨论】:

  • 链接错误是因为您缺少链接行上的 CUDA 运行时库,这些库是在添加标志“-Mcuda=8.0”时引入的。至于挂起,我不确定。您可以设置环境变量“PGI_ACC_DEBUG=1”来查看所有 OpenACC 运行时调用,这可能有助于显示挂起发生的位置。如果它挂在 cudaMemcpy 中,那么我会检查“cp”和“cp1”的值。如果您无法弄清楚,我需要一个复制示例来提供帮助。

标签: openacc


【解决方案1】:

Andrey 向我发送了代码,当在“host_data”区域中使用“declare”指令中使用的变量并添加“-Mcuda”选项时,这似乎是编译器问题。我已就这些问题向 PGI 编译器团队提交了问题报告(TPR #24968 和 #24969)。解决方法是将这些变量放在“数据”区域而不是“声明”指令中。

【讨论】:

    猜你喜欢
    • 2014-02-27
    • 2017-03-07
    • 2013-07-30
    • 2014-11-23
    • 2020-06-05
    • 2017-01-09
    • 2023-04-10
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多