관리자는 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)ldd
OpenMP 지원을 위해 이를 사용하여 "libgomp"가 포함되어 있는지 확인할 수도 있습니다 .