2014-07-21 1 views
-2

나는 최근에 컴파일러 관련 openmp 문제가 발생했습니다. openmp 및 gfortran을 사용하여 올바르게 작동하는 코드를 작성했습니다. 나는 최근에 ifort와 openmp를 사용하여 같은 코드를 컴파일했고, 이제 openmp 섹션은 segfaults를 사용한다. 나는 멀리 지방의 대부분을 절단하고 그 요소들 사이의 루프를 내 오류이 모든 루프가 수행openmp : gfortran보다 ifort를 사용하는 다른 대답

!$omp parallel do schedule(dynamic) reduction(+:energy) default(private) shared(r,tr) 

    do i=0,listvar%ncellT-1 

      c1s = tr(i)%start 
      c1e = tr(i)%end 

      do j = c1s,c1e 

       x1 = r(j)%x; y1 = r(j)%y; z1 = r(j)%z 
       energy = energy + x1 
      enddo 
     enddo 

     !$omp end parallel do 

재현이다 액세스 포인터를 요소에 R에 배열 TR에서, 코드의 조각을 썼다. 그러나, 어떤 이유로 ifort가 c1s와 c1e에 말도 안되는 값을 할당하면 r을 반복 할 때 코드가 segfault가됩니다. 다시 말하지만 코드는 gfortran과 함께 작동합니다. 왜 이런 사람이 있을지 아무도 모른다.

답변

-1

오류를 발견했습니다. 어떤 이유로 든 gfortran은 모든 스레드에 대해 변수 listvar를 초기화 할만큼 친절했습니다! 그러나 IFORT는 firstprivate를 사용해야합니다. 나는 정말로 gfortran이 여기에 오류를 던지지 않은 것에 놀랐다. 다양한 조건에서 gfortran을 사용하여 코드를 실행했으며 매번 작동했습니다.

+4

이것은 정의되지 않은 동작입니다. 당신은 전혀 놀랄 필요가 없습니다. –