【问题标题】:Why does CUBLAS use const pointers for parameters?为什么 CUBLAS 使用 const 指针作为参数?
【发布时间】:2013-04-28 13:45:27
【问题描述】:

例如,

cublasStatus_t cublasSgemm(cublasHandle_t handle,
                       cublasOperation_t transa, cublasOperation_t transb,
                       int m, int n, int k,
                       const float           *alpha,
                       const float           *A, int lda,
                       const float           *B, int ldb,
                       const float           *beta,
                       float           *C, int ldc)

这涉及到一些混淆点:

  • const 有什么作用?
  • 为什么我们必须为标量参数提供指针?
  • 这与CUBLAS_POINTER_MODE_HOST 有什么关系?
  • 我们是否需要显式地创建临时的const 变量来传递它们,或者普通指针可以吗?

CUBLAS library

【问题讨论】:

    标签: pointers cuda constants gpgpu cublas


    【解决方案1】:
    1. const 表示 input 参数对于调用者和编译器都是只读的(这可能会影响优化)
    2. 因为使用指针而不是值允许 CUBLAS v2 例程从主机或设备内存读取(这与 CUBLAS v1 API 不同)
    3. 见上文。现在,CUBLAS v2 调用可以从 GPU 内存中读取标量参数,这意味着可以消除从主机到设备的中间内存传输,并提高某些类型操作的性能。 CUBLAS_POINTER_MODE_HOST CUBLAS v2 API 可以使用的两种可能的指针模式之一,另一种是CUBLAS_POINTER_MODE_DEVICEcublasSetPointerMode 可用于控制 v2 API 的指针行为,定义数字输入和返回值写入主机或设备内存的位置。
    4. 没有。在 C 中隐式转换为 const 是合法的,但将 constness 去掉是不合法的。 C++ 为此提供了const_cast 转换机制。

    【讨论】:

      【解决方案2】:

      在上面的示例中,const 指针都是函数不会修改的 输入 参数。您不需要在此处将实际指针传递给 const - const 限定符只是保证您为输入提供的数据不会被写入。

      非常量C参数是一个输出参数,它指向将被函数修改的数据。

      我不知道为什么 alphabeta 作为指针传递 - 这可能只是 BLAS 的 FORTRAN 起源的遗产。

      【讨论】:

      • 最后一点,可以在主机和设备之间从设备内存中读取参数而无需中间副本,这样 L1 BLAS 例程可以将结果留在设备内存中,而不需要冗余设备->主机->设备复制周期
      【解决方案3】:

      至于您的第 4 个问题,talonmies 是正确的,您需要转换为 const。 CUDA 示例中给出了如何将 cublasgemmBatched 转换为 const 的一个很好的示例:batchCUBLAS。

      他们给出了这样的例子:

       status1 = cublasXgemmBatched(handle, params.transa, params.transb, params.m, params.n,
                                           params.k, &params.alpha, (const T_ELEM **) devPtrA_dev, rowsA,
                                           (const T_ELEM **) devPtrB_dev, rowsB, &params.beta, devPtrC_dev, rowsC, opts.N);
      

      在 CUDA 示例中,T_ELEM 是一个浮点数。注意第 8 个输入:

      (const T_ELEM **) devPtrA_dev
      

      强制转换为 const。 devPtrA 以通常的方式设置在 CUDA 内存中,也可以在此 CUDA 示例中找到。

      您可以在此处找到有关 CUDA 示例的更多信息:https://developer.nvidia.com/cuda-code-samples

      【讨论】:

        猜你喜欢
        • 2018-09-02
        • 1970-01-01
        • 2020-04-04
        • 2020-08-12
        • 1970-01-01
        • 2021-05-08
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        相关资源
        最近更新 更多