在cuda编程中记忆多个gpus

时间:2018-01-11 14:26:30

标签: c++ cuda

我有一些基于c ++的cuda代码,适用于单个gpu。但是我的系统上有2个gpu,我想同时使用它们。

查看nvidia's documentation后,在第42页上,我发现此代码在多个gpus上分配内存:

int gpu_A = 0;
int gpu_B = 1;
cudaSetDevice( gpu_A );
cudaMalloc( &d_A, num_bytes);

成功了。所以基于这个逻辑,我试着用于memcopy:

int gpu_A = 0;
int gpu_B = 1;
cudaSetDevice( gpu_A );
cudaMemcpy(gpuPointer, cpuArray, sizeof(int)*number, cudaMemcpyHostToDevice)

这似乎有效。但是后来我发现文档提供了真实的memcopy代码(第18页):

for(int i=0; i<num_gpus-1; i++ )
cudaMemcpy(d_a[i+1], gpu[i+1], d_a[i], gpu[i], num_bytes);

当我尝试编译它时,我得到了

error : argument of type "int" is incompatible with parameter of type "void *"

我在这里搜索了答案库,我发现了一个类似的问题here

这是提供的相关代码:

double *dev_a[2], *dev_b[2], *dev_c[2];
const int Ns[2] = {N/2, N-(N/2)};

// copy the arrays 'a' and 'b' to the GPUs
for(int dev=0,pos=0; dev<2; pos+=Ns[dev], dev++) {
    cudaSetDevice(dev);
    cudaMemcpy( dev_a[dev], a+pos, Ns[dev] * sizeof(double), cudaMemcpyHostToDevice);
    cudaMemcpy( dev_b[dev], b+pos, Ns[dev] * sizeof(double), cudaMemcpyHostToDevice);
}

然而,当我尝试编译它时,我得到了同样的错误。

你应该如何在多个gpus上成功执行memcopy操作?我第一次以正确的方式做到了吗?

我的意思是它似乎有效,但这是最佳做法吗?

编辑--------

提供了简单的完整示例:

int *cpuArray= (int*)malloc(sizeof(int)*720);
int *gpuArray;

// Allocate memory on the GPUs
int dev;
for(dev=0; dev<2; dev++) {
   cudaSetDevice(dev);
   cudaMalloc((void**) &gpuArray, sizeof(int)*720);
}

// copy The array to the GPUs
for(dev=0; dev<2; dev++) {
  cudaSetDevice(dev);
  CUDA_CALL(cudaMemcpy(gpuArray, cpuArray, sizeof(int)*720, cudaMemcpyHostToDevice));
}

0 个答案:

没有答案