1

例如,

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 图书馆

4

3 回答 3

8
  1. const表示输入参数对调用者和编译器都是只读的(这可能会影响优化)
  2. 因为使用指针而不是值,允许 CUBLAS v2 例程从主机或设备内存读取(这与 CUBLAS v1 API 不同)
  3. 看上面。现在,CUBLAS v2 调用可以从 GPU 内存中读取标量参数,这意味着可以消除从主机到设备的中间内存传输,并提高某些类型操作的性能。CUBLAS_POINTER_MODE_HOSTCUBLAS v2 API 可以使用的两种可能的指针模式之一,另一种是CUBLAS_POINTER_MODE_DEVICE. cublasSetPointerMode可用于控制 v2 API 的指针行为,定义数字输入和返回值写入主机或设备内存的位置。
  4. 不可以。在 C中隐式转换为合法const,但将常量转换为不合法。C++const_cast为此提供了强制转换机制。
于 2013-05-04T06:36:05.063 回答
2

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

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

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

于 2013-05-04T06:22:08.507 回答
1

至于您的第 4 个问题,talonmies 是正确的,您需要转换为 const。CUDA 示例中给出了如何将 cublas<t>gemmBatched 转换为 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

于 2014-09-15T20:20:03.980 回答