Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cuBLAS同步最佳实践_C_Cuda_Cublas - Fatal编程技术网

cuBLAS同步最佳实践

cuBLAS同步最佳实践,c,cuda,cublas,C,Cuda,Cublas,我读了两篇关于堆栈溢出的文章,即和,他们建议在调用cuBLAS函数后使用一些同步API,例如,cudaDeviceSynchronize()。我不确定使用这样一个通用函数是否有意义 这样做是否更好?[如果我错了,请纠正我]: cublasHandle_t cublas_handle; cudaStream_t stream; // Initialize the matrices CUBLAS_CALL( cublasDgemm(cublas_handle, CUBLAS_OP_N, CUBL

我读了两篇关于堆栈溢出的文章,即和,他们建议在调用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句柄是否可以被视为流的包装器,因为它们具有相同的用途?

在您的示例中,您根本不清楚是否需要使用显式同步,或者为什么需要使用显式同步

向同一流发出的CUDA操作被序列化。如果启动内核或cublas调用,然后在该内核或cublas调用之后执行cudaMemcpy操作(或cublasGetVector/Matrix等),则保证复制操作不会启动,直到向同一流发出的所有先前CUDA活动完成

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

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

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

在您的示例中,这正是您要做的。您可以调用一个内存传输,或者发送到同一个流(例如
cudaMemcpyAsync
),或者调用默认的阻塞传输(例如
cudaMemcpy
),它可以正常工作。不需要显式同步


您可能希望阅读如果您使用的是单个流,那么您将同步该流还是使用
cudaDeviceSynchronize()
都没有区别。就性能和效果而言,应该完全相同。请注意,当使用事件对代码的一部分进行计时时(例如,cublas调用),调用
cudaDeviceSynchronize()
以获得有意义的测量值始终是一种良好的做法。根据我的经验,它不会带来任何显著的开销,而且,用它计时内核更安全


如果您的应用程序使用多个流,那么只针对您想要的流进行同步是有意义的。我相信这会对你有所帮助。此外,您还可以阅读《CUDA C编程指南》。

您不喜欢cudaDeviceSynchronize的原因是什么?另外,在您的示例中,您没有在cuBLAS调用之前设置流。最后,为什么要使用流呢?对于只有一个流,流同步PDR格式是否与设备同步不同?@JackOLantern我读到
cudaDeviceSynchronize
通常会降低执行速度,因此我认为最好避免它。此外,
cudaStreamSynchronize
会告诉设备要同步的确切内容。也许这没什么区别,我只是想知道并行cuBLAS操作时的最佳实践是什么。@Jackolanten还有,也许还有其他事情可以做其他事情,等待它们是没有意义的。从这个意义上说,我想cudaStreamSynchronize(stream)应该是一个更好的选择。我们只是尝试了这个,使用托管内存,
cudaStreamSynchronize(stream)
是不够的。只有当我们进行cudaDeviceSynchronize'时,我们才能获得一致的结果(在Dgemm调用后没有比赛)。也许托管内存需要完全同步?