例如......这是我在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
完成。
答案 0 :(得分:5)
如果您使用流进行cudaMemcpyAsync
调用,则可以在异步传输后将事件插入流中,然后使用cudaEventSynchronize
同步该事件。这可以保证副本已经完成,但不依赖于设备空闲或流是空的。