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

tms*_*ont 4 cuda

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

cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0);
kernel<<<grid, block>>>(a_d);
cpuFunction();
Run Code Online (Sandbox Code Playgroud)

让我们说这包含在一个函数中......

void consume() {
  cudaMemcpyAsync(a_d, a_h, size, cudaMemcpyHostToDevice, 0);
  kernel<<<grid, block>>>(a_d);
}
Run Code Online (Sandbox Code Playgroud)

如果我也有功能怎么办?

void produce() {
  // do stuff
  a_h[0] = 1;
  a_h[1] = 3;
  a_h[2] = 5;
  //...
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话:

produce();
consume();
produce(); // problem??
Run Code Online (Sandbox Code Playgroud)

第二个产生()将开始改变主机上的内存 a_h

在异步内存复制例程中,如何知道CUDA仍未读取主机内存?

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

编辑 - -

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

我想尽快开始写主持人a_h,而不是等待kernel完成.

tal*_*ies 5

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