2015-03-02 5 views
1

Considérons le code affiché par sgarizvi àerreur de compilation cublasSgetriBatched avec CUDA 7.0 Release Candidate

CUBLAS: Incorrect inversion for matrix with zero pivot

J'utilise ce code comme reproducer impromptu de mon problème. Si je compile avec CUDA 6.0, tout fonctionne bien. En face de cela, si je compile avec CUDA 6.5 ou CUDA 7.0 Release Candidate Je reçois:

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 

Est-ce un bug ou je fais quelque chose de mal?

Ma configuration: Windows 7, Microsoft Visual Studio 2010, Mode édition, x64, compute_20, sm_21.

EDIT

Après la réponse de Robert Crovella et le commentaire de Park Young-Bae, l'exemple pointu peut être fixé à travailler avec CUDA 6.5 ou 7.0 en changeant la ligne

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)); 
+3

Ceci n'est pas lié à CUDA, il s'agit des règles d'aliasing C++. La conversion de 'float **' à 'float const **' n'est pas valide. [Voir la FAQ ISO C++] (http://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion). –

Répondre

2

Je n'ai pas essayé sur Windows, mais j'observe sur Linux que l'erreur de compilation se produit si j'utilise CUDA 6. 5 ou CUDA 7 RC. Toutefois, si je reviens à CUDA 6.0 (que la question précédente liée a principalement en vue), alors l'erreur de compilation disparaît.

Il y avait un changement dans l'API CUBLAS à cet égard, en particulier pour le prototype de la fonction getriBatched dans 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); 

Notez l'ajout du qualificateur const sur le 3ème paramètre. C'est fondamentalement ce qui donne naissance à la différence observée. Et comme pour l'erreur elle-même, c'est correct par les règles C++, comme indiqué par @ParkYoungBae dans les commentaires.

Le code d'origine de la question liée précédente doit être modifié pour une utilisation avec les nouveaux en-têtes de l'API CUBLAS.

+0

Merci Robert. Suite à votre réponse et au commentaire de Park Young-Bae, j'ai édité mon post en fournissant une ligne simple sur comment réparer mon problème. – JackOLantern

+1

Notez cependant que votre correctif viole la règle stricte d'alias. Je recommanderais de déposer un bogue ou de signaler ce problème sur les forums pour que la signature soit changée en 'float const * const []' car c'est probablement ce que les développeurs voulaient dire à l'origine. –