2017-09-29 6 views
0

Selon la spécification OpenMP, OMP_CANCELLATION doit être défini sur true pour que les instructions telles que #pragma omp cancel puissent avoir un effet. J'ai besoin que la fonctionnalité d'annulation soit activée pour que mon programme fonctionne correctement (un bouton d'abandon de GUI qui déclenche l'annulation, si c'est important).Activer l'annulation depuis le programme interne

J'ai essayé de mettre OMP_CANCELLATION à partir du programme avec

setenv("OMP_CANCELLATION", "true", 1); 

la première ligne du programme, mais cette déclaration n'a aucun effet. Si je manuellement export OMP_CANCELLATION=true d'un shell à l'extérieur avant d'exécuter le programme, l'annulation fonctionne correctement.

Est-il possible d'activer l'annulation depuis le programme sans que cette variable d'environnement ne soit définie de manière externe?

+0

Peut-être que la valeur est interrogée avant même que 'main()' s'exécute? Il y a un fil [ici] (https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/700267) qui suggère au moins que ce n'est pas possible (mais il s'agit de FORTRAN). –

+0

Il peut être utile de poser votre question sur le forum OpenMP ARB http://forum.openmp.org/forum/viewforum.php?f=3 de cette façon, il y a une chance que les personnes impliquées dans le standard remarquent cette omission ... –

Répondre

0

Bien qu'il ne soit pas possible d'activer l'annulation une fois que le programme démarre (selon la réponse de Zulan), j'ai réussi à trouver une solution de contournement:

char *hasCancel = getenv("OMP_CANCELLATION"); 
if (hasCancel == nullptr) { 
    printf("Bootstrapping..."); 
    setenv("OMP_CANCELLATION", "true", 1); 
    // Restart the program here 
    int output = execvp(argv[0], argv); 
    // Execution should not continue past here 
    printf("Bootstrapping failed with code %d\n",output); 
    exit(1); 
} else { 
    puts("Bootstrapping complete"); 
} 

Je mets la variable dans le programme et utiliser ensuite un appel exec pour redémarrer le processus. Le processus redémarré aura OMP_CANCELLATION correctement défini avant de commencer.

1

Il est impossible selon le standard (Chapter 4):

Modifications des variables d'environnement après le démarrage du programme, même modifié par le programme lui-même, sont ignorés par la mise en œuvre OpenMP. Cependant, les paramètres de certains ICV peuvent être modifiés pendant l'exécution du programme OpenMP en utilisant les clauses de directives appropriées ou les routines OpenMP API .

Une telle façon de modifier la valeur de annuler-var est spécifié (2.3.3).

Vous pouvez résoudre ce problème en écrivant un programme/script wrapper.

Certaines implémentations pourraient fournir des moyens de modifier la valeur indépendamment de ce que dit la norme. Mais compter sur cela ne serait pas portable.