![如何检查 libfftw3_threads.so.3.2.4 共享库是否是为 pthreads 或 OpenMP 编译的?](https://linux22.com/image/2460/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%20libfftw3_threads.so.3.2.4%20%E5%85%B1%E4%BA%AB%E5%BA%93%E6%98%AF%E5%90%A6%E6%98%AF%E4%B8%BA%20pthreads%20%E6%88%96%20OpenMP%20%E7%BC%96%E8%AF%91%E7%9A%84%EF%BC%9F.png)
管理员在系统范围内安装了 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 支持(最好)或 pthreads 进行编译?
答案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)
根据快速的网络搜索,看起来该程序必须链接到GCC OpenMP 支持库 (GOMP)对于 OpenMP 支持,因此您也可以使用它ldd
来检查其中是否包含“libgomp”。