我正在使用我的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
确定,传递一个空流不使操作同步? –
@JoachimIsaksson我检查了这一点,不,0是默认流,它应该仍然是异步的,CUDA C编程指南的第3.2.5.5.2节 – MRocklin
这是您的真实代码吗?您没有任何代码这里的cublasSetVectorAsync函数重叠,你所做的就是调用一个异步函数,然后同步它('cudaEventSynchronize')。这甚至没有提到你在默认流中做所有事情的事实,除了内核启动(相对于调用主机线程),所有内容都是同步的。您发布的代码中没有内核启动。 – harrism