我阅读了Stack Overflow上的两篇文章,即cublas内核功能是否会自动与主机同步?和CUDA动态并行化;从设备进行流同步,他们建议使用某些同步API,例如cudaDeviceSynchronize()
在调用cuBLAS函数之后。我不确定使用这样的通用功能是否有意义。
这样做会更好吗?[如果我错了纠正我]:
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
Run Code Online (Sandbox Code Playgroud)
另一方面,cudaDeviceSynchronize
如果大量流/句柄用于执行并行cuBLAS操作,则可以优先使用。cuBLAS手柄同步的“最佳实践”是什么?从同步的角度来看,cuBLAS句柄是否可以被视为流周围的包装器?
小智 5
如果您使用的是单个流,那么是同步该流还是使用cudaDeviceSynchronize()
. 在性能和效果方面应该是完全一样的。请注意,当使用事件为您的代码的一部分计时(例如,cublas 调用)时,调用cudaDeviceSynchronize()
以获得有意义的测量值始终是一个好习惯。根据我的经验,它不会强加任何显着的开销,此外,使用它为内核计时更安全。
如果您的应用程序使用多个流,那么只对您想要的流进行同步是有意义的。相信这个问题会对你有所帮助。此外,您可以阅读 CUDA C 编程指南,第 3.2.5.5 节。