5

cuBLAS では、cublasIsamin()単精度配列の argmin を指定します。

完全な関数宣言は次のとおりです。cublasStatus_t cublasIsamin(cublasHandle_t handle, int n, const float *x, int incx, int *result)

cublasIsamin()cuBLAS プログラマー ガイドには、パラメーター に関する次の情報が記載されています。ここに画像の説明を入力

にホスト(CPU) メモリを使用するとresultcublasIsamin正常に動作します。次に例を示します。

void argmin_experiment_hostOutput(){
    float h_A[4] = {1, 2, 3, 4}; int N = 4; 
    float* d_A = 0;
    CHECK_CUDART(cudaMalloc((void**)&d_A, N * sizeof(d_A[0])));
    CHECK_CUBLAS(cublasSetVector(N, sizeof(h_A[0]), h_A, 1, d_A, 1));
    cublasHandle_t handle; CHECK_CUBLAS(cublasCreate(&handle));

    int result; //host memory
    CHECK_CUBLAS(cublasIsamin(handle, N, d_A, 1, &result));
    printf("argmin = %d, min = %f \n", result, h_A[result]);

    CHECK_CUBLAS(cublasDestroy(handle));
}

ただし、デバイス(GPU) メモリをに使用するresultと、cublasIsaminsegfault が発生します。セグメンテーション違反の例を次に示します。

void argmin_experiment_deviceOutput(){
    float h_A[4] = {1, 2, 3, 4}; int N = 4;
    float* d_A = 0;
    CHECK_CUDART(cudaMalloc((void**)&d_A, N * sizeof(d_A[0])));
    CHECK_CUBLAS(cublasSetVector(N, sizeof(h_A[0]), h_A, 1, d_A, 1));
    cublasHandle_t handle; CHECK_CUBLAS(cublasCreate(&handle));

    int* d_result = 0; 
    CHECK_CUDART(cudaMalloc((void**)&d_result, 1 * sizeof(d_result[0]))); //just enough device memory for 1 result
    CHECK_CUDART(cudaMemset(d_result, 0, 1 * sizeof(d_result[0])));
    CHECK_CUBLAS(cublasIsamin(handle, N, d_A, 1, d_result)); //SEGFAULT!

    CHECK_CUBLAS(cublasDestroy(handle));
}

Nvidia のガイドには、「cublasIsamin()」でデバイスのメモリに出力できると書かれています。私は何を間違っていますか?


動機:複数のストリームで同時に複数のベクトルの argmin() を計算したいと考えています。ホスト メモリへの出力には CPU と GPU の同期が必要であり、マルチカーネルの同時実行性が失われているようです。そのため、代わりにargminをデバイスメモリに出力したいと思います。

4

1 に答える 1

8

CUBLAS V2 API は、デバイス メモリへのスカラー結果の書き込みをサポートしています。ただし、デフォルトではこれをサポートしていません。ドキュメントのセクション 2.4「スカラー パラメーター」に従ってcublasSetPointerMode()、スカラー引数ポインターがデバイス メモリに常駐することを API に認識させるために を使用する必要があります。これにより、これらのレベル 1 BLAS 関数も非同期になるため、結果ポインターにアクセスする前に、GPU がカーネルを完了していることを確認する必要があります。

完全な実例については、この回答を参照してください。

于 2012-12-05T08:08:45.013 に答える