请帮忙。 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上?
答案 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);
}