根据CUBLAS reference,asum函数(用于获取向量元素的总和)是:
cublasStatus_t cublasSasum(cublasHandle_t handle, int n, const float *x, int incx, float *result)
您可以在参考链接中看到参数说明,粗略地说,我们有x
个n
元素的向量incx
,元素之间的距离为int arraySize = 10;
float* a = (float*) malloc (sizeof(float) * arraySize);
float* d_a;
cudaMalloc((void**) &d_a, sizeof(float) * arraySize);
for (int i=0; i<arraySize; i++)
a[i]=0.8f;
cudaMemcpy(d_a, a, sizeof(float) * arraySize, cudaMemcpyHostToDevice);
cublasStatus_t ret;
cublasHandle_t handle;
ret = cublasCreate(&handle);
float* cb_result = (float*) malloc (sizeof(float));
ret = cublasSasum(handle, arraySize, d_a, sizeof(float), cb_result);
printf("\n\nCUBLAS: %.3f", *cb_result);
cublasDestroy(handle);
。
我的代码是(非常简化,但我也对此进行了测试,但仍然存在错误):
CUDA_STATUS_SUCCESS
我已经删除了错误检查以简化代码(没有错误,CUBLAS函数返回free
)和cudaFree
以及0
。
它编译,运行,它不会抛出任何错误,但打印结果为1.QNAN
,调试时实际上是{{1}}。
我错过了什么?
答案 0 :(得分:1)
cublasSasum
的一个论点是不正确的。这个电话应该是这样的:
ret = cublasSasum(handle, arraySize, d_a, 1, cb_result);
请注意,倒数第二个参数incx
应位于字中,而不是字节。