2015-03-02 4 views
1

Рассмотрим код, размещенный на sgarizvicublasSgetriBatched ошибка компиляции с кандидатом CUDA 7.0 Release

CUBLAS: Incorrect inversion for matrix with zero pivot

Я использую этот код, как вне-полки репродуктора моей проблемы.

Если я скомпилирую его с CUDA 6.0, все будет хорошо. Напротив, что, если я скомпилировать его с помощью CUDA 6.5 или CUDA 7.0 релиз-кандидат получаю:

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.

EDIT

После ответа Роберта 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)); 
+3

Это не связано с CUDA, это правила сглаживания C++. Преобразование 'float **' в 'float const **' недопустимо. [См. FAQ по ISO C++] (http://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion). –

ответ

2

Я не пробовал Windows, но я наблюдаю за Linux, что возникает ошибка компиляции, использую ли я CUDA 6. 5 или CUDA 7 RC. Однако, если я вернусь к CUDA 6.0 (который в первую очередь связан с предыдущим вопросом), тогда ошибка компиляции исчезнет.

Был изменения в API CUBLAS в этом отношении, в частности, для 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); 

Обратите внимание на добавление квалификатора const по третьему параметру. Это принципиально то, что порождает наблюдаемую разницу. А что касается собственно самой ошибки, это правильно для правил C++, как указано в комментариях @ParkYoungBae.

Оригинальный код в предыдущем связанном вопросе должен быть изменен для использования с новыми заголовками API CUBLAS.

+0

Спасибо, Роберт. Следуя вашему ответу и замечанию Парка Янга-Бэ, я отредактировал свой пост, предоставив простую строку о том, как решить мою проблему. – JackOLantern

+1

Обратите внимание, что ваше исправление нарушает строгое правило псевдонимов. Я бы рекомендовал подавать ошибку или сообщать об этой проблеме на форумах, чтобы ее подпись была изменена на 'float const * const []', поскольку это, вероятно, то, что первоначально подразумевали разработчики. –