2011-11-04 2 views
1

일부 OpenMP 지시어를 상당히 비싼 중첩 루프 세트에 추가하려고합니다. 배열에 대한 연산이 반드시 독립적 일 필요는 없기 때문에 내 지시문에 감축 절을 사용해야한다고 생각합니다. 그러나, 감소 지시문을 추가하려고 시도 할 때 내 응용 프로그램 코어 덤프 (하지만 컴파일). OpenMP 3.0에서 사용할 수있는 IBM의 XL Fortran 컴파일러를 사용하고 있습니다. 내 (단순화 된) 코드는 다음과 같습니다.Fortran 90/95 배열을 사용한 OpenMP 축소

!$omp parallel do reduction(+:f) private(n,m,l,i,j,k, & 
!$omp   parm,ista,iend,jsta,jend,ksta,kend) 
do n=1,lm  !k 
do m=1,jm !j 
    do l=1,im !i 

    if (val(l,m,n) .ne. zero) then 

    jsta=max j bounds in box 
    jend=min j bounds in box 
    ista=max i bounds in box 
    iend=min i bounds in box 
    ksta=min k bounds in box 
    kend=max k bounds in box 

    do k=ksta,kend 
     do j=jsta,jend 
     do i=ista,iend 

      parm = exp(-dx*(abs(i-l)) & 
         -dy*(abs(j-m)) & 
         -dz*(abs(k-n))) 

      f(i,j,k) = f(i,j,k)+ val(l,m,n) * parm 

     end do 
     end do 
    end do 

    end if 

    end do 
end do 
end do 

여기서 f는 차원 (im, jm, lm)을 갖습니다. 이것은 단순히 구문의 문제입니까? 나는이 문제를 몇 가지 작은 장난감 문제에 대해 시도해 왔지만이 컨텍스트에서 적용 할 작은 테스트로 배운 것을 얻는 데 어려움을 겪고 있습니다. 참조 용으로 몇 달 전에 비슷한 질문을했지만 문제는 그 이후로 조금씩 바뀌었고 솔루션이 지금은 (link)라고 생각하지 않습니다.

도움/의견을 보내 주셔서 감사합니다!

+0

내가 잘못 본 것이 없으므로이 부분에'jsta = max j bounds in box'라고 말하면 안 될까요? 배열 인덱스가있는 경우 seg fault가 발생할 수 있습니다. 배열 바운드 검사를 사용하려면 -C 옵션을 사용하여 코드를 컴파일 할 수 있습니다. – yosukesabai

+0

스택 메모리가 부족할 수 있습니다. allocate() 또는 포인터를 사용하여 힙에 필드를 넣으십시오. 어쩌면 시스템이 스택을 늘릴 수있는 환경 변수가있을 수도 있습니다. 마지막으로, 작은 크기의 문제에서 작동합니까? – FFox

+0

유용한 제안을 보내 주셔서 감사합니다. 이 문제를 다시 검토해 볼 것이고, 내가 배운다면 모두 알려 줄 것입니다! – JRC

답변

1

저는 인텔 포트란 컴파일러를 사용하고 있지만, 런타임시 세그먼트 화 오류와 같은 경험이 있습니다.

필자의 경우, 다음은 스레드 스택 크기를 증가시키는 문제를 해결합니다. 이게 도움이 되길 바란다.

[[email protected]]$ ulimit -s unlimited 
[[email protected]]$ export OMP_STACKSIZE=1g # 1GB for thread stack size