【发布时间】:2018-02-21 13:07:29
【问题描述】:
我尝试搜索一个类似的问题,但找不到一个,尽管有几个标题相似。
我在主机上有类似这样的代码:
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));
我想我想问的是,对同一个参数多次调用内核函数是否会以某种方式破坏这些参数?
谢谢
【问题讨论】:
-
您是否将您发布的两个代码示例颠倒过来?
-
如果你正在将数据写入
ret_dev的相同位置,那么下一次内核调用将覆盖之前的数据。所以是的,你必须在每次迭代中复制数据。 -
好的,因为我没有写在
ret_dev的同一个位置,所以我不需要在每次迭代中复制它,对吧? -
@talonmies:我都试过了,现在我看到了相同的结果,但我想知道可能会有一些问题......
-
@user1961040:我的意思是,在你的问题中,“循环外”代码在循环内有一个 memcpy,而“循环内”在循环外有一个 memcpy
标签: cuda