在 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 用于设备阵列的主要内容,如果未能解决你的问题,请参考以下文章
linux下,设备DMA数据至0xF0000000,使用mmap映射,然后memcpy,效率相当低,16M需要400ms,有办法提高?