2016-09-23 4 views
0

J'ai écrit un code en C.le code C qui utilise blas, lapack et OpenMP travaillant avec gcc 4.9, mais donne exécuter erreur de temps avec gcc 6

Vous pouvez trouver le code source here. Il utilise les bibliothèques blas, lapack et openmp. J'ai compilé les bibliothèques blas et lapack suivantes these instrucions. J'utilise ces drapeaux pour indiquer au compilateur les bibliothèques qu'il doit lier: -lblas -llapack -fopenmp

J'utilisais gcc 4.9 et le programme peut s'exécuter correctement.

J'ai récemment mis à jour gcc gcc 6 et il montre beaucoup de msgs d'avertissement au sujet de la déclaration implicite des blas et fonctions LAPACK:

src/PSIRWLS-train.c:152:17: warning: implicit declaration of function 'dgemm_' [-Wimplicit-function-declaration] 
       dgemm_(&trans, &trans, &(dataset.l), &ncols, &size,&factorA, KSC, &(dataset.l), miZ, &size, &factor, miKSM, &(dataset.l)); 

Et quand je lance l'application d'une erreur de défaut de segmentation apparaît.

Je suis complètement perdu sur les différences de gcc 4.9 et gcc 6, savez-vous des explications à ce sujet?

+0

Le lien vers votre code conduit à l'erreur 404 .. Vous pouvez être intéressé par [cblas] (http://www.netlib.org/blas/#_cblas) et [Lapacke] (http://www.netlib.org/lapack/lapacke.html) qui sont le C interfaces vers BLAS/LAPACK. Sinon, vous devrez peut-être décliner ['extern dgemm_ (...)'] (http://nicolas.limare.net/pro/notes/2014/10/31_cblas_clapack_lapacke/). Notez que déclarer des fonctions fortran de cette façon peut conduire à des problèmes de portabilité, car la convention de nommage change entre Linux et le W-thing ... L'utilisation de Cblas et Lapacke laisse ce problème (et quelques autres) aux développeurs de ces interfaces. – francis

Répondre

0

Problème résolu.

1 - Certains indicateurs par défaut sont différents dans gcc 4 et 6. gcc 6 montre des avertissements lorsque vous ne decleare blas et les fonctions LAPACK de cette façon:

DGEMM extern void _ (...)

2 - Il m'a scapé l'initialisation d'une variable qui devait être initialisée à 0. J'ai codé int i, j = 0; quand j'ai dû coder int i = 0, j = 0;

gcc 4 i initialisé à 0 (et le programme a été exécuté correctement) et gcc 6 n'a pas (la création d'une erreur de segmentation, car ces variables étaient à l'index)

0

J'avais une fois a similar problem, et il semble très probable qu'il y ait un comportement indéfini dans votre code (par exemple un double gratuit), qui est géré d'une manière spécifique au compilateur. Peut-être que cela a changé entre gcc 4.9 et 6.0.

Il est difficile de dire sans connaître votre code, mais vous pouvez utiliser un certain nombre d'outils vous-même pour suivre ce problème vers le bas, par exemple GDB ou en particulier valgrind's memcheck (travaillé avec brio pour moi):

valgrind --tool memcheck <your binary here> 

Cette volonté signaler les emplacements d'erreurs liées à la mémoire et les comportements non définis dans votre code.