Fortran과 OpenMP를 사용하고 있지만, 큰 배열이있을 때 OpenMP를 사용하여 루프를 병렬 처리하려고 할 때 계속 문제가 발생합니다. 예를 들어, 다음 코드는이 Makefile을 사용OpenMP 대형 배열에서의 충돌
PROGRAM main
IMPLICIT NONE
INTEGER, PARAMETER :: NUMLOOPS = 300000
REAL(8) :: TESTMAT(NUMLOOPS)
INTEGER :: i,j
!$OMP PARALLEL SHARED(TESTMAT)
!$OMP DO
DO i=1,NUMLOOPS
TESTMAT(i) = i
END DO
!$OMP END DO
!$OMP END PARALLEL
write(*,*) SUM(TESTMAT)/(NUMLOOPS)
END PROGRAM main
을 컴파일 :
.SUFFIXES: .f90
F90 = gfortran
FFLAGS_PFM = -ffree-form -ffree-line-length-none -fopenmp
LIB = -llapack
OBJ90 = main.o
main: $(OBJ90)
$(F90) $(FFLAGS_PFM) -o [email protected] $(LIB) $(OBJ90)
${OBJ90}: %.o: %.f90
$(F90) $(FFLAGS_PFM) $(LIB) -c -o [email protected] $<
충돌을 윈도우 머신에, gfortran을 사용하여 컴파일 할 때. 그러나 NUMLOOPS 값을 약 260000보다 작게 변경하면 프로그램이 정상적으로 실행됩니다. 비슷하게 약 1000x1000의 행렬이 충돌합니다 (실제로는 500x500을 초과하는 것이 작동하지 않습니다). 따라서 OpenMP를 사용할 때 최대 배열 크기가 허용되는 것 같습니다. 나는이 종류의 무엇이든을 우연히 만나지 않았다. 나는 동일한 결과를 가진 여러 개의 윈도우 머신을 시도했지만, 모두 동일한 설정을 사용한다. gfortran 컴파일러가있는 Windows 7. 코드는 항상 문제없이 컴파일되지만 실행하면 충돌합니다.
답장을 보내 주셔서 감사합니다. TESTMAT를 할당 가능하게 만드는 것은 실제로 작동합니다!그러나, 나는 이것이 왜 처음에 발생하는지에 관해서는 여전히 궁금합니다. OpenMP 비트 (예 : OMP 선언 및 makefile의 -fopenmp 플래그)를 제거하면 위의 코드가 작동한다는 것을 잊었을 것입니다. 따라서 gfortran + openmp에만 해당하는 것으로 보입니다. 그러나 어느쪽으로 든 앞으로 나아가십시오, 다시 한번 감사드립니다! – user870029
OpenMP 버전에서는 컴파일러가 실행 파일의 정적 위치 대신 스택에 배열을 넣을 수 있습니다.이 경우 스택 크기를 무제한으로 설정하여 문제를 해결할 수 있습니다. 일반적으로 "ulimit -s 무제한. – haraldkl