无法在openacc中使用cudaMemcpy

时间:2017-11-28 15:11:41

标签: openacc

我有以下代码

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位目标。 我打开了一个新主题,因为无法将评论中的代码发布到上一个主题。请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

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