2012-09-24 55 views
1

我正在使用我的GPU与CPU同时运行。当我剖析内存传输时,我发现cuBLAS中的异步调用不会异步执行。异步CUDA传输调用不是异步运行

我有代码,不会像下面

cudaEvent_t event; 
cudaEventCreate(&event); 
// time-point A 
cublasSetVectorAsync(n, elemSize, x, incx, y, incy, 0); 
cudaEventRecord(event); 
// time-point B 
cudaEventSynchronize(event); 
// time-point C 

我使用sys/time.h剖析(被遗漏为清楚起见代码)。我发现cublasSetVectorAsync调用时间占主导地位,就好像它是同步行为一样。即持续时间A-B比持续时间B-C长得多,并且随着我增加传送的大小而增加。

这有什么可能的原因?有什么环境变量需要设置某处或需要使用更新的驱动程序?

我使用的GeForce GTX 285在CUDA编译工具,4.1版,V0.2.1221

+0

确定,传递一个空流不使操作同步? –

+0

@JoachimIsaksson我检查了这一点,不,0是默认流,它应该仍然是异步的,CUDA C编程指南的第3.2.5.5.2节 – MRocklin

+0

这是您的真实代码吗?您没有任何代码这里的cublasSetVectorAsync函数重叠,你所做的就是调用一个异步函数,然后同步它('cudaEventSynchronize')。这甚至没有提到你在默认流中做所有事情的事实,除了内核启动(相对于调用主机线程),所有内容都是同步的。您发布的代码中没有内核启动。 – harrism

回答

2

cublasSetVectorAsync是围绕cudaMemcpyAsync的薄包装。不幸的是,在某些情况下,这个函数的名称是不恰当的,正如在this page from the CUDA reference manual上解释的那样。

值得注意的是:

对于从可分页主机存储器设备的存储器传输,开始复制之前执行流同步。一旦可分页缓冲区已被复制到暂存存储器以便将DMA传输到设备内存,该功能将返回,但是到最终目的地的DMA可能尚未完成。

而且

对于从可分页主机存储器设备的存储器传输,主机存储器被复制到立即的暂存缓冲器(不执行装置同步)。一旦可分页缓冲区被复制到分段存储器,函数将返回。到最终目的地的DMA传输可能尚未完成。

所以问题的解决方案是可能只是分配x,主机数据阵列,使用cudaHostAlloc,而不是标准malloc(或C++ new)。

或者,如果您的GPU和CUDA版本支持它,您可以使用malloc,然后在malloc -ed指针上调用cudaHostRegister。注意在文档中,你必须为了创建具有cudaDeviceMapHost标志的CUDA上下文cudaHostRegister产生任何影响的情况(见文档cudaSetDeviceFlags

+0

好的回答@harrism。为了确保我明白'cudaHostAlloc'分配给不需要同步分段操作的固定内存。使用cudaHostAlloc和固定内存是否有任何限制? – MRocklin

+1

谢谢。没错:GPU可以直接从固定内存进行DMA,但不能分页内存。因此,如果您使用可分页的主机内存,驱动程序必须将数据复制到主机上的固定暂存缓冲区,这意味着额外的CPU端memcpy,其性能取决于CPU,系统RAM和芯片组。至于限制,请参阅[这个答案](http://stackoverflow.com/questions/12439807/pinned-memory-in-cuda)。 – harrism

+0

再次感谢。这可能是我收到的最有用和最完整的答案。 – MRocklin

-1

在CUBLAS/cuSPARSE,事情发生在流0,如果你不指定一个不同的数据流。要指定一个流,你必须使用cublasSetStream(参见cuBLAS文档)。

+0

我的理解是,流是用于GPU内的并发。我相信即使我把所有的东西放在流0上,GPU-CPU的交互仍然是并发的,GPU内核调用不会阻塞CPU。我的理解不正确? – MRocklin

+0

cuBlasSetVector不调用任何CUDA内核。它只是调用cudaMemcpyAsync,如果它在默认流零流上调用,它是同步的。 – harrism

+1

@harrism“'cudaMemcpyAsync()'与主机是异步的,所以调用可能会在复制完成之前返回....副本可以选择性地关联到流... [if]流是非-zero,副本可能与其他流中的操作重叠。“--CUDA开发人员文档http://goo.gl/fXDl8我对GPU内部的并发性不感兴趣。我只对Host-Device并发感兴趣。 – MRocklin