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 지원이 포함되지 않음을 의미합니다.

일반적으로 어떤 컴파일러 플래그가 사용되는지 확인하는 것은 쉽지 않습니다.기본적으로 바이너리에 문서화되어 있지 않기 때문에.

아마도 패키지 설치 중에 생성된 일부 젠투 로그 파일을 볼 수 있을 것입니다(패키지 컴파일 시간을 의미합니다).

물론 바이너리 패키지 기반 배포판(예: 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)lddOpenMP 지원을 위해 이를 사용하여 "libgomp"가 포함되어 있는지 확인할 수도 있습니다 .

관련 정보