我对一些关于阻止和cudaMemcpy的评论感到困惑。据我所知,Fermi HW可以同时执行内核并执行cudaMemcpy。
我读到Lib func cudaMemcpy()是一个阻塞函数。这是否意味着func将阻止进一步执行,直到副本完全完成?或者这是否意味着在先前的内核完成之前副本才会启动?
e.g。此代码是否提供相同的阻止操作?
SomeCudaCall<<<25,34>>>(someData);
cudaThreadSynchronize();
VS
SomeCudaCall<<<25,34>>>(someParam);
cudaMemcpy(toHere, fromHere, sizeof(int), cudaMemcpyHostToDevice);
答案 0 :(得分:7)
您的示例是等效的。如果您想要异步执行,可以使用流或上下文和cudaMemcpyAsync,这样就可以将执行与副本重叠。
答案 1 :(得分:3)
根据NVIDIA编程指南:
为了便于主机和设备之间的并发执行,某些函数调用是异步的:在设备完成请求的任务之前,控制权返回给主机线程。这些是:
- 内核启动;
- 将两个地址之间的内存复制到同一设备内存;
- 内存副本从64 KB或更小的内存块的主机到设备;
- 由Async;
后缀的函数执行的内存复制- 内存设置功能调用。
因此,只要您的传输大小超过64KB,您的示例就相同。