Question

Est-il sûr d'utiliser le ARPACK eigensolver de différents threads en même temps de un programme écrit en C? Ou, si ARPACK lui-même est pas thread-safe, est-il un thread-safe mise en œuvre compatible avec l'API là-bas? Une recherche rapide sur Google ne se est pas quelque chose d'utile, mais étant donné le fait que ARPACK est largement utilisé dans de grands calculs scientifiques, je trouve très surprenant d'être le premier qui a besoin d'un eigensolver clairsemé thread-safe.

Je ne suis pas trop familier avec Fortran, donc je traduis le code source ARPACK à C en utilisant f2c, et il semble qu'il y ait assez peu de variables statiques. En fait, toutes les variables locales dans les routines traduites semblent être statiques, ce qui implique que la bibliothèque elle-même est pas thread-safe.

Était-ce utile?

La solution

Fortran 77 ne supporte pas récursion, et donc un compilateur standard conforme peut affecter toutes les variables dans la section de données du programme; en principe, ni pile, ni un tas est nécessaire [1].

Il est peut-être que c'est ce que F2C fait, et si oui, il se pourrait que c'est l'étape de F2C qui rend le programme non thread-safe, plutôt que le programme lui-même. Bien sûr, comme d'autres l'ont mentionné, vérifier les blocs communs ainsi. EDIT : En outre, vérifier les directives explicites SAVE. ENREGISTRER signifie que la valeur de la variable doit être conservée entre les invocations ultérieures de la procédure, semblable à statique C. Maintenant, allouer toutes les procédures données locales dans la section de données fait toutes les variables implicitement SAVE et malheureusement, il y a beaucoup de vieux du code qui suppose cette même si ce n'est pas garanti par la norme Fortran. Un tel code, évidemment, n'est pas thread-safe. WRT. ARPACK spécifiquement, je ne peux rien promettre, mais ARPACK est généralement bien considéré et largement utilisé, donc je serais surpris si elle a souffert de ce genre de problèmes pont poussiéreux.

La plupart des compilateurs Fortran modernes font de l'allocation utilisation de la pile. Vous pourriez avoir une meilleure chance pour compiler ARPACK avec, disons, gfortran et l'option -frecursive.

EDIT :

[1] Non pas parce qu'il est plus efficace, mais parce que Fortran a été conçu avant que des piles et des tas ont été inventés, et pour quelque raison que le comité des normes voulait conserver la possibilité de mettre en œuvre Fortran sur le matériel avec ni pile ni tas supportent tous les chemin jusqu'à Fortran 90. en fait, je suppose que les piles sont plus efficaces sur le matériel d'aujourd'hui fortement dépendant du cache plutôt que l'accès aux données locales procédure qui se propage dans toute la section de données.

Autres conseils

J'ai converti ARPACK à C en utilisant f2c. Chaque fois que vous utilisez f2c et vous souciez de fil de sécurité, vous devez utiliser le commutateur -a. Cela rend les variables locales ont a stockage UTOMATIQUE, à savoir être locaux basés pile plutôt que statique qui est la valeur par défaut.

Même si, ARPACK lui-même est décidément pas threadsafe. Il utilise beaucoup de blocs communs (à savoir les variables globales) pour préserver l'état entre les différents appels à ses fonctions. Si ma mémoire est bonne, il utilise une interface de communication inverse qui tend à principaux développeurs d'utiliser des variables globales. Et bien sûr, ARPACK probablement été écrit bien avant que le multi-threading commun.

J'ai fini par Retravailler le code converti en C pour éliminer systématiquement toutes les variables globales. J'ai créé une poignée de C struct et déplacé progressivement les variables globales dans ces structures. Enfin, je passais des pointeurs vers ces struct à chaque fonction qui avait besoin d'accéder à ces variables. Bien que je pouvais avoir converti chaque globale en un paramètre où il était nécessaire, il était beaucoup plus propre pour les garder tous ensemble, contenu dans struct.

Pour l'essentiel, l'idée est de convertir les variables globales dans les variables locales.

ARPACK utilise BLAC droit? Ensuite, les bibliothèques doivent être trop sûr de fil. Je crois que votre idée de vérifier avec F2C pourrait ne pas être un moyen de preuve de balle de dire si le code Fortran est sûr de fil, je suppose que cela dépend aussi du compilateur Fortran et les bibliothèques.

Je ne sais pas quelles sont les utilisations f2c de stratégie pour traduire Fortran. Depuis ARPACK est écrit en FORTRAN 77, la première chose à faire est de vérifier la présence de blocs communs. Ce sont des variables globales, et si elle est utilisée, le code est très probablement pas thread-safe. La page Web ARPACK, http://www.caam.rice.edu/software/ARPACK/, dit qu'il ya une version parallèle - il semble probable que cette version est threadsafe

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top