cudaMemcpy&闭塞

时间:2012-07-23 19:33:34

标签: cuda

我对一些关于阻止和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);

2 个答案:

答案 0 :(得分:7)

您的示例是等效的。如果您想要异步执行,可以使用流或上下文和cudaMemcpyAsync,这样就可以将执行与副本重叠。

答案 1 :(得分:3)

根据NVIDIA编程指南:

  

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

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

因此,只要您的传输大小超过64KB,您的示例就相同。