5

我对一些关于阻塞和 cudaMemcpy 的评论感到困惑。据我了解,Fermi HW 可以同时执行内核并执行 cudaMemcpy。

我读到 Lib func cudaMemcpy() 是一个阻塞函数。这是否意味着 func 将阻止进一步执行,直到副本完全完成?或者这是否意味着在先前的内核完成之前不会开始复制?

例如,此代码是否提供相同的阻塞操作?

SomeCudaCall<<<25,34>>>(someData);
cudaThreadSynchronize();

对比

SomeCudaCall<<<25,34>>>(someParam);
cudaMemcpy(toHere, fromHere, sizeof(int), cudaMemcpyHostToDevice);
4

2 回答 2

7

你的例子是等价的。如果您想要异步执行,您可以使用流或上下文和cudaMemcpyAsync,以便您可以将执行与复制重叠。

于 2012-07-23T19:49:07.900 回答
5

根据 NVIDIA 编程指南:

为了便于主机和设备之间的并发执行,一些函数调用是异步的:在设备完成请求的任务之前,控制权被返回给主机线程。这些是:

  • 内核启动;
  • 两个地址之间的内存复制到同一个设备内存;
  • 从主机到设备的内存复制 64 KB 或更少的内存块;
  • 由以 Async 为后缀的函数执行的内存拷贝;
  • 内存设置函数调用。

因此,只要您的传输大小大于 64KB,您的示例就是等效的。

于 2013-04-12T09:21:04.113 回答