2012-01-23 19 views
5

Tengo un conjunto de punteros de función que utilizo para llamar al cblas_xgemm apropiado (por ejemplo, cblas_dgemm o cblas_sgemm, etc., de ATLAS/CBLAS).¿Por qué cblas_dgemm y cblas_sgemm tienen diferentes tipos de puntero en una matriz de punteros de función?

Esto funciona muy bien cuando le digo que use cblas_dgemm por el puntero de función; Se llama a dgemm con los argumentos apropiados y devuelve un resultado correcto.

Sin embargo, cuando llamo por cblas_sgemm puntero de función, me sale el siguiente resultado:

ldc must be >= MAX(N,1): ldc=0 N=2Parameter 14 to routine cblas_sgemm was incorrect 

He escrito un short test program que demuestra el problema. Llamadas al cblas_sgemm sin que el puntero a la función funcione bien.

Nota sobre todo la siguiente advertencia gcc (véase también la esencia vinculado anteriormente, que tiene la salida de gcc completo):

test_cblas_sgemm.c:20:3: warning: initialization from incompatible pointer type [enabled by default] 

Si comento hacia fuera de la línea de cblas_sgemm en la definición matriz de punteros de función, no lo hago obtener una advertencia, incluso para la línea cblas_dgemm. ¡Pero eso no tiene sentido porque ambas funciones deberían tener el mismo tipo de devolución!

Aquí están las líneas apropiadas de cblas.h:

void cblas_sgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
       const enum CBLAS_TRANSPOSE TransB, const int M, const int N, 
       const int K, const float alpha, const float *A, 
       const int lda, const float *B, const int ldb, 
       const float beta, float *C, const int ldc); 
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA, 
       const enum CBLAS_TRANSPOSE TransB, const int M, const int N, 
       const int K, const double alpha, const double *A, 
       const int lda, const double *B, const int ldb, 
       const double beta, double *C, const int ldc); 

Entonces, ¿qué pasa? ¿Obtiene de alguna manera una de las funciones xgemm de un encabezado y el otro de otro? ¿O estoy lidiando con algún extraño problema de puntero de función?

+0

Podría mostrar algún código, es muy difícil comentar los errores del compilador abstracto sin algún contexto. – talonmies

+0

Hay un código vinculado en la pregunta: https://gist.github.com/1671571 –

Respuesta

1

Su pregunta parece reducirse al hecho de que tiene funciones de diferentes firmas que está tratando de llamar desde una matriz de punteros de función. Nunca lo intenté yo mismo, pero de un poco de investigación, no parece que esto sea posible. Eso tiene sentido, ya que un lenguaje estáticamente tipado no podría evaluar el tipo de seguridad de esta maniobra.

He visto sugerencias sobre el uso de la variante boost :: y otras soluciones para esto, pero como usted está enlazando a una biblioteca que no es nuestra propia, no estoy seguro de que haya mucho valor en buscar esas opciones.

Si quiere probar o refutar, puede eliminar CBLAS de su programa de prueba y simplemente implementar una clase con múltiples métodos de firma, que difieren solo en el tipo de datos.

En una nota lateral, la columna principal es un gran dolor.

+0

¿Puede explicar lo que quiere decir con la firma? Mi comprensión era el mismo tipo de devolución y el mismo tipo de argumento + número => misma firma. –

+0

Sí, estoy de acuerdo con eso. Pero tus tipos de parámetros no son lo mismo. Mira beta. Es un flotador en las funciones SGE y doble en las funciones DGE. Recientemente trabajé con BLAS. Recuerdo vagamente que los tipos de datos con los que trabajan esas funciones son la diferencia entre D prefijo (dobles) y S prefijo (supongo que solo, que se convierte en flotación cuando se transfiere a C++). – Evan

+0

Dios mío. Yo [pensé que] leí esas listas de argumentos tan de cerca. Estás absolutamente en lo correcto. Muchas gracias. –

Cuestiones relacionadas