2017-07-19 4 views
1

Je voudrais exécuter une fonction Fortran90 avec différents paramètres dans différents std::threads, qui utilise de nombreux modules pour stocker les paramètres et quelques données générales. Le problème que je vois est que les modules Fortran sont comme des objets singleton. Lorsque j'appelle la fonction avec deux threads, ils fonctionnent sur le même module. Y at-il un moyen de rendre les modules threadprivate comme avec openmp?Utiliser le module Fortran en C++ avec std :: thread

Par exemple avec OpenMP un module avec des données threadprivate ressemble à ceci:

MODULE EXAMPLE 
    USE OMP_LIB 
    ! some threadprivate data: 
    INTEGER           :: VALUE = 0 
    ! make value threadprivate. 
    !$OMP THREADPRIVATE(VALUE) 
    CONTAINS 
END MODULE EXAMPLE 

Puis-je faire quelque chose de similaire pour le std::thread?

+1

Il n'y a pas de norme qui couvre cela, mais au moins sur certains systèmes ELF (notamment Linux), GNU OpenMP runtime et 'std :: thread' utilisent tous deux ELF TLS pour stocker les variables locales. Ainsi, les variables privées OpenMP OpenMP sont également locales dans les threads C++. Encore une fois, ce n'est ni standard ni portable. –

+1

Notez que même sur Linux, il y a plus de temps d'exécution que de GOMP. Ils peuvent être compatibles avec cette fonctionnalité mais ils ne sont pas compatibles en général. Mais les threads C++ sont très susceptibles d'être implémentés sur le même calque de bas niveau (par exemple les threads POSIX) que les threads OpenMP, ce qui est assez naturel. –

Répondre

1

Les threads standard C++ sont complètement étrangers à Fortran. il n'y a rien que vous pouvez faire dans Fortran,

Vous devez implémenter tout vous-même d'une manière qui stocke les données d'une autre manière et non dans les variables globales (module).

+0

Merci pour votre réponse. En fait, j'espérais éviter la réimplémentation de la bibliothèque. Je suppose qu'il n'y a peut-être pas d'autre moyen. – andrew28349