web-dev-qa-db-ja.com

OpenMPをGCCに指定する

OpenMPの場合、自分のコードがそのディレクティブ(#pragma omp ...など)を使用せずにAPIの関数(omp_get_thread_num()など)を使用している場合、

  1. -fopenmpを使用する代わりにlibgomp.aをgccに直接指定しても機能しないのはなぜですか。

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

    pdate: libgomp.aへのリンクは機能しないが、libgomp.soへのリンクは機能することがわかりました。 OpenMPは静的にリンクできないということですか?

  2. -fopenmpがライブラリファイルを指定せずにのみ機能する理由

    gcc hello.c -fopenmp -o hello
    

    pdate:言い換えると、-fopenmpを使用するときに、libgomp.soへの明示的なリンクが不要なのはなぜですか?

  3. なぜこれもコンパイルするのですか?

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

    コードにOpenMPディレクティブがある場合、これは無視されますか?

よろしくお願いします!

24
Tim

一般に、ディレクティブと関数は異なるものであることに注意してください。前者は-fopenmpによって制御され、後者はOpenMPライブラリにリンクすることによって制御されます。

  1. コメントを組み込むように更新-fopenmpおよび-staticオプションを使用してOpenMPを静的にリンクしてみてください。これは-lgomp -lrtを意味するため、librt.aの場所も指定しない限り、次のコマンドは正しくコンパイルされません。

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a  -o hello
    
  2. コメントを組み込むように更新)OpenMPライブラリがすでにライブラリパスにあり、システムのダイナミックリンカーがlibgomp.soに自動的にリンクしているため、次のコマンドは正しくコンパイルされていると思います。

    gcc hello.c -fopenmp -o hello
    
  3. 次のコマンドは、OpenMP(libgomp.so)の共有オブジェクトにリンクしているため、おそらく正しくコンパイルされています。 -staticオプションは使用されていないことに注意してください

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

    -fopenmpオプションを指定しない場合、OpenMPディレクティブは無視されます。

25
Chris Frederick