Désactivation des instructions pragmatiques OpenMP partout dans mon projet c ++

Dans mon projet c ++, il existe plusieurs #pragma omp parallel for private(i) instructions #pragma omp parallel for private(i) . Lorsque j’essaie de localiser des bogues dans mon code à l’aide de valgrind, les ornements OpenMP génèrent des messages de fuite de mémoire “éventuellement perdus”. Je souhaite désactiver totalement toutes les instructions #pragma susmentionnées afin de pouvoir isoler le problème.

Cependant, j’utilise omp_get_wtime() dans mon code et je ne souhaite pas désactiver ces appels de fonction. Je ne souhaite donc pas désactiver totalement toutes les fonctionnalités OpenMP de mon projet.

Comment puis-je simplement désactiver tous les #pragma omp parallel for private(i) déclarations #pragma omp parallel for private(i) ?

J’utilise Eclipse CDT pour gérer automatiquement les makefiles. Je comstack donc normalement en mode release en: make all -C release . Idéalement, j’aimerais une solution à mon problème qui me permette de comstackr à l’aide d’une instruction telle que make all -C release -TURN_OFF_PARALLEL ce qui aurait pour effet de make all -C release -TURN_OFF_PARALLEL toutes les instructions #pragma susmentionnées.

La solution la plus simple consiste à:

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

Si votre implémentation OpenMP ne fournit pas de fonctions de stub, vous pouvez créer votre propre copie à partir de l’Annexe B de la norme .

Après avoir -fopenmp en -lgomp une question intéressante concernant un code OpenMP non fonctionnel, il s’avère qu’il est parfaitement possible d’obtenir l’équivalent d’un OpenSt Lib stub avec GCC en ne remplaçant que -fopenmp par -lgomp . Je doute que ce soit une fonctionnalité voulue, mais cela fonctionne quand même.

Pour GCC, je ne vois pas d’option permettant d’utiliser uniquement les talons. 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; } 

C’est inutile si vous voulez vraiment le temps. Avec GCC, vous devez écrire votre propre fonction de temps ou rechercher “#pragma omp” et le remplacer par “// # pragma omp”

Plutôt que de changer toute la base de code, vous pouvez implémenter votre propre fonction de temps pour GCC uniquement. Temps de calcul sous Linux: granularité et précision