首先,您需要声明指向将从 CPU 复制到 GPU 的数据的指针。在上面的示例中,我们要将数组复制original_cpu_array
到 CUDA 全局内存中。
int original_cpu_array[array_size];
int *array_cuda;
计算数据将占用的内存大小。
int size = array_size * sizeof(int);
Cuda内存分配:
msg_erro[0] = cudaMalloc((void **)&array_cuda,size);
从 CPU 复制到 GPU:
msg_erro[0] = cudaMemcpy(array_cuda, original_cpu_array,size,cudaMemcpyHostToDevice);
执行内核
从 GPU 复制到 CPU:
msg_erro[0] = cudaMemcpy(original_cpu_array,array_cuda,size,cudaMemcpyDeviceToHost);
空闲内存:
cudaFree(array_cuda);
出于调试原因,我通常将函数调用的状态保存在一个数组中。(例如, cudaError_t msg_erro[var];
)。这不是绝对必要的,但如果在分配和内存转移过程中发生错误,它将为您节省一些时间。
如果确实发生错误,我会使用如下函数打印它们:
void printErros(cudaError_t *erros,int size, int flag)
{
for(int i = 0; i < size; i++)
if(erros[i] != 0)
{
if(flag == 0) printf("Alocacao de memoria");
if(flag == 1) printf("CPU -> GPU ");
if(flag == 2) printf("GPU -> CPU ");
printf("{%d} => %s\n",i ,cudaGetErrorString(erros[i]));
}
}
该标志主要用于指示代码中发生错误的部分。例如,在内存分配之后:
msg_erro[0] = cudaMalloc((void **)&array_cuda,size);
printErros(msg_erro,msg_erro_size, 0);