首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cuBLAS同步最佳实践

cuBLAS同步最佳实践
EN

Stack Overflow用户
提问于 2014-04-10 12:56:11
回答 2查看 3K关注 0票数 7

我阅读了两篇关于堆栈溢出的文章,即cublas内核函数会自动与主机同步吗?CUDA动态并行化;设备流同步,它们建议使用一些同步API,例如,调用cuBLAS函数后的cudaDeviceSynchronize()。我不确定使用这样一个通用函数是否有意义。

这样做更好吗?如果我错了就纠正我

代码语言:javascript
复制
cublasHandle_t cublas_handle;
cudaStream_t stream;
// Initialize the matrices
CUBLAS_CALL(
  cublasDgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, M, M, 
    M, &alpha, d_A, M, d_B, M, &beta, d_C, M));
// cublasDgemm is non-blocking!
cublasGetStream(cublas_handle, &stream);
cudaStreamSynchronize(stream);
// Now it is safe to copy the result (d_C) from the device
// to the host and use it

另一方面,如果使用了大量流/句柄来执行并行cudaDeviceSynchronize操作,则最好使用cuBLAS。cuBLAS句柄同步的“最佳实践”是什么?从同步的角度来看,cuBLAS句柄能被看作流的包装器吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-17 21:15:08

如果您使用的是单个流,则无论您是同步该流还是使用cudaDeviceSynchronize(),都没有什么区别。就性能和效果而言,应该是完全相同的。注意,当使用事件对代码的一部分(例如cublas调用)进行计时时,调用cudaDeviceSynchronize()以获得有意义的度量总是很好的做法。根据我的经验,它不会造成任何重大的开销,而且,更安全的是,您的内核与它的时间。

如果应用程序使用多个流,那么只与所需的流同步是有意义的。我相信这个问题会对你有所帮助。此外,您还可以阅读CUDA C编程指南,第3.2.5.5节

票数 5
EN

Stack Overflow用户

发布于 2014-04-10 19:29:51

在您的示例中,还不清楚您需要使用显式同步,也不清楚为什么需要使用它。

向同一流发出的CUDA操作将被序列化。如果启动内核或cublas调用,然后使用cudaMemcpy操作(或cublasGetVector/Matrix等)跟踪该内核或cublas调用,则保证复制操作不会启动,直到以前发布给同一流的所有CUDA活动都完成为止。

一般情况下的最佳实践是根本不使用显式同步。必须在同一流中串行依赖的位置活动。将不相互依赖的活动放置在单独的流中。

有许多使用cublas或其他方式的cuda代码,它们根本不使用显式同步。你的例子没有什么特别的需要。请注意,在您链接的第一个答案中,魔爪说:

您需要调用阻塞API例程,比如同步内存传输或.

在你的例子中,这正是你要做的。您将调用内存传输,或者发出到相同的流(例如cudaMemcpyAsync),或者调用默认的阻塞传输(如cudaMemcpy),并且它会很好地工作。不需要显式同步。

您可能希望阅读适当的程序编制指南部分

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22988733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档