optimization - 在 forall 循环中使用用户定义的函数

标签 optimization error-handling compiler-errors fortran gfortran

我有一个pde要解决。为了优化,我使用 forall 循环和循环内部,变量使用用户定义的函数以下列方式更改。

forall(i=2:n-1,j=2:n-1, w(i,j).gt.wmax/1000)
    k3(i,j)=w(i,j)+h*k(x(i),t)
end forall

这里,k(x,t) 是我之前定义的外部定义函数。

错误来了:
 Reference to impure function ‘k’ at (1) inside a FORALL block

我正在使用 gfortran。如果我需要在 forall 循环中使用用户定义的函数,解决方案是什么?是否有可能在一个forall中或者我需要做一些其他的事情,这也会优化?如果其他事情是可能的,也请解释一下。

最佳答案

问题是您在 FORALL block 内引用了一个名为 k 的不纯函数。为了在您编写函数时使其工作,您必须将其设为纯函数,并在循环中调用它时在范围内有一个接口(interface) - 纯是一个断言,该函数不会(除其他外)改变它论点,如果发生这种情况,可能会使 Forall 构造的并行处理给出不正确的答案。如果您提供了一个完整的、最小的程序来显示您的问题,我会向您展示您需要进行的更改,但是您没有,我不能。

但实际上这是由。不要使用 FORALL。几乎可以肯定,您的程序不会比使用简单的 do 循环运行得更快,而且很可能会更慢。 Forall 在当时似乎是一个好主意,但由于各种原因,它并没有真正奏效——我在 Metcalf、Reid 和 Cohen 的最新版“现代 Fortran 解释”中指出,这是关于 Fortran 的经典书籍,他们将其标记为已过时。相反,我会研究更现代的 Do Concurrent,或者最好学习如何使用 OpenMP 并行化循环。

关于optimization - 在 forall 循环中使用用户定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60882045/

相关文章:

python - 如何加快 Python 的执行速度?

c++ - 在 C++ 中,我应该费心缓存变量,还是让编译器进行优化? (别名)

error-handling - 如何在Couchbase中管理角色?

swift - 如何比较相同枚举的值? (== 比较不起作用!)

java - “找不到符号”或“无法解析符号”错误是什么意思?

iphone - 我有一张需要优化的庞大 table 。我想我需要使用索引,但我希望获得有关它们的更多信息

python - PyGMO Batch 适应性评估

error-handling - Pascal : Incompatible types: got “LONGINT” expected “CHAR”

java - 在 ViewScop 上写入 404 并在 JAVA JSF 中不重定向显示错误文件

c++ - BOOST图cc1plus : out of memory allocating