【问题标题】:Should we reuse the cublasHandle_t across different calls?我们应该在不同的调用中重用 cublasHandle_t 吗?
【发布时间】:2014-01-26 18:34:16
【问题描述】:

我使用的是最新版本的 CUDA 5.5,新的 CUBLAS 具有状态性,每个函数都需要 cublasHandle_t,例如

  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 那样尽可能多地重用这个句柄实例是一种好习惯吗,否则性能影响会很小,因此通过使用短暂的句柄实例来降低代码复杂度和因此不断地创建/销毁它?

【问题讨论】:

  • 多个 cuBLAS 句柄创建/销毁可能会因不需要的上下文同步而中断并发。
  • 另外,来自 cuBLAS 库用户指南,“cublasCreate() [...] 在主机上分配硬件资源”,所以它的调用可能会有一些开销。
  • 还值得从文档中复制一下:"因为 cublasCreate 分配了一些内部资源,调用 cublasDestroy 释放这些资源会隐式调用 cublasDeviceSynchronize,建议尽量减少cublasCreate/cublasDestroy 事件。”

标签: cuda cublas


【解决方案1】:

我认为这是一个很好的做法,原因有两个:

  1. 来自 cuBLAS 库用户指南,“cublasCreate() [...] 在主机上分配硬件资源”,这让我觉得它的调用有一些开销。
  2. 多个 cuBLAS 句柄创建/销毁可能会因不必要的上下文同步而中断并发。

【讨论】:

    【解决方案2】:

    正如here 中的 CUDA 工具包所述

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      相关资源
      最近更新 更多