2010-10-11 3 views
1

J'ai travaillé avec un code multipôle rapide dans Fortran. C'est une boîte noire pour moi, et j'ai eu une certaine étrangeté en la compilant sur mon mac. J'utilise la version 11.1 du compilateur, j'ai un MacBook Pro exécutant un processeur Intel Core 2 Duo de 2,5 GHz sur Snow Leopard.Résultat incorrect avec le compilateur Intel Fortran sur Mac, mais sous Linux

Le code s'exécute correctement lorsque j'ai défini l'indicateur d'optimisation sur -O0, mais échoue lorsque j'utilise -O2 ou -O3. Ce qui est bizarre, c'est que le code fonctionne bien sur une machine Linux, au moins avec le drapeau -O2 par défaut.

Quelqu'un at-il des idées sur ce qui pourrait causer le problème? Ça doit être quelque chose avec la vectorisation.

+0

Utilisez-vous exactement la même version d'ifort sous Linux? En tout cas "... une démonstration convaincante d'exactitude est impossible tant que le mécanisme est considéré comme une boîte noire, ..." (c) Edsger Wybe Dijkstra – Wildcat

+0

Je vais devoir vérifier (c'est sur un ordinateur que je ne fais pas avoir accès à pour le moment), j'en doute cependant. – Patrick

+0

Cela fonctionne également très bien avec le compilateur Lahey sur Windows. – Patrick

Répondre

1

À première vue, et sans plus d'informations, je saute à la conclusion que votre programme est instable; c'est-à-dire que votre programme produit des résultats très différents (échec ou non-échec dans certains cas) lorsque vous ajustez l'optimisation (qui a toutes sortes d'effets sur le code généré). Certains des ajustements auront un impact sur les résultats de l'arithmétique à virgule flottante qui peut facilement faire la différence entre le succès et l'échec pour les simulations scientifiques de longue durée. Ceci est un symptôme d'un «problème» sous-jacent avec le programme et je vous conseille de ne pas compter sur les résultats des exécutions «réussies» du programme jusqu'à ce que vous compreniez beaucoup mieux - vous devez ouvrir le prix la boîte noire et voir ce qu'il y a à l'intérieur. À tout le moins, vous devez tester la sensibilité de votre programme à de petites modifications dans les entrées.

+0

Vous avez probablement raison. Le seul inconvénient est que c'est un code qui a été testé de manière approfondie. Il calcule les interactions n-corps en utilisant le FMM, mais les résultats sont comparés au calcul direct, il est donc facile de voir si vous obtenez la bonne réponse.La sortie sur le mac pour le potentiel est NaN avec l'optimisation activée, mais correcte quand elle est désactivée. Cela fonctionne bien sur la machine Linux et Windows ... – Patrick

+0

NaN peut être une indication que quelque chose ne va pas avec la précision du réel. Y a-t-il des types de real codés en dur dans le code? – Wildcat

+0

Voyons voir. Le code déclare un énorme tableau de travail d'ints, mais celui-ci est ensuite décomposé et transmis à divers sous-programmes, où les choses sont déclarées comme des vrais * 8. Il y a une tonne de recherches sur la table, peut-être que quelque chose n'est pas copié correctement. – Patrick

1

Comme déjà dit, il est possible que le résultat final soit numériquement sensible et que l'optimisation, qui assouplit les règles arithmétiques, entraîne une instabilité numérique. Ou l'optimisation pourrait révéler un bug dans le programme. Si le code fait sa propre gestion de la mémoire (ce qui n'est plus nécessaire avec Fortran 90/95/2003) avec un tableau interne d'ints, quelque chose pourrait mal fonctionner. Je voudrais enquêter plus loin ...

Je suggère d'activer toutes les options d'avertissement et de vérification. S'il y a un bug et que vous avez de la chance, ils pourraient le révéler ou donner un indice. Au moins, c'est facile à essayer. Essayez ces options:

-check tous -warn -traceback tous -fstack-protecteur

Vous pouvez également essayer « -assume protect_parens », ce qui rendra ifort conforme à la norme Fortran, et voir si cela fait la le problème s'en va.

Ou peut-être que le programme suppose que la mémoire est préallouée à une certaine valeur. Est-ce une différence avec Linux et Mac? Je pense que ifort a des options pour contrôler ça. S'il s'agit d'un ancien code Fortran 77, il peut supposer que les variables locales sont préservées à travers les appels de procédure, même sans l'utilisation de "save" dans les déclarations. Il y a une option de compilateur pour que toutes les variables locales agissent comme si "save" était utilisé - voir si cela fait une différence.

Questions connexes