2012-08-31 92 views
2

我試圖並行化現有的應用程序,我有大部分應用程序並行並在GPU上運行,我遇到的問題是將一個函數遷移到GPU是否有可能從全局或設備函數調用CUDA CUBLAS函數

該函數使用一個函數dtrsv blas庫的哪一部分,見下文。

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函數?

error: calling a host function("cublasDtrsv_v2") from a __device__/__global__ function("Dtrsv__dev") is not allowed

+0

不,這是不可能的。 Cublas是一個主機API和庫。 – talonmies

+0

非常感謝您的快速回答,有誰知道是否有可以從設備功能或全局功能調用的等效功能? –

回答

5

CUDA Toolkit 5.0引入了一個設備鏈接器,它可以鏈接單獨編譯的設備對象文件。我相信,CUDA Toolkit 5.0中的CUBLAS函數現在可以從設備函數中調用(但我只查看了頭文件,沒有使用CUBLAS的經驗)。

+0

我可以編譯從設備代碼引用CUBLAS的CU文件,我試圖弄清楚如何鏈接它:) – Eugene

+1

我不明白這可能會如何工作。 CUBLAS庫僅作爲IA32/x86_64二進制文件庫提供,內部例程調用主機端運行時API函數,啓動內核。這樣的代碼如何能夠運行GPU? – talonmies

+0

@talonmies單獨編譯。這些庫本身包含可重定位的設備代碼。 – Eugene

相關問題