首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenAcc中使用cuBLAS

在OpenAcc中使用cuBLAS
EN

Stack Overflow用户
提问于 2015-12-10 13:46:04
回答 1查看 175关注 0票数 0

我想用cublasDgemm()替换对"cblas_dgemm()“的调用。这是Shark机器学习库的原始包装器:

代码语言:javascript
复制
inline void gemm(
    CBLAS_ORDER const Order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB,
    int M, int N, int K,
    double alpha, double const *A, int lda,
    double const *B, int ldb,
    double beta, double *C, int ldc
){

    cblas_dgemm(
        Order, TransA, TransB,
        M, N, K,
        alpha, 
        A, lda,
        B, ldb,
        beta, 
        C, ldc
    );

}

下面是使用OpenAcc编译指示修改后的代码:

代码语言:javascript
复制
inline void gemm(
    CBLAS_ORDER const Order, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB,
    int M, int N, int K,
    double alpha, double const *A, int lda,
    double const *B, int ldb,
    double beta, double *C, int ldc
){
        #ifdef _OPENACC
        cublasOperation_t OpT_A, OpT_B; 
            switch (TransA)
        {
            case CblasNoTrans:
                OpT_A = CUBLAS_OP_N;
                break;
            case CblasTrans:
                OpT_A = CUBLAS_OP_T;
                break;
            case CblasConjTrans:
                OpT_A = CUBLAS_OP_C;
                break;
            default:
                                OpT_A = CUBLAS_OP_N;
        }
               switch (TransB)
                {
                        case CblasNoTrans:
                                OpT_B = CUBLAS_OP_N;
                break;
                        case CblasTrans:
                                OpT_B = CUBLAS_OP_T;
                break;
                        case CblasConjTrans:
                                OpT_B = CUBLAS_OP_C;
                break;
                        default:
                                OpT_B = CUBLAS_OP_N;
                }

              cublasHandle_t handle;
              #pragma acc data copyin(OpT_A, OpT_B, M, N, K, alpha, A[0:M][0:K], lda, B[0:K][0:N], ldb, beta, ldc) copy(C[0:M][0:N])
                      {
                                 #pragma acc host_data use_device(handle,OpT_A, OpT_B, A, B, C, M, N, K, lda, ldb, ldc, alpha, beta)
                                 {
                                     cublasDgemm(handle,OpT_A,OpT_B,M,N,K,&alpha,A,lda,B,ldb,&beta,C,ldc);
                                }
                        }

    #else

    cblas_dgemm(
        Order, TransA, TransB,
        M, N, K,
        alpha, 
        A, lda,
        B, ldb,
        beta, 
        C, ldc
    );
    #endif
}

问题是,当我使用OpenAcc标志编译代码时,结果矩阵的元素,即C,在内核执行前后都是零。我不确定我在这里遗漏了什么。我很感谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2015-12-10 23:09:51

我认为这可能是您的问题,因为cublasDgemm将尝试在主机上解析这些变量,以便启动内核。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34194574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档