2013-06-13 2 views
2

Dans mon projet C++, il existe plusieurs instructions #pragma omp parallel for private(i). Lorsque j'essaie de repérer les bogues dans mon code à l'aide de valgrind, les ornements OpenMP entraînent des messages de fuite de mémoire «éventuellement perdus». Je voudrais désactiver totalement toutes les déclarations #pragma susmentionnées afin que je puisse isoler le problème.Désactivation des instructions pragmatiques OpenMP partout dans mon projet C++

Cependant, j'utilise omp_get_wtime() dans mon code, et je ne souhaite pas désactiver ces appels de fonction. Je ne veux donc pas totalement désactiver toutes les fonctionnalités OpenMP dans mon projet. Comment puis-je simplement désactiver toutes les instructions #pragma omp parallel for private(i)?

J'utilise Eclipse CDT pour gérer automatiquement les fichiers makefiles, et donc je compile normalement en mode release par: make all -C release. Idéalement, je voudrais une solution à mon problème qui me permette de compiler en utilisant une instruction telle que make all -C release -TURN_OFF_PARALLEL qui se traduirait par toutes les instructions #pragma susmentionnées étant désactivées.

Répondre

1

La solution la plus simple est de:

  1. désactiver OpenMP
  2. lien les fonctions de la bibliothèque stub OpenMP

Dans le cas où votre mise en œuvre de OpenMP ne fournit pas de fonctions stub, vous pouvez créer votre propre copie à partir de l'annexe B du standard.

+0

Pouvez-vous préciser ce que vous entendez par "lier les fonctions de la librairie OpenMP stub"? – synaptik

+0

L'idée est de lier une librairie _serial_ avec l'API définie dans 'omp.h'. Certains compilateurs fournissent un drapeau pour faire cela, donc la seule chose dont vous avez besoin est simplement de changer un drapeau au moment de la compilation. Ceci, par exemple, est une [référence pour Intel] (http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/copts/common_options/option_openmp_stubs.htm) – Massimiliano

+0

Quelle est votre opinion sur l'utilisation de 'boost :: timer' [class] (http://www.boost.org/doc/libs/1_53_0/libs/timer/doc/cpu_timers.html) au lieu de OpenMP' omp_get_wtime () 'Fonction? Parce que je n'utilise aucune autre fonction OpenMP. – synaptik

1

Pour GCC, je ne vois pas d'option pour utiliser uniquement les stubs. L'annexe B de la norme OpenMP dit

double omp_get_wtime(void) 
    { 
    /* This function does not provide a working 
    * wallclock timer. Replace it with a version 
    * customized for the target machine. 
    */ 
    return 0.0; 
    } 

Cela ne sert à rien si vous voulez vraiment l'heure. Avec GCC, soit vous devez écrire votre propre fonction de temps ou vous cherchez "#pragma omp" et le remplacer par "// # pragma omp"

Plutôt que de changer la base de code entière, vous pouvez implémenter votre propre fonction de temps pour GCC seulement. Computing time in linux :granularity and precision

+0

Voir de cette façon: en implémentant le stub 'omp_get_wtime()' vous modifiez une bibliothèque de substitution externe en un seul endroit. Votre conseil est de modifier potentiellement toute la base de code d'un projet. – Massimiliano

+0

Oui, je comprends, mais l'écriture de votre propre fonction de minutage multiplateforme précise peut être une douleur, c'est tout l'intérêt d'utiliser omp_get_wtime(). –

2

Après une habitation autour an interesting question d'un code OpenMP non-travail, il se avère qu'il est parfaitement possible d'obtenir l'équivalent d'un talon OpenMP lib avec GCC que par le remplacement de la -fopenmp avec -lgomp. Je doute qu'il s'agissait d'une fonctionnalité prévue, mais cela fonctionne néanmoins hors de la boîte.

Questions connexes