2013-03-21 7 views
1

Согласно CUBLAS reference, функции ASUM (для получения суммы элементов вектора) является:Понимание 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) и free и cudaFree.

Он компилируется, он запускается, он не вызывает никаких ошибок, но результат напечатан 0, и, отладка, это фактически 1.QNAN.

Что я пропустил?

ответ

1

Неверный один из аргументов cublasSasum. Вызов должен выглядеть следующим образом:

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

Обратите внимание, что второй последний аргумент, incx, должны быть словами, не байт.

+0

Да, спасибо. – machlas

+0

Аргумент 'incx' находится в ** элементах **, а не в байтах или словах. – shinjin

+0

@shinjin: слова и элементы в этом случае одинаковы. Элемент представляет собой 32-битное слово. – talonmies