- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模块包含一个包含另一个子例程的子例程。外部子例程有一个并行的 OpenMP 区域,我在其中调用内部子例程。代码编译运行没有任何错误,但结果不正确。
module my_module
contains
subroutine a(...)
*...some variables*
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(...)
*...do some work*
call b(...)
!$OMP END PARALLEL DO
contains
subroutine b(...)
*...some variables*
*...do some work*
end subroutine b
end subroutine a
end my module
如果我运行英特尔调试器 idb
,它会在 子程序 b
中显示一个 SIGSEGV。现在,如果我在 subroutine a
中手动替换 subroutine b
的内容而不是调用它,并保留 OMP 子句,它不会抛出 SIGSEGV 错误,结果现在是正确。
编辑:完整代码在这里:https://github.com/mikolchon/cfd/blob/master/cfd2/calcRHS.f90它是一个包含用于求解欧拉流体方程的子程序的模块。如果我运行 idb
,它将给出以下内容:
EDIT2:刚刚设法编写了一个较小的示例来重现此错误:
module some_module
implicit none
contains
subroutine sub0()
real :: a(5)
integer :: i
a(:) = 0
!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(a)
do i = 1, 5
call sub1()
end do
!$OMP END PARALLEL DO
print*, a(:)
contains
subroutine sub1()
a(i) = a(i) + 1
end subroutine sub1
end subroutine sub0
end module some_module
program main
use some_module
implicit none
call sub0()
end program main
程序应该打印 1.000000 1.000000 1.000000 1.000000 1.000000
。以下是我尝试过的不同编译标志:(编译器是ifort 14.0.2)
ifort name.f90 -check bounds -traceback -O0
- 在没有 OpenMP 的情况下工作正常
ifort name.f90 -openmp -check bounds -traceback -O0
- 给出超出范围的数组索引。
ifort name.f90 -openmp -check bounds -traceback
- 会起作用
基本上,当我使用 -O0
时,错误就会显示出来。但是,这并不意味着当我不使用 -O0
时错误不存在(我这样说是因为我的原始代码会给出错误的结果)。此外,如果我显式传递索引 i
,即:
....
call sub1(i)
....
contains
subroutine sub1(i)
integer i
....
然后用-O0
编译,又可以了。所以我怀疑 OpenMP 在将变量 i
继承给它的子程序时遇到了问题。
最佳答案
我不确定 OpenMP 规范是否允许这样做。本帖https://software.intel.com/en-us/forums/topic/297424也有些疑惑。也许它只是被 Intel Fortran 错误地实现了,但必须仔细阅读官方规范。
在您的情况下,我会像您也尝试过的那样,通过将过程代码直接粘贴到循环中来避免主机关联的需要。
另一种选择是将私有(private)变量作为伪参数传递,正如引用线程中所建议的那样,这也避免了主机关联。
我不确定单独使用足够高的优化级别是否会有帮助,需要内联可能是不安全的。
FWIW 我在 Oracle Solaris Studio 12.4beta 上也遇到了同样的错误。
根据 IanH 的说法:
“内部子程序中对 i 的引用在一个区域中,但不在构造中。被引用的 i 是并行 do 构造之前的原始 i 还是私有(private)副本被称为“未指定”在 OpenMP 4.0 及更早版本中。”
规范中的相关部分是 (OpenMP 4.0 2.14.3.3.14):
The corresponding original list item. Inside the construct, all references to the original
list item are replaced by references to the new list item. In the rest of the region, it is
unspecified whether references are to the new list item or the original list item.
这意味着应该避免这种用法。
关于fortran - 在 OpenMP 区域内调用内部子程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25628034/
我有一个包含很多工作表和几个宏的工作簿。当我进入 VBA 并尝试将新的 Sub 写入 ThisWorkbook 模块时,我看到: "This will reset your project, proc
1、函数定义 子程序即一段分离的代码,它可以使减少重复代码且程序易读.perl中,子程序可以出现在程序的任何地方.但一般放在程序的开始或结尾. 复制代码 代码如下:
1、定义 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读。PERL中,子程序可以出现在程序的任何地方。定义方法为: &n
如何将 deck(52) 数组从 Newgame 函数传递到 deckshuffle 函数 FUNCTION newgame 'New game RANDOMIZE TIMER CA
有没有办法在后台运行 perl 子程序?我环顾四周,看到了一些关于线程的提及,但看到一个例子会有所帮助,或者为我指明正确的方向。谢谢。 想跑run_sleep在后台。 #!/usr/bin/perl
情况 我正在创建一个简单的模板文件,该文件将有助于创建 future 的脚本,以便在 *nix 系统上通过命令行执行各种任务。作为其中的一部分,我可能会要求用户输入需要根据源代码中提供的正则表达式进行
我想将以下变量传递给子程序 mySubroutine,$name, $age然后是这个多维数组: $name = "jennifer"; $age = 100; $list[0][0] = "TEST
据我所知,VB6不支持继承,但它支持接口(interface)。我正在尝试创建一个重载子例程,将其信息传递给基类的同名子例程。 Sub Main() Dim Student1 as New S
这个问题已经有答案了: Dynamic Function Calls in Excel VBA (1 个回答) 已关闭 8 年前。 这是我的测试代码 Sub dotask() Dim qusu
我正在编写一个本质上是静态的函数。我想将它插入到模板工具包中,它会传递类名。本质上,它正在做 ClassName->function( $args.. ) 但我希望它做类似的事情 ClassName:
我创建了一个小示例程序来检查子例程系统调用。 package main func print() { } func main() { go print() } go 子程序的 straces
我是该网站的新手,这看起来可能是获得一些提示和帮助(如果有的话)的地方。 我正在学习“C 调用 Fortran 子程序”,我对 C 有一定的了解,但对 Fortran 了解不多。 优点:我看过一些例子
是否有一种方法/功能可以为所有可用的 Mojolicious 路由编写自动启动子程序/方法? 也许是一个自动助手,但我还不知道如何去做。 我认为这对于为几乎所有可用路由初始化数据库连接 $self->
我试图在不实例化对象的情况下从类中调用原型(prototype)函数。我的类(class) MyClass 的一个例子: package MyClass; use strict; use warnin
我正在尝试从 C 调用 FORTRAN 函数 我的问题是: 如果 fortRoutine 是我的 fortran 子例程的名称,那么我从 C 调用它作为 fortRoutine_。如果 fortRou
我可以调用编译这个 fortran 代码 'test.f90' subroutine test(g,o) double precision, intent(in):: g double precisi
我制作了一个 Perl 模块 MyModule.pm 它有一些我想在 shell 脚本中调用的子例程 getText。我尝试了以下方式,但它给出了错误; SEC_DIR=`perl -MMyModul
我用 CommaIde 打开了这个简单的脚本: #!/usr/bin/env perl6 my $str = 'foobar'; say $str; IDE 突出显示了带有错误的“说”一词: Subr
我基本上有一个存储有数字 1-6(例如垄断)的立方体 vector > cube; 看起来像这样: 0300 5126 0400 我有将它倒转的代码: short tmp=cube[0][1]; cu
我必须在两个文件中创建一个 surbroutine,我在构建项目时遇到问题,出现错误: undefined reference to c 我不知道发生了什么,我正在尝试发送 C[0] 内存方向,这就是
我是一名优秀的程序员,十分优秀!