我阅读了两篇关于堆栈溢出的文章,即cublas内核函数会自动与主机同步吗?和CUDA动态并行化;设备流同步,它们建议使用一些同步API,例如,调用cuBLAS函数后的cudaDeviceSynchronize()。我不确定使用这样一个通用函数是否有意义。
这样做更好吗?如果我错了就纠正我
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句柄能被看作流的包装器吗?
发布于 2014-10-17 21:15:08
如果您使用的是单个流,则无论您是同步该流还是使用cudaDeviceSynchronize(),都没有什么区别。就性能和效果而言,应该是完全相同的。注意,当使用事件对代码的一部分(例如cublas调用)进行计时时,调用cudaDeviceSynchronize()以获得有意义的度量总是很好的做法。根据我的经验,它不会造成任何重大的开销,而且,更安全的是,您的内核与它的时间。
如果应用程序使用多个流,那么只与所需的流同步是有意义的。我相信这个问题会对你有所帮助。此外,您还可以阅读CUDA C编程指南,第3.2.5.5节。
发布于 2014-04-10 19:29:51
在您的示例中,还不清楚您需要使用显式同步,也不清楚为什么需要使用它。
向同一流发出的CUDA操作将被序列化。如果启动内核或cublas调用,然后使用cudaMemcpy操作(或cublasGetVector/Matrix等)跟踪该内核或cublas调用,则保证复制操作不会启动,直到以前发布给同一流的所有CUDA活动都完成为止。
一般情况下的最佳实践是根本不使用显式同步。必须在同一流中串行依赖的位置活动。将不相互依赖的活动放置在单独的流中。
有许多使用cublas或其他方式的cuda代码,它们根本不使用显式同步。你的例子没有什么特别的需要。请注意,在您链接的第一个答案中,魔爪说:
您需要调用阻塞API例程,比如同步内存传输或.
在你的例子中,这正是你要做的。您将调用内存传输,或者发出到相同的流(例如cudaMemcpyAsync),或者调用默认的阻塞传输(如cudaMemcpy),并且它会很好地工作。不需要显式同步。
您可能希望阅读适当的程序编制指南部分
https://stackoverflow.com/questions/22988733
复制相似问题