Согласно 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
.
Что я пропустил?
Да, спасибо. – machlas
Аргумент 'incx' находится в ** элементах **, а не в байтах или словах. – shinjin
@shinjin: слова и элементы в этом случае одинаковы. Элемент представляет собой 32-битное слово. – talonmies