Compilation 64 Bits

chamine -  
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour à tous,

J'ai un problème lorsque je fais tourner un programme fortran compilé en 64-Bits sur des machines 64-Bits. En fait
avant mon programe s'arretait en faisant apparaître des NaN, et je pensais que c'était parce que je le compilais sur une machine 32 Bit et le faisait tourner sur une 64 Bits.
Donc là je le compile avec mpich2 64 bits, et sur une machine 64 Bits mais le programme tourne très très lentement, 3 à 4 fois plus lent que d'habitude et voire même plus lent que sur une machine 64 Bits, et en plus il s'arrête au bout d'une petite dizaine d'heures sans aucun message d'erreur.

Je ne sais plus trop quoi faire, j'ai testé sur 3 machines 64 Bits différentes, et toujours aussi lent et il s'arrête toujours aussi subitement au bout du même temps.
Si quelqu'un a une idée cela me rendrait service!

Merci

PS : les machines 64 Bits sont des AMD64, j'utilise linux (système Debian version etch)
A voir également:

11 réponses

Manu
 
Bonjour

une piste : en 64 bits gcc utilise les instructions flottantes mmx, qui n'existent qu'en deux formats flottants 32 et 64 bits et n'ont pas les opérations trigonométriques et transcendantes, alors qu'en mode 32 bits gcc utilise les instructions x87 dont tous les résultats intermédiaires sont manipulés en format 80 bits.

J'ai rencontré des cas en 64 bits (X86_64) où les deux expressions a*d-b*c et b*c-a*d avaient le même signe sans être nulles (conduisant à des décisions incohérentes), alors que ça ne se produisait pas en 32 bits.

Manu
1
chamine
 
Bonjour,

Merci bcp pour ta réponse!!

J'ai testé en ajoutant par l'option -m64 à gcc, et c'est toujours aussi lent...
en fait je me demandais si ça ne pouvait pas être du à des librairies qui sont pas adaptées ou quelque chose comme ça... ptetre en le compilant en statique je sais pas...
et le problème aussi c'est que d'habitude je redirige vers un fichier de sortie où le programe écrit des paramètres quelconques, mais là le fichier de sortie est vide, mais le programme tourne quand même et crée des répertoires avec les "résultats".

J'avoue je commence à devenir folle ça fait plus de trois semaines que je suis dessus et mes travaux n'avancent pas.

J'utilisais avant ifort et il m'a posé des problèmes pour des programes en fortran ( typiquement des segmentation fault), et g95 est resté mon sauveur, donc je suis passée pour tous les programmes mpi de mpif90 à g95 (configuré avec mpich2)
0
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
Hello
est-ce que ces précisions changent qqchose ?

https://www.mpich.org/

A.2.5 Q: When I use the g95 Fortran compiler on a 64-bit platform, some of the tests fail

A: The g95 compiler incorrectly defines the default Fortran integer as a 64-
bit integer while defining Fortran reals as 32-bit values (the Fortran standard
requires that INTEGER and REAL be the same size). This was apparently
done to allow a Fortran INTEGER to hold the value of a pointer, rather
than requiring the programmer to select an INTEGER of a suitable KIND.
To force the g95 compiler to correctly implement the Fortran standard, use
the -i4 flag. For example, set the environment variable F90FLAGS before
configuring MPICH2:
setenv F90FLAGS "-i4"
G95 users should note that there (at this writing) are two distributions of
g95 for 64-bit Linux platforms. One uses 32-bit integers and reals (and
conforms to the Fortran standard) and one uses 32-bit integers and 64-bit
reals. We recommend using the one that conforms to the standard (note
that the standard specifies the ratio of sizes, not the absolute sizes, so a
Fortran 95 compiler that used 64 bits for both INTEGER and REAL would
also conform to the Fortran standard. However, such a compiler
0
chamine
 
Malheureusement j'avais déjà vu ça, et j'ai déjà ajouter ce flags....
:) Merci beaucoup quand même
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
Hello
compilé avec optimisation ? [-Olevel] optimization level.
essayer sans.
0
chamine
 
J'ai essayé avec et sans, même résultat.
Par contre je suis repassé à ifort en mpi (donc mpif77 et 90) et là la vitesse est redevenue normale, mais il s'arrête toujours.
Une chose pendant la compilation qui apparaît, j'ai des remarques du type "remark: LOOP WAS VECTORIZED." J'essaie de voir ce que c'est exactement.
Merci encore pour les idées!
0
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
Ca veut dire que le compilateur optimise des boucles en fonction du cpu. essayer de trouver l'option pour éviter et tester.
0
chamine
 
C ok pour ne plus tester (option -vec_report0 si ça peut t'intéresser :) )
j'ai lancé un test pour voir ce que ça va donner
J'ai remarqué autre chose de différents concernant les librairies utilisées sur 32 et 64, en 32 il prends quelques librairies intel (notamment lapack), et sur les 64 il prend lapack chez atlas par exemple... Y'aurait-il une incompatibilité entre atlas et intel? et si oui pourquoi n'est-elle pas déclarée pendant la compilation?
0
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
il serait bon, effectivement, pour tester d'utiliser les librairies 32 et 64 bits de la même origine.
ou avec les librairies AMD http://developer.amd.com/acml.jsp
0
Manu
 
Bonjour,

S'agissant du message "remark: LOOP WAS VECTORIZED.", il veut dire que le compilateur a utilisé les fonctions SIMD du mmx du X86_64. Ce processeur fait en une seule instruction deux opérations flottantes 64 bits ou quatre opérations flottantes 32 bits.

Cela ne double (ou quadruple) pas la vitesse, parce que dans un programme il y a beaucoup d'opérations non flottantes. Dans les meilleurs des cas j'ai pu gagner 30%, s'ajoutant au gain procuré par le dual-core (mais il faut "multithreader" pour cela).

Manu
0
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
la commande ldd fichier_executable affiche toutes les librairies liées au fichier exécuable et permet de vérifier lequelles sont utilisées
0