Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 一个普通程序的带-fopenmp的segfault_Fortran_Openmp_Segmentation Fault - Fatal编程技术网

Fortran 一个普通程序的带-fopenmp的segfault

Fortran 一个普通程序的带-fopenmp的segfault,fortran,openmp,segmentation-fault,Fortran,Openmp,Segmentation Fault,我对openmp有点耳目一新,陷入了这种奇怪的境地。我删掉了这一部分,创建了一个最小的小案例来说明这个问题 program ex2 implicit none integer, parameter :: n=10000000 integer :: i real :: x(n) do i=1,n x(i) = 0.0d0 enddo end program 在没有指定标志的情况下,mac(10.6)上的gfortran 4.3.

我对openmp有点耳目一新,陷入了这种奇怪的境地。我删掉了这一部分,创建了一个最小的小案例来说明这个问题

program ex2
    implicit none
    integer, parameter :: n=10000000
    integer :: i
    real :: x(n)

    do i=1,n
        x(i) = 0.0d0
    enddo

end program
在没有指定标志的情况下,mac(10.6)上的gfortran 4.3.4将编译,程序将正确执行

但是,如果我使用-fopenmp启用openmp,程序将以分段错误终止。显然,没有代码被执行,因为它会立即崩溃。正如您所看到的,openmp从未在代码中用于并行化任何东西。我试图修改堆栈大小,都是使用ulimit-fmax stack var size,而且在任何情况下,我定义的大数组都不是一千万real


我做错了什么?

这里有一个模糊的答案:openmp标志是否将数组从堆栈移动到堆?如果是这样的话,会有什么影响呢?

这里有一个模糊的答案:openmp标志是否会将数组从堆栈移动到堆?如果是这样,会有什么影响?

是的,openmp通常会改变内存的分配方式。以前的讨论:

在网上搜索,我发现

gfortran-mp-4.3-fopenmp ex2.f90-Wl,-堆栈大小,0x40000000,-堆栈地址,0xf0000000-o ex2.exe


修复了Mac上的问题。

是的,openmp通常会更改内存分配方式。以前的讨论:

在网上搜索,我发现

gfortran-mp-4.3-fopenmp ex2.f90-Wl,-堆栈大小,0x40000000,-堆栈地址,0xf0000000-o ex2.exe


已修复Mac上的问题。

我同意M.S.B.这是常见的堆栈大小问题。我建议在堆上分配x字段。我还试图避免完全使用在堆栈上分配的数组(在您的例子中,所有局部变量都会进行堆栈式分配)。这可以防止一些讨厌的错误,比如子例程在某个问题大小时开始出现故障,或者在另一台机器上出现不同堆栈大小的问题。另外,根据我的经验,堆上的分配和释放不会导致显著的运行时开销

我同意M.S.B.这是一个常见的堆栈大小问题。我建议在堆上分配x字段。我还试图避免完全使用在堆栈上分配的数组(在您的例子中,所有局部变量都会进行堆栈式分配)。这可以防止一些讨厌的错误,比如子例程在某个问题大小时开始出现故障,或者在另一台机器上出现不同堆栈大小的问题。另外,根据我的经验,堆上的分配和释放不会导致显著的运行时开销

它对我有效,但只有删除-stack_addr规范。我在页面零段和堆栈段之间得到一个段重叠。我猜指定stack_大小,这将保留编译器安排的堆栈地址。这对我来说是可行的,但只有删除-stack_addr规范。我在页面零段和堆栈段之间得到一个段重叠。我猜指定堆栈大小(即它将保留由编译器安排的堆栈地址)。