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