2

我在fortran中使用openmp,在程序完成很多工作之前,它通过简单地尝试写入如下所示的一行而遇到了段错误:

783       module Lines
784 
785       character*80 eline, dline
786 
787       contains
788 
789       subroutine InitializeLines
790       print*, 'writing to eline'
791       write(eline,'(1x,79(''#''))')
792       print*, 'writing to dline'
793       write(dline,'(1x,79(''-''))')
794       end subroutine InitializeLines
795 
796       end module Lines

在主程序中,当我尝试调用时,它只是在给我一个段错误之前InitializeLines打印出来。writing to eline现在,当我在没有-fopenmp. 另请注意,本节中只有一个线程处于活动状态(a 只是get_num_threads()表明我InitializeLines只使用一个线程进入)。我一起飞-fopenmp,就没有段错误并且程序正确执行。

另请注意-DUSEOPENMP,当我想使用 openmp 时,我的 makefile 中有一个标志。如果我没有定义,那么将不会发生 openmp 操作。这很重要,因为当我不 使用编译时-DUSEOPENMP我会遇到相同的段错误问题,即使我 100% 确定我什至没有调用任何额外的线程或使用 openmp 的任何部分。 -fopenmp

现在,经过一番尝试,我发现当我取出-static作为编译选项时,这个问题就消失了。我的问题是——为什么?为什么会这样-static并且-fopenmp不一起工作,这是我可以通过其他方式解决的问题吗?

4

1 回答 1

3

这是一个glibc 特有的问题——静态链接不能很好地与包括 OpenMP 在内的线程程序配合使用。不过有一个解决方法:强制链接器链接整个libpthread.a档案,而不仅仅是直接引用的符号-Wl,--whole-archive -lpthread -Wl,--no-whole-archive

除非您有充分的理由静态链接系统库,否则不要这样做。

于 2012-06-23T08:32:35.073 回答