Asynchronous 异步CUDA传输调用的行为不异步

Asynchronous 异步CUDA传输调用的行为不异步,asynchronous,cuda,Asynchronous,Cuda,我同时使用我的GPU和我的CPU。当我分析内存传输时,我发现cuBLAS中的异步调用并不异步 我有这样的代码 cudaEvent_t event; cudaEventCreate(&event); // time-point A cublasSetVectorAsync(n, elemSize, x, incx, y, incy, 0); cudaEventRecord(event); // time-point B cudaEventSynchronize(event); // tim

我同时使用我的GPU和我的CPU。当我分析内存传输时,我发现cuBLAS中的异步调用并不异步

我有这样的代码

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长得多,并且随着传输大小的增加而增加

可能的原因是什么?是否需要在某个地方设置一些环境变量或使用更新的驱动程序


我正在cuBLAS/cuSPARSE中使用GeForce GTX 285和Cuda编译工具,版本4.1,版本0.2.1221

,如果不指定其他流,则在流0中会发生一些事情。要指定流,必须使用cublasSetStream(请参阅Cubllas文档)。

cublasSetVectorAsync
是cudaMemcpyAsync的薄型包装。不幸的是,在某些情况下,此函数的名称用词不当,如上所述

值得注意的是:

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

对于从可分页主机内存到设备内存的传输,主机内存会立即复制到暂存缓冲区(不执行设备同步)。将可分页缓冲区复制到暂存内存后,该函数将返回。到最终目的地的DMA传输可能尚未完成

<> p>因此,对您的问题的解决方案可能只分配“<代码> x>代码>,您的主机数据数组,使用而不是标准<代码> Malc C < /C> >(或C++ <代码>新< /COD>)。p>
或者,如果您的GPU和CUDA版本支持它,您可以使用
malloc
,然后调用
malloc
-ed指针。请注意文档中的条件,即必须使用
cudadeviecemapost
标志创建CUDA上下文,才能使
cudahosterregister
生效(请参阅文档。

您确定传入空流不会使操作同步吗?@JoachimIsaksson我检查了这一点,没有,0是默认流。它应该仍然是异步的。CUDA C编程指南的第3.2.5.5.2节。这是您的真实代码吗?这里没有CublassetVector异步的东西重叠。您所要做的就是调用一个异步函数,然后对其进行同步(
cudaEventSynchronize
)。这甚至没有提到您在默认流中执行所有操作的事实,在默认流中,除了内核启动外,所有操作都是同步的(相对于调用主机线程)。您发布的代码中没有内核启动。@harrism我真正的代码比这更复杂。这是我能想到的最简单的例子,它清楚地说明了这个问题。我只对主机和设备之间的异步性感兴趣,所以我不认为流是一个问题。我同意这段代码不测试内部的并发性GPU。我的错。你当然是对的。让我试着帮点忙吧……我会问CUBLAS团队这是否正确,但我的建议是,由于cudaMemcpyAsync需要固定主机内存,那么你需要使用cudaHostAlloc分配主机内存,该内存输入到cublasSetVectorAsync。否则,它将不得不复制到固定主机上区域本身(主持人memcpy)在复制到设备之前,这将解释您看到的行为。我的理解是,流用于GPU内的并发。我相信,即使我将所有内容都放在流0上,GPU-CPU交互仍将是并发的,GPU内核调用不会阻塞CPU。我的理解不正确吗?cuBlasSetVector没有t调用任何CUDA内核。它只调用cudaMemcpyAsync,如果在默认流零上调用它,则它是同步的。@harrism“
cudaMemcpyAsync()
对于主机是异步的,因此在复制完成之前,调用可能会返回……可以选择将复制与流相关联…[如果]流为非零,副本可能与其他流中的操作重叠。“--CUDA开发人员文档我对GPU内的并发性不感兴趣。我只对主机设备并发性感兴趣。正确。请参阅我的“我的坏”评论你的问题。回答得好@harrism。为了确保我理解
cudaHostAlloc
分配给不需要同步暂存操作的固定内存。使用cudaHostAlloc和固定内存有什么限制吗?谢谢。没错:GPU可以直接从固定内存进行DMA,但不能从可分页内存进行DMA。如果你需要的话在可分页主机内存中,驱动程序必须将数据复制到主机上的固定暂存缓冲区中,这意味着一个额外的CPU端memcpy,其性能取决于CPU、系统RAM和芯片组。至于限制,请参阅。再次感谢。这可能是我收到的最有用和最完整的答案。