1

我正在使用我的 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调用在时间上占主导地位,就好像它的行为是同步的。即持续时间 AB 比持续时间 BC 长得多,并且随着我增加转移的大小而增加。

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

我正在使用带有 Cuda 编译工具的 GeForce GTX 285,版本 4.1,V0.2.1221

4

2 回答 2

3

cublasSetVectorAsync是一个薄薄的包装cudaMemcpyAsync。不幸的是,在某些情况下,这个函数的名称用词不当,正如CUDA 参考手册的这一页所解释的那样。

尤其:

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

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

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

或者,如果您的 GPU 和 CUDA 版本支持它,您可以使用malloc然后调用cudaHostRegister-edmalloc指针。请注意文档中的条件,即您必须使用cudaDeviceMapHost标志创建 CUDA 上下文cudaHostRegister才能产生任何效果(请参阅cudaSetDeviceFlags.

于 2012-09-25T23:56:10.837 回答
-1

在 cuBLAS/cuSPARSE 中,如果您不指定不同的流,则事情发生在流 0 中。要指定流,您必须使用 cublasSetStream(请参阅 cuBLAS 文档)。

于 2012-09-24T20:42:37.657 回答