如,
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
变量来传递它们,还是普通指针会这样做?答案 0 :(得分:8)
const
表示输入参数只对调用者和编译器都有读取(对优化有影响)CUBLAS_POINTER_MODE_HOST
CUBLAS v2 API可以使用的两种可能指针模式之一,另一种是CUBLAS_POINTER_MODE_DEVICE
。 cublasSetPointerMode
可用于控制v2 API的指针行为,定义将数字输入和返回值写入主机或设备内存的位置。const
是合法的,但不能合法地强制转换constness。 C ++为此提供了const_cast
转换机制。答案 1 :(得分:2)
在上面的示例中,const
指针都是输入参数,不会被函数修改。您不需要在此处将实际指针传递给const - const限定符只是保证您为输入提供的数据不会被写入。
非const C
参数是输出参数,该参数指向将由函数修改的数据。
我不知道为什么alpha
和beta
作为指针传递 - 这可能只是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, ¶ms.alpha, (const T_ELEM **) devPtrA_dev, rowsA,
(const T_ELEM **) devPtrB_dev, rowsB, ¶ms.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