2017-12-04 13 views
0

OpenMP에서 병렬 처리되는 솔버 중 하나와 솔버를 비교하려고합니다. 솔버는 모두 Fixed Form Fortran 77을 사용하는 OpenMPI에서 병렬로 실행됩니다. mpif77은 -fopenmp 스위치로 오브젝트 파일을 링크시키지 않습니다. make는 실행 파일을 생성하지 않습니다. gfortran을 사용하여 OpenMP 소스 파일을 개별적으로 컴파일하려고 시도한 다음 mpif77과 링크하려고했습니다. 작동하지 않습니다. 예 경우OpenMPI를 사용하여 OpenMP로 MPI 프로그램을 컴파일 할 수 없습니다.

Undefined symbols for architecture x86_64: 
    "_GOMP_parallel", referenced from: 
     _parmatdiff_ in matdiff.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [solvercomp] Error 

1

내 질문은이 OpenMPI 실행 지원의 OpenMP을 수행하고, 내가 링크 기능으로 생성 된 오브젝트 파일을 '할'수 있도록 어떻게 : I 스위치를 사용하지 않는 경우는 일반적인 오류가 발생합니다 OpenMP 라이브러리에서? 여기

내 메이크 파일의 복사본입니다 :

SOURCES = solvcomp.f matdiff.f seqjacobi.f seqconjgrad.f parsor.f 
FCC = mpif77 
MPIRUN = mpirun 
OBJECTS = $(SOURCES:.f=.o) 
TARGET = soln 
FFLAGS = -o 
CFLAGS = -c 
NP = 4 

all: $(TARGET) clean 

$(TARGET): $(OBJECTS) 
     $(FCC) $(FFLAGS) $(TARGET) $(OBJECTS) 

$(OBJECTS): $(SOURCES) 
     $(FCC) $(CFLAGS) $(SOURCES) 

clean: 
    rm -rf *.o *.dSYM 
+0

어떤 MPI 버전을 사용하고 있습니까? 'mpif77 -fopenmp'에 의해 생성 된 에러를 게시 할 수 있습니까? –

+0

OpenMPI는 OpenMP가 표준 인 반면 MPI의 많은 구현 중 하나 일뿐입니다. 그래서 아주 다른 두 가지. 우리는 세부 사항을 더 알 필요가 있습니다 ([ask] 참조). 어떤 버전을 사용합니까? 'mpif77 -v'는 무엇을 인쇄합니까? 'make '에 의해 실행 된 마지막 명령은 어떻게 생겼습니까? 'make '의 완전한 출력은 어떻게 생겼습니까? –

+0

또한 "mpif77을 사용하여 개체 파일을 -fopenmp 스위치"*와 연결할 수없는 경우 정확히 무엇이 발생 했습니까? 세부 사항, 세부 사항, 세부 사항이 필요합니까? 오류 메시지가 있습니까? 'make'는 어떤 코만도를 실행합니까? * 완성 된 출력은 무엇입니까? 오류 메시지가 있습니까? 어디에서 플래그를 Makefile에 넣었습니까? –

답변

0

귀하의 링크 명령은

mpif77 -o -fopenmp a.out foo.o 

가에서 -o을 가지고, 지금까지 내가 걱정하고 같이

LDFLAGS='-fopenmp -o' 

을 시도 가짜 당신의 LDFLAGS 꽤 처음부터 엉망이 보인다.

+0

이로 인해 문제가 해결되었습니다. 부차적 인 질문 - 깃발의 순서가 중요합니까? –

+0

'-o a.out -fopenmp' 나'-fopenmp -o a.out' 둘 다 잘 작동합니다.'a.out'이'-o' 다음에 오는 한, LDFLAGS에'-o'가있는 이유입니다. 오류가 발생하기 쉽기 때문에 매우 틀에 닿지 않습니다. –

+0

@HimakarGanti 질문을 [편집]하십시오. 정말 중요합니다. 중요한 정보가 없으면 쓸모가 없다. 형식 지정이 모두 잘못되었으므로 귀하의 의견에서 복사 할 수 없습니다. –

0

는 OpenMPI 컴파일러 mpicc|mpic++|mpif70|...는 기본적으로 런타임에 필요한 헤더와 링크를 포함하기 위해 필요한 적절한 플래그 백엔드 컴파일러를 호출하는 프로그램입니다 도서관.

플래그 -showme을 추가하면 사용중인 컴파일러를 볼 수 있습니다. OpenMP가 표준이지만, 컴파일러는 프로그램이 OMP 구문을 해석하고 OpenMP 런타임 라이브러리와 링크해야 함을 나타 내기 위해 다른 플래그를 사용할 수 있습니다. 링크 명령에 -showme:link을 추가하여 백엔드 포트란 컴파일러에 전달되는 옵션을 확인할 수 있습니다.

MPI와 OpenMP는 일반적으로 함께 사용되는 두 가지 병렬 프로그래밍 모델이므로 프로그램에서 그렇게하는 것이 좋습니다.

https://www.open-mpi.org/doc/v2.0/man1/mpicc.1.php

+1

그렇습니다.하지만 OP가 잘못되었습니다. 그의 Makefile을 어떻게 수정해야합니까? –

+0

오류 메시지는 소스 파일을 컴파일하는 데'-fopenmp'가 사용되었지만 객체 파일을 연결할 때 생략되었음을 나타냅니다. 진짜 질문은 "'-fopenmp' 플래그로 링크 할 때 어떤 일이 발생합니까?"입니다. 지금까지 우리가 얻은 전부는 "도움이 안되네, 도와 줘!"였는데, 이것은 꽤 쓸모가 없다. –

+0

OpenMPI와 OpenMP는 최신 버전이다. 스테이지 연결을 위해 -fopenmp 플래그를 생략하면 위의 오류가 발생합니다. 추가하면 다음과 같은 오류가 발생합니다 : mpif77 -c -fopenmp solvcomp.f matdiff.f seqsor.f parsor.f mpif77 -o -fopenmp solvcomp solvcomp.o matdiff.o seqjacobi.o seqsor.o parsor .o gfortran : 오류 : solvcomp : 해당 파일이나 디렉토리가 없습니다. make : *** [solvcomp] Error 1 –