2

既存のアプリケーションを並列化しようとしています。ほとんどのアプリケーションを並列化して GPU で実行しています。1 つの関数を GPU に移行する際に問題が発生しています。

この関数は、blas ライブラリの一部である関数 dtrsv を使用します。以下を参照してください。

void dtrsv_call_N(double* B, double* A, int* n, int* lda, int* incx) {
  F77_CALL(dtrsv)("L","T","N", n, B, lda, A, incx);
}

以下のように、同等の cuda/cublas 関数を呼び出すことができました。生成された結果は、fortran dtrsv サブルーチンと同等です。

status = cublasDtrsv(handle,CUBLAS_FILL_MODE_LOWER,CUBLAS_OP_T,CUBLAS_DIAG_NON_UNIT, x, dev_m1, x, dev_m2, c);

if (status != CUBLAS_STATUS_SUCCESS) {
        printf ( "!!!! kernel execution error.\n");
        return EXIT_FAILURE;
    }

私の問題は、以下のように、デバイスまたはグローバル関数から cublasDtrsv を呼び出せるようにする必要があることです。

__global__ void Dtrsv__cm2(cublasHandle_t handle,cublasFillMode_t uplo,cublasOperation_t trans, cublasDiagType_t diag,int n, const double *A, int lda, double *x, int incx){
    cublasDtrsv(handle,uplo,trans,diag, n, A, lda, x, incx);
}

cuda 4.0 で以下をコンパイルしようとすると、以下のエラーが発生します。__device__または__global__関数から cublas 関数を呼び出すことができる手段があるかどうかは誰にもわかりませんか?

エラー: /function("cublasDtrsv_v2")からのホストの呼び出しは許可されていません__device____global__ function("Dtrsv__dev")

4

1 に答える 1

5

CUDA Toolkit 5.0 では、個別にコンパイルされたデバイス オブジェクト ファイルをリンクできるデバイス リンカーが導入されました。CUDA Toolkit 5.0 の CUBLAS 関数は、デバイス関数から呼び出すことができるようになったと思います (ただし、ヘッダーを確認しただけで、CUBLAS を使用した経験はありません)。

于 2012-08-31T19:06:48.770 に答える