2010-05-19 10 views
4

Je n'utilise que très rarement fortran, mais j'ai été chargé de le réécrire en parallèle. J'utilise gfortran pour mon choix de compilateur. J'ai trouvé d'excellentes ressources au https://computing.llnl.gov/tutorials/openMP/ ainsi que quelques autres.OpenMP in Fortran

Mon problème est le suivant, avant d'ajouter toutes les directives OpenMP, si je compile simplement le programme existant:

gfortran Example1.F90 -o Example1

tout fonctionne, mais activant l'option du compilateur OpenMP même sans ajouter: directives

gfortran -openmp Example1.F90 -o example1

se termine avec une erreur de segmentation quand je lance le programme existant. En utilisant des programmes de test plus petits que j'ai écrits, j'ai réussi à compiler d'autres programmes avec -openmp qui s'exécutent sur plusieurs threads, mais je ne comprends pas pourquoi activer l'option seule et aucune directive entraîne une erreur de segmentation. Je m'excuse si ma question est plutôt simple. Je pourrais poster du code mais c'est plutôt long. Il défauts que j'attribuer des valeurs initiales:

REAL, DIMENSION(da,da) :: uconsold 
    REAL, DIMENSION(da,da,dr,dk) :: uconsolde 

    ... 

    uconsold=0.0  
    uconsolde=0.0  

La première affectation à « uconsold » fonctionne très bien, la seconde semble être la source de la faute que quand je commente la ligne les prochaines lignes exécutent allègrement jusqu'à ce que " uconsolde "est utilisé à nouveau.

Merci pour toute aide à ce sujet.

+0

Ce n'est pas un code hérité, pour autant que je puisse le voir. C'est un moyen moderne de déclasser des tableaux. En ce qui concerne openmp, avec tout le respect dû au didacticiel sur le lien, je recommande humblement le livre "Using OpenMP". C'est très amical pour les gens qui n'ont jamais eu affaire à ça http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=11387 ... il y en a un autre, mais je ne fais pas Je l'ai sur mon étagère en ce moment, et je ne peux pas me souvenir de l'auteur. Si vous êtes intéressé, envoyez-moi un commentaire, et je le chercherai quand je rentrerai à la maison. – Rook

Répondre

7

Vous utilisez peut-être un espace de pile? Avec les variables openmp seront sur la pile de sorte que chaque thread a sa propre copie. Peut-être vos tableaux sont grands, et même avec un seul thread (pas de directives openmp) ils utilisent la pile. Juste une supposition ... Essayer la méthode de votre système d'exploitation pour augmenter la taille de l'espace de la pile et voir si la faute de segmentation disparaît.

Une autre approche: pour spécifier que le tableau doit aller sur le tas, vous pouvez le rendre "allouable". OpenMP version 3.0 permet plus d'utilisations des tableaux allouables Fortran - je ne suis pas sûr des détails.

+0

Bien que je pense que @MSB fasse une suggestion raisonnable, je ne suis pas d'accord avec l'affirmation que «chaque thread a sa propre copie». À moins que vous ne déclariez qu'une variable est privée, tous les threads partageront la variable. Je n'ai jamais rencontré un système OpenMP qui implémente des variables partagées en les copiant dans tous les threads et en gérant la cohérence dans les coulisses. –

+0

Vous avez tout à fait raison, sur ma boîte Linux: ulimit -s illimité ./Exemple1 A travaillé comme un charme. Cela pourrait être hors de portée (et le triste résultat du fait que 95% de mon temps est passé en Java) mais j'ai en quelque sorte pensé que fortran et openmp normalement compilés utiliseraient l'espace de pile.Comme je préférerais lire un livre plutôt que de continuer à vous embêter, est-ce que vous connaissez une bonne ressource que je peux consulter pour comprendre ce que je me suis un peu amélioré? – Dio

+0

@ Haute performance Mark est correct que la valeur par défaut est que les variables sont partagées. Cependant, il est courant pour les compilateurs, lorsque openmp est activé, de passer à la mise en place de tableaux locaux sur la pile. Ceci est utile pour les sous-programmes qui peuvent être appelés à partir de régions parallèles. Une recommandation de livre: "Using OpenMP" par Chapman, Jost, van der Pas & Kuck. Mes commentaires –

2

J'ai eu ce problème. C'est effrayant: je reçois des segfaults juste pour déclarer des tableaux 33x33 ou des tableaux 11x11x11 sans directives OpenMP; ces segcatults se produisent sur un Mac Intel avec 4 Go de RAM. Les rendre "allouables" plutôt que statiquement alloués ont résolu ce problème.