我如何知道cudaMemcpyAsync已完成读取主机内存?

时间:2017-03-10 13:26:16

标签: cuda

例如......这是我在NVIDIA的文档中看到的内容:

cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0);
kernel<<<grid, block>>>(a_d);
cpuFunction();

让我们说这是一个功能......

void consume() {
  cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0);
  kernel<<<grid, block>>>(a_d);
}

如果我还有一个功能

怎么办?
void produce() {
  // do stuff
  a_h[0] = 1;
  a_h[1] = 3;
  a_h[2] = 5;
  //...
}

如果我打电话:

produce();
consume();
produce(); // problem??

第二个产品()将开始在a_h

更改主机上的内存

我怎么知道CUDA在异步内存复制例程中还没有读取主机内存?

如何在不中断异步内存副本的情况下安全地写入主机a_h内存?

EDIT ---

我知道我可以致电cudaDeviceSynchronize()cudaStreamSynchronize(),但也会等待kernel完成。我宁愿不等到kernel完成。

我想尽快写信给主持人a_h,而不是等待kernel完成。

1 个答案:

答案 0 :(得分:5)

如果您使用流进行cudaMemcpyAsync调用,则可以在异步传输后将事件插入流中,然后使用cudaEventSynchronize同步该事件。这可以保证副本已经完成,但不依赖于设备空闲或流是空的。