2012-06-12 3 views
2

그래서 특정 MPI 구현의 성능 테스트에 NAS 벤치 마크를 사용하려고합니다. 그래서 나는 fortran 코드를 컴파일하러 갔다. 그리고 나는 장벽을 때리고있다. 나는이 컴파일러 오류 얻을gfortran : 잘못된 사전 처리기 지시문 및 잘못된 문자/숫자가 아닌 문자 컴파일 오류

gfortran -O0 -Wall -I/home/stephen/trunk/include -I. -c ./TestData/common/timers.f 

: 내가 컴파일하려면이 명령을 입력 할 때마다 여기에

Warning: mpif.h:2: Illegal pdreprocessor directive 
Warning: mpif.h:3: Illegal preprocessor directive 
Warning: mpif.h:4: Illegal preprocessor directive 
Warning: mpif.h:5: Illegal preprocessor directive 
Warning: mpif.h:6: Illegal preprocessor directive 
Warning: mpif.h:7: Illegal preprocessor directive 
Warning: mpif.h:8: Illegal preprocessor directive 
Warning: mpif.h:9: Illegal preprocessor directive 
Warning: mpif.h:12: Illegal preprocessor directive 
Warning: mpif.h:13: Illegal preprocessor directive 
Warning: mpif.h:14: Illegal preprocessor directive 
Warning: mpif.h:2: Illegal preprocessor directive 
Warning: mpif.h:3: Illegal preprocessor directive 
Warning: mpif.h:4: Illegal preprocessor directive 
Warning: mpif.h:5: Illegal preprocessor directive 
Warning: mpif.h:6: Illegal preprocessor directive 
Warning: mpif.h:7: Illegal preprocessor directive 
Warning: mpif.h:8: Illegal preprocessor directive 
Warning: mpif.h:9: Illegal preprocessor directive 
Warning: mpif.h:12: Illegal preprocessor directive 
Warning: mpif.h:13: Illegal preprocessor directive 
Warning: mpif.h:14: Illegal preprocessor directive 
mpif.h:1.1: 
    Included at ./TestData/common/timers.f:30: 

/* 
1 
Error: Non-numeric character in statement label at (1) 
mpif.h:1.2: 
    Included at ./TestData/common/timers.f:30: 

/* 
    1 
Error: Invalid character in name at (1) 
mpif.h:1.1: 
    Included at ./TestData/common/timers.f:50: 

/* 
1 
Error: Non-numeric character in statement label at (1) 
mpif.h:1.2: 
    Included at ./TestData/common/timers.f:50: 

/* 
    1 
Error: Invalid character in name at (1) 
make: *** [cg] Error 1 

을 실수를 범하는 timers.f 코드 (라인 30 & 50 라인을 포함한다)입니다 :

c---------------------------------------------------------------------                                   
c---------------------------------------------------------------------                                   
     subroutine timer_start(n) 
c---------------------------------------------------------------------                                   
c---------------------------------------------------------------------                                   
     implicit none 
     integer n 
     include 'mpif.h' 
     double precision start(64), elapsed(64) 
     common /tt/ start, elapsed 
     start(n) = MPI_Wtime() 
     return 
     end 
c---------------------------------------------------------------------                                   
c---------------------------------------------------------------------                                   
     subroutine timer_stop(n) 
c---------------------------------------------------------------------                                   
c---------------------------------------------------------------------                                   
     implicit none 
     integer n 
     include 'mpif.h' 
     double precision start(64), elapsed(64) 
     common /tt/ start, elapsed 
     double precision t, now 
     now = MPI_Wtime() 
     t = now - start(n) 
     elapsed(n) = elapsed(n) + t 
     return 
     end 

아이디어가 있으십니까? 나는 gfortran이 여러 종류의 전처리를 시도하고 시도 할 수 있도록 모든 종류의 명령 행 인자를 시도했다. (대부분이 맹목적으로 행해졌 다. 나는 인정한다.) 이상한 것은 필자가 컴파일러에서 숫자가 아닌 문자/*에 오류가 있다는 것인데, 이는 내 코드에 아무 것도 없기 때문에 꽤 잃어 버렸습니다.

감사합니다.

+0

사용중인 파일 접미사를 .f에서 .f90으로 변경하고 주석 줄 시작 문자를 c에서! –

+0

어떤 MPI 구현을 사용하고 있습니까? – mgilson

+0

'mpif.h'의 처음부터 몇 줄을 올릴 수 있습니까? –

답변

4

이 코드를 비표준 방식으로 컴파일하고있는 것입니다. mpi로 f77 또는 f90 코드를 컴파일하는 일반적인 방법은 특정 버전의 MPI를 컴파일하는 데 사용되는 컴파일러를 둘러싼 mpif77 또는 mpif90 프로그램을 사용하는 것입니다. - 내가 알고하지 않습니다

gfortran -I/usr/local/include -L/usr/local/lib -lmpi_f77 -lmpi -lopen-rte -lopen-pal -lutil 

(나는 mpif90 -showme를 통해이 정보를 가지고 :

예를 들어, 내 노트북에 (gfortran/GCC로 컴파일는 OpenMPI 사용) 명령 mpif77은 거의 비슷하다 그 명령 행 옵션은 MPI 표준의 일부이므로 당신을 위해 작동하지 않을 수도 있습니다). 추가 -I 플래그를 사용하여 포함 할 다른 파일이 없기 때문에

mpif77 -O0 -Wall -c ./TestData/common/timers.f -o timers.o 

, 정말하지 않습니다 이해하면 컴파일러 경로를 포함 증가 :

코드를 컴파일하기 위해, 나는 이런 식으로 뭔가를 시도 할 것이다 - 우연히 잘못된 헤더 파일을 찾을 가능성을 높이십시오.).

아마도 현재 디렉토리 또는/home/stephen/trunk/include에 'mpif.h'파일이 있는데,이 파일을 선택하지 않아도됩니다. (/*은 C 코멘트의 시작입니다. C 헤더 파일이 'mpif.h'라고하는 이유는 모르겠지만) C 헤더를 보았을 것 같습니다.

+0

옵션은 분명히 MPI 표준이 아니며 구현에 따라 다릅니다. –

+0

-I. 및 -I/home/stephen/include는 모두 makefile의 변수이므로 "make cg"를 실행하면 내가 게시 한 것과 같이 보입니다. mpif.h는/home/stephen/include에 존재합니다. 그래서 그것이 거기에 있고 그 파일이 컴퓨터에있는 유일한 파일입니다. – SteVwonder

+0

또한 모든 것이 비표준 방식으로 수행되는 이유는 중복성과 높은 실패율을 허용하는 자체 MPI 버전을 만들기위한 프로젝트의 요점입니다. 궁극적으로 BOINC에서 사용합니다. 필자는이 코드를 작성하지 않았으며, 컴파일하고 실행하려고 시도하고있다. 그래서 mpif77이 제 문제를 해결할 것이라고 생각하지 않지만 어쨌든 시도 할 것입니다. – SteVwonder

0

올바른 라이브러리에 링크하려면 mpif77 또는 mpif90을 사용해야한다는 것에 동의합니다. gfortran이 전 처리기 매크로를 좋아하지 않는다면 -cpp 컴파일러 옵션을 시도해야합니다.

+0

-cpp 컴파일러 옵션을 추가하면 불행히도 겉으로는 아무 것도하지 않습니다. 이전과 똑같은 오류. – SteVwonder

+0

예, 그럴 수 없습니다. 나는 cpp가 포함되지 않지만 #included 파일 만 처리한다는 것을 깨닫지 못했습니다. –