我试着搜索类似的问题,但找不到一个,虽然有一对夫妇有一个类似的标题。CUDA在相同的参数上多次调用内核函数
我对主机像这样的代码:
handle_error(cudaMalloc((void**)&ret_dev, FLOAT_SIZE*no_kstrings*M));
for(int div=0;div<no_kstrings/threads;div++){
kernel<<<grid_dim,block_dim>>>(ret_dev, v_freq_vectors, &no_kstrings[threads]);
handle_error(cudaMemcpy(&exp_freq[threads], ret_dev, FLOAT_SIZE*threads*M,
cudaMemcpyDeviceToHost));
}
基本上我有运行在循环中的代码为最大无的倍数。每块的线程数。内核函数只是做一些事情,并将数据放入ret_dev
。所以我想知道,在每次迭代之后我需要做cudaMemcpy()
还是我可以在循环之外做到这一点?事情是这样的:
handle_error(cudaMalloc((void**)&ret_dev, FLOAT_SIZE*no_kstrings*M));
for(int div=0;div<no_kstrings/threads;div++){
kernel<<<grid_dim,block_dim>>>(ret_dev, v_freq_vectors, &no_kstrings[threads]);
}
handle_error(cudaMemcpy(exp_freq, ret_dev, FLOAT_SIZE*no_kstrings*M,
cudaMemcpyDeviceToHost));
我想我要问的是什么,莫非是调用内核函数论腐败在某种程度上这些参数相同的参数多次?
由于
你是否反转了你发布的两个代码示例? – talonmies
如果您正在将数据写入'ret_dev'的相同位置,则下一次内核调用将覆盖先前的数据。所以是的,你必须在每次迭代中复制数据。 – sgarizvi
好吧,因为我不是在'ret_dev'的同一位置上写的,所以我不需要在每次迭代中都复制它,对吧? – vegeta