在 openacc 中将 memcpy 用于设备阵列

Posted

技术标签:

【中文标题】在 openacc 中将 memcpy 用于设备阵列【英文标题】:use memcpy for device arrays in openacc 【发布时间】:2018-05-06 10:41:22 【问题描述】:

请帮忙。 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】:

由于“cudaMemcpy”是您要在其中传递设备指针的主机端调用,因此您需要使用“host_data”指令。无需复制“cp”,因为您需要使用主机值。还要确保“cp01”的主机值是最新的。

类似于以下内容:

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

【讨论】:

以上是关于在 openacc 中将 memcpy 用于设备阵列的主要内容,如果未能解决你的问题,请参考以下文章

设备上的 OpenACC 重复数组

哪个 OpenACC 指令将告诉编译器仅在设备上执行语句?

在 OpenCL 上使用 OpenACC?

OpenACC nvlink 未定义类的引用

linux下,设备DMA数据至0xF0000000,使用mmap映射,然后memcpy,效率相当低,16M需要400ms,有办法提高?

64 位编译器中的 Memcpy 问题