0

我想在以下方面得到一些帮助。

我有一个以数组作为输入的内核函数,在计算后,其中一个数组会更改其值。我将其命名为 dev_array。

我希望 dev_array 再次用作我的内核计算的输入大约 80 次,这样我就可以得到 dev_array 的正确结果,稍后在我的 main 中使用它。

我怎样才能做到这一点?我已经尝试在线程条件之前在内核中使用循环。

while(i<80){
   i++;
  if(tidx<N){`
  //calculating dev_array then using it again at the beginning of while
}
}

但它没有用。它看起来像是在一个无限循环中。

从 main 调用内核 80 次并一直进行内存复制并不令人满意。

while(i<80){
i++;
cudaMemcpy(dev_array,cudaMemcpyHostToDevice);
kernel<<<grid,block>>>(dev_array);
cudaMemcpy(dev_array,cudaMemcpyDeviceToHost);
}

感谢您的任何帮助

4

1 回答 1

1

你不必一直memcopy。内核执行后,数据保留在设备内存中,并且dev_array指针始终指向正确的点。

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

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

如果您可以设法在内核中进行同步并使用for循环,那么只有当您使用__shared__内存并且您可以避免一直读取和复制到(较慢的)全局内存时,它才会更快。但是如果你想避免读写冲突,没有办法对所有的块设置障碍。只能__syncthreads()用于块的线程。

于 2013-01-18T13:45:16.920 回答