1

CUBLASリファレンスによると、asum関数(ベクトルの要素の合計を取得するため)は次のとおりです。

cublasStatus_t  cublasSasum(cublasHandle_t handle, int n, const float *x, int incx, float *result)

参照へのリンクでパラメータの説明を見ることができます。大まかに言って、要素間の距離を持つ要素のベクトルxがあります。nincx

私のコードは(かなり単純化されていますが、これもテストしましたが、まだエラーがあります):

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)。freecudaFree

コンパイルして実行し、エラーをスローしませんが、出力される結果は0、デバッグでは実際には1.QNANです。

私は何を取りこぼしたか?

4

1 に答える 1

1

への引数の 1 つcublasSasumが正しくありません。呼び出しは次のようになります。

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

最後から 2 番目の引数 は、 bytesではなくwordsincxでなければならないことに注意してください。

于 2013-03-21T17:18:30.050 に答える