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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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中的OpenMP_Fortran_Openmp - Fatal编程技术网

Fortran中的OpenMP

Fortran中的OpenMP,fortran,openmp,Fortran,Openmp,我很少使用fortran,但是我的任务是将遗留代码重写为并行运行。我正在使用gfortran来选择编译器。我发现了一些优秀的资源以及其他一些 我的问题是,在添加任何OpenMP指令之前,如果我只是编译遗留程序: gfortran示例1.F90-o示例1 一切正常,但即使不添加指令也打开openmp编译器选项: gfortran-openmp示例1.F90-o示例1 当我运行遗留程序时,最终导致分段错误。使用我编写的较小的测试程序,我已经成功地用-openmp编译了其他在多个线程上运行的程序,但是

我很少使用fortran,但是我的任务是将遗留代码重写为并行运行。我正在使用gfortran来选择编译器。我发现了一些优秀的资源以及其他一些

我的问题是,在添加任何OpenMP指令之前,如果我只是编译遗留程序:

gfortran示例1.F90-o示例1

一切正常,但即使不添加指令也打开openmp编译器选项:

gfortran-openmp示例1.F90-o示例1

当我运行遗留程序时,最终导致分段错误。使用我编写的较小的测试程序,我已经成功地用-openmp编译了其他在多个线程上运行的程序,但是我很不明白为什么单独启用该选项而没有任何指令会导致seg故障

如果我的问题很简单,我道歉。我可以发布代码,但它相当长。当我指定初始值时,它会出现故障:

    REAL, DIMENSION(da,da) :: uconsold
    REAL, DIMENSION(da,da,dr,dk) :: uconsolde

    ...

    uconsold=0.0    
    uconsolde=0.0       
“uconsold”的第一个赋值很好,第二个赋值似乎是错误的根源,因为当我注释行时,接下来的几行会愉快地执行,直到再次使用“uconsolde”


感谢您在这件事上提供的帮助。

也许您的堆栈空间不足?使用openmp时,变量将位于堆栈上,以便每个线程都有自己的副本。也许您的阵列很大,即使只有一个线程(没有openmp指令),它们也会耗尽堆栈。只是一个猜测。。。尝试操作系统的方法来增加堆栈空间的大小,看看分段错误是否消失


另一种方法:要指定数组应该放在堆上,可以将其设置为“可分配”。OpenMP 3.0版允许更多地使用Fortran可分配阵列——我不确定细节。

我遇到了这个问题。这很可怕:我只因为声明了33x33阵列或11x11x11阵列而没有OpenMP指令,就得到了SEGFULTS;这些故障发生在具有4 GB RAM的Intel Mac上。使它们“可分配”而不是静态分配解决了这个问题。

虽然我认为@MSB提出了一个合理的建议,但我完全不同意“每个线程都有自己的副本”的说法。除非将变量声明为私有,否则所有线程都将共享该变量。我从来没有遇到过一个OpenMP系统,它通过将共享变量复制到所有线程并在后台管理一致性来实现共享变量。你说得对,在我的linux机器上:ulimit-s unlimited./Example1工作得很好。这可能超出了范围(我95%的时间都花在Java上,这是一个可悲的结果),但我不知何故认为正常编译的fortran和openmp都会使用堆栈空间。因为我宁愿读一本书也不愿一直烦你,你是否碰巧知道一个好的资源,我可以检查一下,以更好地了解我自己在做什么?@High-Performance Mark是正确的,默认值是共享变量。但是,启用openmp后,编译器通常会切换到在堆栈上放置本地阵列。这对于可能从并行区域调用的子例程非常有用。查普曼、约斯特、范德帕斯和库克的推荐书:《使用OpenMP》。我的建议非常感谢您的帮助。据我所知,这不是遗留代码。这是一种现代的阵列去噪方法。就openmp而言,请充分尊重链接上的教程,我谦恭地推荐《使用openmp》一书。它对那些从未处理过它的人非常友好。。。还有一本,但我现在书架上没有,也记不起作者了。如果你有兴趣给我留言,我回家后会查的。