2012-08-31 60 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

相关问题