2015-12-10 39 views
0

我想用cublasDgemm()替换对“cblas_dgemm()”的调用。下面是从鲨鱼机器学习库中的原始包装:在OpenAcc中使用cuBLAS

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的编译指示修改后的代码:

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,在内核执行之前和之后都是零。我不知道我在这里失去了什么。 我感谢任何帮助。

回答

1

它看起来像你有基本结构的权利。尽管如此,您不需要datahost_data指令中的任何标量变量。这是Op *,M,N,K和ld *变量。我认为这可能是您的问题,因为cublasDgemm将尝试解析主机上的这些变量以启动内核。