2012-07-23 52 views
4

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

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

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

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

VS

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

我如何知道哪些呼叫是阻塞的,哪些不是?我在库描述中没有看到任何说“我是阻塞API调用”的东西。即,在cudaMemcpy描述中没有提及阻塞。 (也许我在找错地方?) – Doug 2012-07-23 22:15:49

回答

5

你的例子是等价的。如果你想异步执行,你可以使用流或上下文和cudaMemcpyAsync,这样你就可以将执行与拷贝重叠。

+0

cudaMemcpy在其复制操作之前是否提供了阻塞,然后呢?即我知道在复制操作开始之前内核已经完成吗?还是在复制操作的“结束”时发出阻止信号,表示内核已完成且复制完成? – Doug 2012-07-23 21:52:21

+0

单个流中的操作不会重叠(它们始终以串行方式执行)。因此,在单个流中,memcpy/asyncMemcpy/kernels将在所有先前操作(内核或其他memcpys)完成后启动。 – 2012-12-16 08:07:43

2

根据NVIDIA的编程指南:

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

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

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