web-dev-qa-db-fra.com

Spécifiez OpenMP en GCC

Pour OpenMP, lorsque mon code utilise les fonctions de son API (par exemple, omp_get_thread_num ()) sans utiliser ses directives (telles que celles #pragma omp ...),

  1. pourquoi spécifier directement libgomp.a à gcc au lieu d'utiliser -fopenmp ne fonctionne pas, comme

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    

    pdate: Je viens de découvrir que la liaison à libgomp.a ne fonctionne pas, mais que la liaison à libgomp.so fonctionne. Cela signifie-t-il qu'OpenMP ne peut pas être lié statiquement?

  2. Pourquoi -fopenmp ne fonctionne que sans spécifier les fichiers de bibliothèque

    gcc hello.c -fopenmp -o hello
    

    pdate: En d'autres termes, lors de l'utilisation de -fopenmp, pourquoi un lien explicite vers libgomp.so n'est pas requis?

  3. Pourquoi cela compile-t-il également:

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    

    Cela ignorera-t-il les directives OpenMP dans le code s'il y en a?

Merci et salutations!

24
Tim

En général, gardez à l'esprit que les directives et les fonctions sont différentes; les premiers sont contrôlés par -fopenmp et les seconds sont contrôlés par un lien vers la bibliothèque OpenMP.

  1. (mis à jour pour intégrer les commentaires) Essayez d'utiliser les options -fopenmp Et -static Pour lier statiquement OpenMP. Étant donné que cela implique -lgomp -lrt, La commande suivante ne se compilera pas correctement, sauf si vous spécifiez également l'emplacement de librt.a.

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    
  2. (Mis à jour pour incorporer les commentaires) J'imagine que la commande suivante se compile correctement car la bibliothèque OpenMP est déjà dans votre chemin de bibliothèque et l'éditeur de liens dynamique de votre système se lie automatiquement avec libgomp.so.

    gcc hello.c -fopenmp -o hello
    
  3. La commande suivante se compile probablement correctement car elle se lie à l'objet partagé pour OpenMP (libgomp.so). Notez que l'option -static N'est pas utilisée .

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello
    

    Si vous ne spécifiez pas l'option -fopenmp, Les directives OpenMP doivent être ignorées.

25
Chris Frederick