2011-06-15 3 views
21
OpenMP를 들어

에 OpenMP를 지정 내 코드 (예 :의 #pragma OMP 그 ... 등)의 지시를 사용하지 않고 (예를 들어, omp_get_thread_num을())의 API의 기능을 사용할 때는 GCC

  1. 이유를 직접 지정 libgomp.a 대신 작동하지 않습니다 을 -fopenmp 사용 GCC, 에 같은

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello 
    

    는 업데이트 : 난 그냥 libgomp.a에 연결하면 작동하지 않는 것을 발견하지만,에 연결 libgomp.so가 작동합니다. OpenMP가 정적 링크가 될 수 없다는 것을 의미합니까?

  2. -fopenmp에만 작동하는 이유

  3. 라이브러리 파일

    을 지정 없이
    gcc hello.c -fopenmp -o hello 
    

    업데이트 : 즉이 -fopenmp 사용하는 경우, 이유를 명시 적 libgomp.so에 연결이 필요하지 않습니까?

  4. 그 이유는 컴파일 않습니다 어떤이있는 경우
    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello 
    

    이 코드에서 를 OpenMP 지시자를 무시합니까?

감사합니다.

+0

GCC 문서에서 : -fopenmp 플래그는 또한 OpenMP 런타임 라이브러리의 자동 연결을 조정합니다. 자세한 내용은 http://gcc.gnu.org/onlinedocs/libgomp/Enabling-OpenMP를 참조하십시오.html # Enabling-OpenMP – 465544

답변

22

일반적으로 지시어와 함수는 다른 것들입니다. 전자는 -fopenmp에 의해 제어되고 후자는 OpenMP 라이브러리에 링크하여 제어됩니다.

  1. (댓글하여 업데이트 ) 정적 OpenMP를 연결하는 -fopenmp-static 옵션을 사용해보십시오. 이는 -lgomp -lrt을 의미하기 때문에 librt.a의 위치도 지정하지 않으면 다음 명령이 올바르게 컴파일되지 않습니다.

    gcc hello.c /usr/lib/gcc/i686-linux-gnu/4.4/libgomp.a -o hello 
    
  2. 나는 OpenMP를 라이브러리 라이브러리 경로에 이미 및 시스템의 동적 링커가 자동으로 libgomp.so와 연결되어 있기 때문에 다음 명령이 제대로 컴파일 상상 (는 의견하여 업데이트).

    gcc hello.c -fopenmp -o hello 
    
  3. 는 OpenMP를 (libgomp.so)에 대한 공유 객체에 연결되어 있기 때문에 다음 명령은 아마 제대로 컴파일된다. -static 옵션은 이 아니며이 사용되지 않습니다.

    gcc hello.c -L/usr/lib/gcc/i686-linux-gnu/4.4/ -lgomp -o hello 
    

    -fopenmp 옵션을 지정하지 않으면 OpenMP 지정 문을 무시해야합니다.

+0

고마워! API없이 지시문없이 코드를 고려하고 있습니다. (1) 방금 libgomp.a에 링크하는 것이 작동하지 않지만 libgomp.so에 링크가 작동한다는 것을 알았습니다. OpenMP가 정적 링크가 될 수 없다는 것을 의미합니까? (2) -fopenmp를 사용할 때 libgomp.so에 대한 명시 적 링크가 필요한 이유가 무엇입니까? – Tim

+3

(1) "-fopenmp -static"를 사용하여 정적으로 OpenMP를 연결할 수 있습니다. 당신이 발견하게 될 것은 이것이 지정 될 때 "-lgomp -lrt"를 사용한다는 것입니다. (2) 시스템이 다이나믹 링커를 지원하면 사용되며 -fopenmp를 지정하면 libgomp.so와 링크됩니다. – ejd

+0

컴파일러와 링커 모두'-fopenmp' 플래그가 필요합니다. – Royi