在我的代码中,我需要调用CUDA内核来并行化一些矩阵计算。但是,这个计算必须迭代完成大约60,000次(内核在60,000次循环内调用for循环)。
这意味着,如果我在每次调用内核时都执行cudaMalloc / cudaMemcpy,那么大部分时间都花在内存分配和传输上,而且我的速度显着减慢。
有没有办法说,在for循环之前分配一块内存,在内核的每次迭代中使用该内存,然后在for循环之后,将该内存从设备复制回主机?
感谢。
答案 0 :(得分:2)
是的,您可以完全按照您的描述进行操作:
int *h_data, *d_data;
cudaMalloc((void **)&d_data, DSIZE*sizeof(int));
h_data = (int *)malloc(DSIZE*sizeof(int));
// fill up h_data[] with data
cudaMemcpy(d_data, h_data, DSIZE*sizeof(int), cudaMemcpyHostToDevice);
for (int i = 0; i < 60000; i++)
my_kernel<<<grid_dim, block_dim>>>(d_data)
cudaMemcpy(h_data, d_data, DSIZE*sizeof(int), cudaMemcpyDeviceToHost);
...