为什么CUBLAS使用const指针作为参数?

时间:2013-05-04 05:52:50

标签: pointers cuda const gpgpu cublas

如,

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

3 个答案:

答案 0 :(得分:8)

  1. const表示输入参数只对调用者和编译器都有读取(对优化有影响)
  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转换机制。

答案 1 :(得分:2)

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

非const C参数是输出参数,该参数指向将由函数修改的数据。

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

答案 2 :(得分:1)

关于你的第四个问题,talonmies是正确的,你需要施放到const。一个很好的例子,说明如何为Cub转换为const< t> gt; gemmBatched在CUDA样本中给出: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