libfftw3_threads.so.3.2.4共有ライブラリがpthreadまたはOpenMP用にコンパイルされているかどうかを確認する方法は?

libfftw3_threads.so.3.2.4共有ライブラリがpthreadまたはOpenMP用にコンパイルされているかどうかを確認する方法は?

管理者はFFTWライブラリをシステム全体/usr/lib64にインストールしました/usr/lib64/libfftw3_threads.so.3.2.4

このライブラリを直接コンパイルしたとき、sysadminを使用してインストールする前に次のことを行う必要があることがわかりました。MPを開くそして並列スレッドバージョン:

  • --enable-openmp:と似ています--enable-threadsが、OpenMPコンパイラディレクティブを使用して独自のスレッドを直接生成するのではなく、並列性を導きます。異なる並列化メカニズム間の競合を最小限に抑えるために、すでにこれらのディレクティブを使用しているプログラムに特に役立ちます。またはどちらかを使用してください--enable-openmp--enable-threadsどちらの場合も、マルチスレッドFFTWインターフェイス/ライブラリ(マルチスレッドFFTWを参照)は別のバックエンドにコンパイルされます。

ディストリビューションはGentooなので、理論的にはどちらも可能です。

そのライブラリがOpenMPサポート(好ましくは)またはpthreadでコンパイルされていることをどのように確認できますか?

答え1

これを呼び出して使用するかどうかlddを確認できます。-fopenmp

$ cat x.c 
int foo()
{ return 0 ; }

$ gcc -shared -fopenmp x.c -o x.so
$  ldd x.so
    linux-vdso.so.1 =>  (0x00007fff293d6000)
    libgomp.so.1 => /usr/lib/libgomp.so.1 (0x00007fa942998000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa94277b000)
    libc.so.6 => /lib/libc.so.6 (0x00007fa9423f7000)
    librt.so.1 => /lib/librt.so.1 (0x00007fa9421ef000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa942dc7000)

これは libpthread と libgomp の両方にリンクされていることを意味します。

$ gcc -shared x.c -o x.so
$ ldd x.so                        
    linux-vdso.so.1 =>  (0x00007fff5fbff000)
    libc.so.6 => /lib/libc.so.6 (0x00007f5340a9b000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f534103f000)

これはopenmpのサポートが含まれていないことを意味します。

通常、どのコンパイラフラグが使用されているかを確認するのは簡単ではありません。基本的にはバイナリに文書化されていないので

おそらく、パッケージのインストール中に生成されたいくつかのGentooログファイルを見ることができます(パッケージのコンパイル時間を意味します)。

もちろん、バイナリパッケージベースのディストリビューション(Debianなど)ではこの問題は発生しません。 .soファイルが属するパッケージを検索し、パッケージの説明やコンパイラがスイッチを指定したソースパッケージを表示できます。 。

答え2

少なくともライブラリがpthreadに関連付けられていることを確認できますldd。 Debian squeezeでは、私のバージョンはpthreadに関連付けられています。

$ ii  libfftw3-3      3.2.2-1      library for computing Fast Fourier Transforms

$ ldd /usr/lib/libfftw3_threads.so.3.2.4
linux-gate.so.1 =>  (0xb77be000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb776c000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7753000)   <---
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb760c000)
/lib/ld-linux.so.2 (0xb77bf000)

クイックWeb検索によると、プログラムは次に接続する必要があるようです。GCC OpenMPサポートライブラリ(GOMP)lddOpenMPをサポートするためにこれを使用して、「libgomp」が含まれていることを確認することもできます。

関連情報