【发布时间】:2016-05-22 17:42:02
【问题描述】:
免责声明:我很确定这已经在某个地方得到了回答,但是我和另一个人一直在努力寻找却无济于事。
我有一个看起来像这样的代码:
PROGRAM main
!$omp parallel do
!$omp private(somestuff) shared(otherstuff)
DO i=1,n
...
CALL mysubroutine(args)
...
a=myfunction(moreargs)
...
ENDDO
!$omp end parallel do
END PROGRAM
SUBROUTINE mysubroutine(things)
...
END SUBROUTINE
FUNCTION myfunction(morethings)
...
END FUNCTION
我无法确定在哪里/如何处理子例程和函数中变量的私有、共享、归约等子句。我怀疑答案可能存在一些细微差别,因为变量可能已被声明和共享的方式有很多种。因此,假设主程序涉及的所有变量都在其中或共享模块中定义,并且对这些变量的任何 OMP 操作都可以在主代码中处理。子例程和函数使用其中一些变量,并有一些自己的变量。所以,我认为问题归结为如何处理其局部变量的子句。
【问题讨论】:
-
显示此类函数的示例。如果局部变量不是
save,则不是问题。 -
见stackoverflow.com/questions/22381795/…他们要研究的关键词是thread-safety和thread-safe程序。
-
@VladimirF 澄清一下,我有其他两个的代码,所以它更多的是语法问题而不是线程安全。
SAVE混合在一起,子例程和函数都被称为很多,因此避免不必要的重复内存分配很重要。但是,如果使用SAVE将它们撞到堆上,(并且会损害性能),那么这是不值得的。可能需要进行测试。 -
我不明白你的评论。你的整个问题都是关于线程安全的,不是吗?你想到了什么样的语法?您不能访问不在范围内的变量。如果您有代码,请显示它!否则你的问题太宽泛了。
-
我不确定您的评论,但是如果您在从 OpenMP 并行区域调用的过程中使用
SAVE声明变量,您可能会在线程之间发生冲突。您可以在这些子例程中使用 OpenMP 指令:这种用法的术语是“孤立的”。
标签: fortran thread-safety openmp