2011-02-11 3 views
3

나는 C++ 루틴 standalone_c.cpp와 standalone_c.cpp를 래핑하는 fortran standalone_f.f90에 대한 래퍼를 가지고 있습니다. standalone_c.cpp는 openmp pragma를 사용하여 다중 스레드됩니다. standalone_c.cpp와 wrapper standalone_f.f90을 모두 컴파일 할 수 있습니다. 그러나이 둘을 연결하려고하면 omp_get_thread_num에 대한 정의되지 않은 참조, omp_get_num_procs에 대한 정의되지 않은 참조와 같은 오류가 발생합니다. 누구든지 Fortran 루틴에서 다중 스레드 C 또는 C++ 코드를 호출하는 경험이 있습니까? 아무도 이것이 왜 일어나고 있는지 짐작할 수 있습니까?Fortran 루틴에서 다중 스레드 (openmp) C++ 루틴 호출

충분한 의사가 있으면 의사 코드를 게시 할 수 있습니다.

편집 : 컴파일 명령 :

gcc-4.3.3/bin/g++ -O -openmp $(IFLAGS) -c standalone_c.cpp 
fce/10.1.015/bin/ifort -g -O0 standalone_f.f90 
fce/10.1.015/bin/ifort $(LFLAGS) standalone_c.o standalone_f.o -o standalone 

IFLAGS 내가 할 몇 가지 라이브러리, LFLAGS 그 라이브러리에 대한 링커 플래그입니다 있습니다.

+0

컴파일하고 링크하는 데 사용하는 명령은 도움이 될 것입니다. – suszterpatt

+0

해당하는 것을 의미합니다. – Anu

답변

3

ifort의 -openmp 플래그는 OpenMP 지정 문 처리를 설정하는 것 이상의 역할을합니다. 또한 적절한 라이브러리에 링크되어 있습니다. 서브 루틴 이름 지정 문제에서 밑줄을 처리했다고 가정하면 ifort 링크 단계에 -openmp를 추가하면 OpenMP 라이브러리가 처리되고 -lstdC++를 추가하면 __gxx_personality_v0과 같은 C++ 참조가 처리됩니다.

또는 ifort에서 제공하는 옵션을 사용할 수 있습니다. 간단한 예를 들면 : 당신은 OpenMP를 (-openmp)는 GNU의 OpenMP 런타임 라이브러리 libgomp (-openmp-lib 디렉토리의 compat)와 호환 및 C++ 실행 -를 사용하여 연결을 사용하는 ifort 말할 필요

$> cat a.f90 
program a 
    print *, "calling C++ program" 
    call b() 
end program a 

$> cat b.cpp 
#include <omp.h> 
#include <stdio.h> 

extern "C" { 
void b_(void); } 

void b_(void) { 
    int i; 

    #pragma omp parallel for 
    for (i = 0; i < 10; i++) 
    printf("t#: %i i: %i\n", omp_get_thread_num(), i); 

} 

$> g++ -fopenmp -c -o b.o b.cpp 
$> ifort -g -O0 -c -o a.o a.f90 
$> ifort -openmp -cxxlib -openmp-lib compat b.o a.o 
$> export OMP_NUM_THREADS=4 
$> a.out 
calling C++ program 
t#: 2 i: 6 
t#: 2 i: 7 
t#: 2 i: 8 
t#: 3 i: 9 
t#: 0 i: 0 
t#: 0 i: 1 
t#: 0 i: 2 
t#: 1 i: 3 
t#: 1 i: 4 
t#: 1 i: 5 

g ++ (-cxxlib)에서 제공하는 실시간 라이브러리.

+0

고마워요! 정말 명확한 대답, 나는 -openmp-lib compat 플래그가 누락되었습니다. – Anu

0

GNU 컴파일러의 경우 OpenMP를 활성화하는 명령 줄 옵션은 예제에서와 같이 -openmp가 아니라 -openmp입니다.

둘째, -fopenmp 옵션을 사용하면 컴파일러에서 GNU OpenMP 지원 라이브러리 (libgomp)에 대한 호출을 생성합니다. gortran이 아니라 ifort와의 최종 연결 단계를 수행 할 때 명시 적으로 해당 라이브러리에 링크해야합니다.

-fopenmp가 기본 프로그램에 일부 설정 호출을 추가하는 경우에도 문제가 발생할 수 있습니다. 우선 ifort 대신 GNU Fortran 컴파일러 (gfortran)를 사용하여 프로그램을 실행할 수 있는지 확인합니다. Fortran 코드가 OpenMP 자체를 사용하지 않더라도 gfortran 플래그에 -fopenmp를 추가해야합니다.

+0

고마워, 내가 다른 이유로 ifort를 사용해야하고 플래그가 -openmp가 아니라 -fopenmp (-fopenmp가 유효한 플래그로 ifort에 의해 인식되지 않음) – Anu

+1

그는 g ++에 대한 호출에 대해 의견을 말하고있었습니다. -openmp (ifort에 의해 사용되는)보다는 fopenmp. – ejd