我尝试搜索一个类似的问题,但找不到一个,虽然有一对有类似的标题。
我在主机上有这样的代码:
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));
我想我想问的是,对相同参数多次调用内核函数是否会以某种方式破坏这些参数?
由于
答案 0 :(得分:0)
当您在未指定流的情况下多次启动内核(或多个内核)时,它们将在标准流0上排队并连续执行。 memcpy调用的帐户相同。将保留这些内核和memcpy调用的顺序。此外,内核参数始终按值传递,稍后更改值不会破坏已调度的调用,即使它尚未启动。
在你的情况下,是否能够或不能将memcpy移出循环取决于你的内核做什么。如果所有内核都在自己的数据块上工作,那么在启动所有内核后应该可以很好地复制结果。在这种情况下,您可能想要检查算法是否需要全局同步,因为如果不是,您可以通过在内核中移动for循环来获得大量的速度。
如果您的内核处理所有数据并且您需要在特定时间保存它,您仍然可以考虑在gpu上分配一个额外的结果数组并将其复制到内核中。这也应该比在循环中执行memcpy更快。