2017-07-11 4 views
1

J'ai essayé de paralléliser un algorithme d'optimisation écrit en FORTRAN90 et compilé/exécuté en utilisant l'interface cygwin avec gfortran XXXXX -fomp.cygwin OMP Core Dump

L'algorithme calcule une matrice de gradient et de Hesse par des différences finies à partir d'un appel de sous-programme. Le sous-programme est assez grand et implique la manipulation d'une matrice de ~ 2 mb à chaque fois. Pour les besoins de la discussion, j'utiliserai "call srtin()" comme exemple de l'appel du sous-programme.

Sans utiliser de code OMP n'importe où dans la compilation, le programme échoue si j'utilise l'option -fomp lors de la compilation (le code se compile sans accroc). La compilation et l'exécution régulières à l'aide de gfortran ne posent aucun problème. Cependant, au moment où j'ajoute l'option -fomp, l'exécutable résultant provoque une erreur de segmentation si un seul appel à srtin() est présent.

J'ai lu sur ce site qu'un problème commun avec omp est des problèmes de stack. J'ai déduit (peut-être faux) que la taille de la pile de threads maître est en cause parce que je n'ai pas encore inclus de code qui créerait des threads esclaves. D'après ce que j'ai compris, sur un ordinateur linux typique, j'utiliserais «ulimit -s XXX» pour réinitialiser cette pile à une valeur suffisamment élevée pour que l'erreur ne se produise plus. J'ai essayé ceci par mon interface de cygwin, mais l'erreur persiste. J'ai également essayé d'utiliser la commande peflags pour définir une mémoire de pile plus élevée pour cet exécutable sans succès. J'ai également augmenté la variable d'environnement OMP_STACKSIZE sans succès.

Quelqu'un a-t-il des suggestions?

+0

J'utilise -Wl, - pile, 900000000 dans l'étape de liaison cygwin64 gfortran pour -fopenmp pour éviter une défaillance due à une taille de pile primaire insuffisante. Je pense que la variable d'environnement OMP_STACKSIZE est supportée, bien que je n'ai pas vu documenté quelles variables d'environnement sont supportées par libgfortran sous Windows. Je ne sais pas combien de pile peut être supportée par 32 bits cygwin gfortran; Je pense que c'est beaucoup moins. – tim18

Répondre

0

L'activation de OpenMP dans GCC désactive le placement automatique de grands tableaux sur le tas. Ainsi, il pourrait faire planter votre programme même s'il n'y a pas de construction OpenMP dans le code. Windows n'a pas d'équivalent de ulimit -s car la taille de la pile du thread principal est lue dans l'en-tête PE du fichier exécutable. OMP_STACKSIZE contrôle la taille de la pile des threads de travail et n'affecte pas celle du thread principal.

Utilisez -Wl,--stack,some_big_value comme conseillé par @ tim18 au lieu de modifier l'en-tête PE avec peflags. some_big_value est en octets. Voir here pour plus d'informations.

+0

Super, merci. Ajouter '-Wl, - stack, some_big_value' à la ligne de compilation a fait l'affaire. –