多内核调用

时间:2013-01-18 13:34:55

标签: multithreading loops cuda kernel

我想对以下内容提供一些帮助。

我有一个内核函数,它将数组作为输入,在计算之后,其中一个数组会更改其值。我将其称为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);
}

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您无需一直记忆。执行内核后,数据保留在设备内存中,dev_array指针始终指向正确的点。

您可以循环内核来迭代您想要运行该函数的次数,甚至将结果传递给第二个内核。

一个接一个地调用内核时,可以确保它们在队列中执行并具有所需的同步。当内核属于同一个Cuda 时,这是有效的。 Here您可以了解有关流及其工作原理的更多信息。

如果你可以管理一种在你的内核中进行同步并使用for循环的方法,那么只有当你使用__shared__内存并且你可以避免读取和复制到它时,它会更快。 )全局记忆。但如果你想避免阅读和写作冲突,就没有办法对所有街区设置障碍。 只有__syncthreads()可用于块中的线程。