我阅读了关于Stack Overflow的两篇文章,即Will the cublas kernel functions automatically be synchronized with the host?和CUDA Dynamic Parallelizm; stream synchronization from device,他们建议在调用cuBLAS函数后使用一些同步API,例如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
另一方面,如果使用大量流/句柄执行并行cuBLAS操作,则可以优选使用
cudaDeviceSynchronize
。 cuBLAS手柄同步的“最佳实践”是什么?从同步的角度来看,cuBLAS句柄是否可以看作是流周围的包装器? 最佳答案
如果您使用单个流,则是同步一个流还是使用cudaDeviceSynchronize()
都没有关系。就性能和效果而言,它应该完全相同。请注意,在使用事件来计时部分代码(例如cublas调用)时,始终最好的做法是调用cudaDeviceSynchronize()
以获取有意义的度量。根据我的经验,它并不会增加任何开销,而且,使用它来计时内核是更安全的。
如果您的应用程序使用多个流,则仅针对所需的流进行同步是有意义的。我相信this question对您会有所帮助。另外,您可以阅读CUDA C编程指南Section 3.2.5.5。
关于c - cuBLAS同步最佳做法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22988733/