我有一些基于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));
}