cudaMemcpy和阻止

Dou*_*oug 5 cuda

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

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

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

SomeCudaCall<<<25,34>>>(someData);
cudaThreadSynchronize();
Run Code Online (Sandbox Code Playgroud)

VS

SomeCudaCall<<<25,34>>>(someParam);
cudaMemcpy(toHere, fromHere, sizeof(int), cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

per*_*eal 7

你的例子是等价的.如果要进行异步执行,可以使用流或上下文和cudaMemcpyAsync,这样就可以将执行与副本重叠.

  • 单个流中的操作不重叠(它们总是串行执行)。因此,在单个流中 memcpy/asyncMemcpy/kernels 将在所有先前操作(内核或其他 memcpys)完成后启动。 (2认同)

Luc*_*Luc 5

根据 NVIDIA 编程指南:

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

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

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