繁体   English   中英

openmp代码退出时出现分段错误

[英]segmentation fault on exit of openmp code

我有一个使用openmp的CPP代码。 它链接到一个fortran90代码。 如果仅使用一个线程运行,则一切正常。 如果运行的线程数与1不同,则退出cpp部分时会出现分段错误。 代码的结果是准确的,没有任何错误。 它运行平稳,直到需要退出为止。 与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: pthread_create@@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和线程数,以为我可能有堆栈大小问题,但无济于事。

我想念一些东西。 也许有些愚蠢。 并且找不到它。

这是GCC中的错误。 我在GCC上发现了一个有关与使用openmp和iso_c_binding模块有关的问题的错误。 之后,我使用intel编译器编译并执行了代码,没有任何问题。

我的代码很长,并且不知道如何隔离有问题的部分以重现错误并进行报告。 会尽力做到这一点。

我正在使用gcc(GCC)4.4.6 20120305(Red Hat 4.4.6-4),CentOS版本6.3(最终版)。

我将其标记为答案,如果以后发现更多有用的内容,我会将其张贴在这里,因为它可能对其他人有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM