1

根据CUBLAS 参考,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);

为了简化代码,我删除了错误检查(没有错误,CUBLAS 函数返回CUDA_STATUS_SUCCESS)和freeand cudaFree

它编译,它运行,它不会抛出任何错误,但打印的结果是0,并且,调试,它实际上是1.QNAN

我错过了什么?

4

1 回答 1

1

的论点之一cublasSasum是不正确的。调用应如下所示:

ret = cublasSasum(handle, arraySize, d_a, 1, cb_result);

请注意,倒数第二个参数 ,incx应该是words,而不是bytes

于 2013-03-21T17:18:30.050 回答