我想对以下内容提供一些帮助。
我有一个内核函数,它将数组作为输入,在计算之后,其中一个数组会更改其值。我将其称为dev_array。
我希望将dev_array再次用作我内核计算的输入大约80次,这样我就可以得到dev_array的正确结果,后者将在我的主要版本中使用。
我该怎么做? 我已经尝试在线程条件之前在内核中使用循环。
while(i<80){
i++;
if(tidx<N){`
//calculating dev_array then using it again at the beginning of while
}
}
但它没有用。它看起来像是在无限循环中。
从main调用内核80次并且一直在进行memcopying并不令人满意。
while(i<80){
i++;
cudaMemcpy(dev_array,cudaMemcpyHostToDevice);
kernel<<<grid,block>>>(dev_array);
cudaMemcpy(dev_array,cudaMemcpyDeviceToHost);
}
感谢您的帮助
答案 0 :(得分:1)
您无需一直记忆。执行内核后,数据保留在设备内存中,dev_array
指针始终指向正确的点。
您可以循环内核来迭代您想要运行该函数的次数,甚至将结果传递给第二个内核。
一个接一个地调用内核时,可以确保它们在队列中执行并具有所需的同步。当内核属于同一个Cuda 流时,这是有效的。 Here您可以了解有关流及其工作原理的更多信息。
如果你可以管理一种在你的内核中进行同步并使用for
循环的方法,那么只有当你使用__shared__
内存并且你可以避免读取和复制到它时,它会更快。 )全局记忆。但如果你想避免阅读和写作冲突,就没有办法对所有街区设置障碍。
只有__syncthreads()
可用于块中的线程。