我们应该在不同的调用之间重复使用cublasHandle_t吗?

7

我正在使用最新版本的CUDA 5.5,新的CUBLAS有一种有状态的味道,每个函数都需要一个,例如:

  cublasHandle_t handle;
  cublasCreate_v2(&handle);
  cublasDgemm_v2(handle, A_trans, B_trans, m, n, k, &alpha, d_A, lda, d_B, ldb, &beta, d_C, ldc);
  cublasDestroy_v2(handle);

像某种 Session 一样尽可能多地重用此句柄实例是一个好的做法,还是说性能影响非常小,通过具有短寿命的句柄实例来降低代码复杂性更加合理,因此会不断地创建/销毁它?


2
创建/销毁多个cuBLAS句柄可能会通过不必要的上下文同步破坏并发性。 - Vitality
1
此外,从cuBLAS库用户指南中可以看到,“cublasCreate()[...]在主机上分配硬件资源”,因此可能在调用时存在一些开销。 - Vitality
值得从文档中复制的是:“由于cublasCreate分配了一些内部资源,并且通过调用cublasDestroy释放这些资源将隐式调用cublasDeviceSynchronize,因此建议最小化cublasCreate / cublasDestroy出现的次数。” - Allan
2个回答

8

我认为这样做有两个好处:

  1. 根据cuBLAS库用户指南,“cublasCreate() [...] 在主机上分配硬件资源”,这让我想到调用它时存在一些开销。
  2. 多个cuBLAS句柄的创建/销毁可能会通过不必要的上下文同步破坏并发性。

1

正如CUDA Toolkit在这里所述:

应用程序必须通过调用cublasCreate()函数来初始化cuBLAS库上下文句柄。然后,上下文将显式地传递给每个后续的库函数调用。一旦应用程序完成库的使用,它必须调用cublasDestory()函数以释放与cuBLAS库上下文相关联的资源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接