Je suis en train de modifier un vieux code Fortran pour qu'il fonctionne avec des directives OpenMP, et il fait un usage intensif de COMMON
bloc. J'ai trouvé plusieurs sources qui disent que l'utilisation de directives OMP pour déclarer des COMMON
blocs comme THREADPRIVATE
résout le problème de la COMMON
résidant dans la portée globale en donnant à chaque thread OpenMP sa propre copie. Ce dont je ne suis pas sûr, cependant, c'est si l'option THREADPRIVATE
doit figurer après la déclaration dans chaque sous-routine, ou si le fait de la placer dans la principale (et unique) sousroutine de l PROGRAM
est-elle suffisante ?
Réponse
Trop de publicités?Oui, il doit l'être à chaque fois. En citant le Norme OpenMP 5.0
Si une directive threadprivate qui spécifie un nom de bloc commun apparaît dans une unité de programme, cette directive doit également apparaître dans toutes les autres unités de programme qui contiennent une instruction COMMON. chaque autre unité de programme qui contient une instruction COMMON qui qui spécifie le même nom. Elle doit apparaître après la dernière instruction COMMON dans l'unité de programme.
En guise de commentaire, l'introduction d'OpenMP dans un programme rempli de variables globales est susceptible de conduire à une vie de souffrance. Je réfléchirais au moins à "est-ce que je veux commencer par là" avant de me lancer dans une telle entreprise - la modernisation du code avant d'ajouter OpenMP pourrait s'avérer être une option plus facile et moins coûteuse, en particulier à long terme.