2012-12-04 3 views
1

openmp를 사용하는 CPP 코드가 있습니다. Fortran90 코드와 연결되어 있습니다. 하나의 스레드로 실행하면 모든 것이 정상입니다. 1과 다른 수의 스레드로 실행하면 cpp 부분을 종료 할 때 세그먼트 화 오류가 발생합니다. 코드의 결과는 정확합니다. 오류는 없습니다. 종료 할 때까지 원활하게 실행됩니다. openmp와 관련된 코드 부분은 다음과 같습니다.openmp 코드 종료시 분할 오류

#pragma omp parallel for shared(even_phi,odd_phi,odd_divisor,odd_start_index,odd_iter_index) private(ii,jj,kk,cc,io,pp,f1,f2,f3,f4,f5,f6,ff,tmp_phi) schedule(static) 
      for (kk=1; kk<nz-1; kk++) 
      { 
       cc = (kk-1)*(ny-2); 

       for (jj=1; jj<ny-1; jj++) 
       { 
        io = odd_start_index[cc]; 
        pp = odd_iter_index[cc++]; 

        for (ii=io; ii<maxElem; ii++) 
        { 
         f1 = even_phi[pp-odown]; 
         f2 = even_phi[pp-oright]; 
         f3 = even_phi[pp]; 
         tmp_phi = odd_phi[pp]; 
         f4 = even_phi[pp+1]; 
         f5 = even_phi[pp+oleft]; 
         f6 = even_phi[pp+oup]; 

         ff = f1+f2+f3+f4+f5+f6; 

         odd_phi[pp] = odd_divisor[pp]*ff + c2*tmp_phi; 

         pp++; 
        } 
       } 
      } 

표준 숫자 해석 코드입니다. 또한 완벽하게 openmp없이 OMP_NUM_THREADS = 1로 작동합니다. 더 많은 스레드로 실행하면, 거의 완전한 정상 실행 후, Valgrinds는 말한다 :

==23723== Thread 20: 
==23723== Jump to the invalid address stated on the next line 
==23723== at 0x2A6EBBB8: ??? 
==23723== by 0x2A6EA515: ??? 
==23723== Address 0x2a6ebbb8 is not stack'd, malloc'd or (recently) free'd 
==23723== 
==23723== 
==23723== Process terminating with default action of signal 11 (SIGSEGV) 
==23723== Access not within mapped region at address 0x2A6EBBB8 
==23723== at 0x2A6EBBB8: ??? 
==23723== by 0x2A6EA515: ??? 
==23723== If you believe this happened as a result of a stack 
==23723== overflow in your program's main thread (unlikely but 
==23723== possible), you can try to increase the size of the 
==23723== main thread stack using the --main-stacksize= flag. 
==23723== The main thread stack size used in this run was 1048576. 
==23723== 
==23723== HEAP SUMMARY: 
==23723==  in use at exit: 632,995,339 bytes in 101 blocks 
==23723== total heap usage: 10,071 allocs, 9,970 frees, 1,257,933,743 bytes allocated 
==23723== 
==23723== Thread 1: 
==23723== 6,992 bytes in 23 blocks are possibly lost in loss record 47 of 74 
==23723== at 0x4A04A28: calloc (vg_replace_malloc.c:467) 
==23723== by 0x35A0E11812: _dl_allocate_tls (dl-tls.c:300) 
==23723== by 0x35A1E07068: [email protected]@GLIBC_2.2.5 (allocatestack.c:571) 
==23723== by 0x2A6EA981: ??? 
==23723== by 0x2A4C666E: ??? 
==23723== by 0x4C8DB7: solvermodule (in /home/tom/bin/solver) 
==23723== by 0x4C6794: MAIN__ (qdiff4v.f90:749) 
==23723== by 0x4C8DF9: main (in /home/tom/bin/solver) 
==23723== 
==23723== 30,276 bytes in 1 blocks are definitely lost in loss record 50 of 74 
==23723== at 0x4A0674C: operator new[](unsigned long) (vg_replace_malloc.c:305) 
==23723== by 0x2A4C6394: ??? 
==23723== by 0x4C8DB7: solvermodule (in /home/tom/bin/solver) 
==23723== by 0x4C6794: MAIN__ (qdiff4v.f90:749) 
==23723== by 0x4C8DF9: main (in /home/tom/bin/solver) 
==23723== 
==23723== 30,276 bytes in 1 blocks are definitely lost in loss record 51 of 74 
==23723== at 0x4A0674C: operator new[](unsigned long) (vg_replace_malloc.c:305) 
==23723== by 0x2A4C63BF: ??? 
==23723== by 0x4C8DB7: solvermodule (in /home/tom/bin/solver) 
==23723== by 0x4C6794: MAIN__ (qdiff4v.f90:749) 
==23723== by 0x4C8DF9: main (in /home/tom/bin/solver) 
==23723== 
==23723== 30,276 bytes in 1 blocks are definitely lost in loss record 52 of 74 
==23723== at 0x4A0674C: operator new[](unsigned long) (vg_replace_malloc.c:305) 
==23723== by 0x2A4C63EA: ??? 
==23723== by 0x4C8DB7: solvermodule (in /home/tom/bin/solver) 
==23723== by 0x4C6794: MAIN__ (qdiff4v.f90:749) 
==23723== by 0x4C8DF9: main (in /home/tom/bin/solver) 
==23723== 
==23723== 30,276 bytes in 1 blocks are definitely lost in loss record 53 of 74 
==23723== at 0x4A0674C: operator new[](unsigned long) (vg_replace_malloc.c:305) 
==23723== by 0x2A4C6415: ??? 
==23723== by 0x4C8DB7: solvermodule (in /home/tom/bin/solver) 
==23723== by 0x4C6794: MAIN__ (qdiff4v.f90:749) 
==23723== by 0x4C8DF9: main (in /home/tom/bin/solver) 
==23723== 
==23723== 39,232 bytes in 1 blocks are definitely lost in loss record 57 of 74 
==23723== at 0x4A0674C: operator new[](unsigned long) (vg_replace_malloc.c:305) 
==23723== by 0x2A4C6369: ??? 
==23723== by 0x4C8DB7: solvermodule (in /home/tom/bin/solver) 
==23723== by 0x4C6794: MAIN__ (qdiff4v.f90:749) 
==23723== by 0x4C8DF9: main (in /home/tom/bin/solver) 
==23723== 
==23723== LEAK SUMMARY: 
==23723== definitely lost: 160,336 bytes in 5 blocks 
==23723== indirectly lost: 0 bytes in 0 blocks 
==23723==  possibly lost: 6,992 bytes in 23 blocks 
==23723== still reachable: 632,828,011 bytes in 73 blocks 
==23723==   suppressed: 0 bytes in 0 blocks 
==23723== Reachable blocks (those to which a pointer was found) are not shown. 
==23723== To see them, rerun with: --leak-check=full --show-reachable=yes 
==23723== 
==23723== For counts of detected and suppressed errors, rerun with: -v 
==23723== ERROR SUMMARY: 7 errors from 7 contexts (suppressed: 6 from 6) 

GDB는 말한다 : 분명히 도움이되지 않습니다

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7ffff5a04700 (LWP 23837)] 
0x00007ffff7024bc2 in ??() 
Missing separate debuginfos, use: debuginfo-install libgcc-4.4.6-4.el6.x86_64   libgfortran-4.4.6-4.el6.x86_64 libgomp-4.4.6-4.el6.x86_64 libstdc++-4.4.6-4.el6.x86_64 

합니다. GOMP_STACKSIZE와 스레드 수인 을 가지고 놀았지만 스택 크기에 문제가있을 수는 있지만 아무 소용이 없습니다.

내가 뭔가를 잃어 버렸다. 어리석은 짓일지도 몰라. 그리고 그것을 찾을 수 없습니다.

+2

'valgrind'는 종종 OpenMP 프로그램에서 거짓 긍정을 제공합니다. 'OMP_NUM_THREADS = 1'을 사용하면 병렬 영역이 전혀 활성화되지 않으며 OpenMP 스레드가 생성되지 않습니다. 어떻게 프로그램을 연결합니까? –

+0

C++ 코드는 iso_c_binding 모듈을 사용하는 포트란 모듈에서 호출되는 공유 라이브러리입니다. – cauchy

+0

'0x00007ffff7024bc2 in ??()'는 스택 주소입니다. 일부 함수 호출의 리턴 주소가 포인터 값 (스택 변수)으로 겹쳐 쓰여졌을 수도 있습니다. 나는 여기에 제시된 코드의 양을 감안할 때 더 말할 수 없다. –

답변

0

이것은 GCC의 버그입니다. 나는 openmp와 iso_c_binding 모듈의 사용과 관련된 문제에 대해 GCC에서보고 된 버그를 발견했다. 그 후 나는 인텔 컴파일러를 사용하여 아무런 문제없이 코드를 컴파일하고 실행했다.

내 코드는 상당히 길기 때문에 문제가있는 부분을 분리하여 버그를 재생하고 보고서를 작성하는 방법을 모릅니다. 그렇게하기 위해 최선을 다할 것입니다.

gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4), CentOS 릴리스 6.3 (최종)을 사용하고 있습니다.

나는 이것을 답으로 표시하고 나중에 더 유용한 것이 있으면 나중에 다른 사람에게 유용 할 수 있기 때문에 여기에 게시 할 것입니다.

+0

gcc 버그 신고에 대한 링크를 게시 하시겠습니까? –