在openacc中使用memcpy设备数组

时间:2017-11-22 15:57:48

标签: openacc

请帮忙。 1)我需要使用memcpy来移动在gpu上分配的数组。我不能使用std :: memcpy,因为它"没有acc例程" (编译器输出)。我的代码是

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

我读到cudaMemcpy可以与openacc一起使用。在function_device()(not able to fill the array allocated on the gpu)中,我从主机调用

#pragma acc data copy(cp)
{
  cudaMemcpy(&particles[cp01[0][0]],&particles[cp01[1][0]],cp*sizeof(Particle),cudaMemcpyDeviceToDevice);
}

我使用标题

#include <cuda_runtime.h>

使用CUDA。并将项目构建为

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

程序编译但不起作用,它在控制台行中没有输出而挂起。 如何移动设备上分配的数组(使用cudaMemcpy或其他方式)?这个包含足够使用CUDA吗?我是否正确构建项目(使用-Mcuda = llvm是否必要)? 2)我还有另一个问题:如果写一个

#pragma acc parallel loop
for(int i=0; i<N; ++i)
{...}

变量N必须仅在主机上分配,还是也可能在gpu上?

1 个答案:

答案 0 :(得分:0)

自&#34; cudaMemcpy&#34;是一个主机端调用,你想传入设备指针,你想要使用&#34; host_data&#34;指示。无需复制&#34; cp&#34;因为您想要使用主机值。还要确保&#34; cp01&#34;的主机值。是最新的。

如下所示:

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