CUDA在同一参数上多次调用内核函数

CUDA在同一参数上多次调用内核函数,cuda,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, &

我试着搜索一个类似的问题,但找不到一个,尽管有两个问题的标题相似

我在主机上有如下代码:

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));
}
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上排队并连续执行。memcpy调用也是如此。这些内核和memcpy调用的顺序将被保留。此外,内核参数始终按值传递,以后更改值不会损坏已调度的调用,即使它尚未启动

在本例中,是否可以将memcpy移出循环取决于内核的功能。如果所有内核都处理自己的数据块,那么在启动所有内核之后,您应该可以很好地复制回结果。在这种情况下,您可能需要检查算法是否需要全局同步,因为如果不需要,您可以通过在内核中移动for循环来获得很多速度


如果内核在所有数据上工作,并且需要在特定的时间保存它,您仍然可以考虑在GPU上分配一个额外的结果数组,并将其复制到内核中。这也应该比在循环中执行memcpy快得多。

您是否反转了发布的两个代码示例?如果您正在将数据写入
ret\u dev
的相同位置,则下一个内核调用将覆盖以前的数据。是的,你必须在每次迭代中复制数据。好吧,因为我在
ret_dev
中不是在同一个位置上写的,所以我不需要在每次迭代中复制数据,对吗?@talonmes:我确实尝试了这两种方法,现在我看到了相同的结果,但我想可能有一些问题…@user1961040:我的意思是在你的问题中“循环外”代码在循环内有一个memcpy,“循环内”代码在循环外有一个memcpy