使用CUDA 7.0 Release Candidate进行cublasSgetriBatched编译错误

时间:2015-03-02 08:09:10

标签: cuda cublas

考虑sgarizvi在

发布的代码

CUBLAS: Incorrect inversion for matrix with zero pivot

我使用该代码作为我问题的现成复制品。

如果我用CUDA 6.0编译它,一切正常。与此相反,如果我使用CUDA 6.5或CUDA 7.0 Release Candidate编译它,我会收到:

Error   13  error C2664: 'cublasSgetriBatched' : cannot convert parameter 3 from 'float **' to 'const float *[]'    C:\Users\user\Documents\Project\StackOverflow15\StackOverflow15\kernel.cu   70  1   StackOverflow15

这是一个错误还是我做了什么坏事?

我的配置:Windows 7,Microsoft Visual Studio 2010,发布模式,x64,compute_20,sm_21。

修改

根据Robert Crovella的回答和Park Young-Bae的评论,可以修改尖锐的例子以通过改变线来使用CUDA 6.5或7.0

cublascall(cublasSgetriBatched(handle,n,A_d,lda,P,C_d,lda,INFO,batchSize));

cublascall(cublasSgetriBatched(handle,n,(const float **)A_d,lda,P,C_d,lda,INFO,batchSize));

1 个答案:

答案 0 :(得分:2)

我还没有在Windows上尝试过,但我在Linux上观察到无论是使用CUDA 6.5还是CUDA 7 RC都会发生编译错误。但是,如果我回到CUDA 6.0(链接的先前问题主要在视图中),那么编译错误就会消失。

在这方面,CUBLAS API发生了变化,特别是getriBatched中的cublas_api.h函数原型:

CUDA 6.0:

/* Batched inversion based on LU factorization from getrf */
CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgetriBatched(cublasHandle_t handle,
                                                  int n,
                                                  float *A[],                     /*Device pointer*/
                                                  int lda,
                                                  int *P,                         /*Device pointer*/
                                                  float *C[],                     /*Device pointer*/
                                                  int ldc,
                                                  int *INFO,
                                                  int batchSize);

CUDA 6.5 / 7RC:

/* Batched inversion based on LU factorization from getrf */
CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgetriBatched(cublasHandle_t handle,
                                                  int n,
                                                  const float *A[],               /*Device pointer*/
                                                  int lda,
                                                  const int *P,                   /*Device pointer*/
                                                  float *C[],                     /*Device pointer*/
                                                  int ldc,
                                                  int *info,
                                                  int batchSize);

请注意在第3个参数上添加const限定符。这基本上是导致观察到的差异的原因。至于实际错误本身,这是正确的每个C ++规则,如评论中@ParkYoungBae所示。

应修改上一个链接问题中的原始代码,以便与较新的CUBLAS API标头一起使用。