【发布时间】:2012-08-26 13:06:33
【问题描述】:
我正在尝试并行化现有应用程序,我已将大部分应用程序并行化并在 GPU 上运行,我在将一个功能迁移到 GPU 时遇到问题
该函数使用了一个函数 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 函数?
错误:不允许从
__device__/__global__function("Dtrsv__dev")调用主机function("cublasDtrsv_v2")
【问题讨论】:
-
不,这是不可能的。 Cublas 是一个主机 api 和库。
-
非常感谢您的快速回答,有谁知道是否有可以从设备函数或全局函数调用的等效函数?