Como verificar se a biblioteca compartilhada libfftw3_threads.so.3.2.4 foi compilada para pthreads ou para o OpenMP?

5

Existe uma biblioteca FFTW instalada por um administrador em todo o sistema, em /usr/lib64 , e inclui /usr/lib64/libfftw3_threads.so.3.2.4 .

Quando eu mesmo compilei essa biblioteca, antes de ela ser instalada pelo sysadmin, notei que você deve escolher entre a versão OpenMP e pthreads :

  • --enable-openmp: Like --enable-threads, but using OpenMP compiler directives in order to induce parallelism rather than spawning its own threads directly. Useful especially for programs already employing such directives, in order to minimize conflicts between different parallelization mechanisms. Use either --enable-openmp or --enable-threads, not both; in either case the multi-threaded FFTW interface/library (see Multi-threaded FFTW) is compiled (with different back ends).

A distribuição é do Gentoo, então, teoricamente, é possível.

Como verificar se essa biblioteca foi compilada com o suporte do OpenMP (qual seria o melhor) ou com o pthreads?

    
por Jakub Narębski 13.06.2011 / 21:38

2 respostas

4

Você pode verificar se a biblioteca está vinculada ao pthread, pelo menos, usando ldd . No Debian squeeze, minha versão está vinculada ao 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)

Com base em uma pesquisa rápida na rede, parece que o programa teria que se vincular à biblioteca de suporte do GCC OpenMP (GOMP) para suporte OpenMP, então você pode usar ldd para procurar por algo com "libgomp" também.

    
por 13.06.2011 / 21:46
5

Você pode chamar ldd para ver se -fopenmp foi usado:

$ 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)

Significa que ambos estão ligados ao libpthread e 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)

Significa que não inclui suporte a openmp.

Em geral, não é assim tão fácil ver quais flags do compilador foram usadas desde que não sejam registrados no binário por padrão .

Talvez você possa olhar para algum arquivo de log do Gentoo que foi criado durante a instalação do pacote (ou seja, tempo de compilação do pacote).

Claro que com a distribuição baseada em pacotes binários (como, por exemplo, Debian) você não tem esse problema - você pode olhar para qual pacote o arquivo .so pertence, e olhar a descrição do pacote e / ou o pacote fonte, onde as opções do compilador são especificadas.

    
por 13.06.2011 / 21:59