在fortran中有效地构造一个结构化矩阵

时间:2015-03-17 22:37:44

标签: performance matrix fortran fortran90

离开Fortran已经好几年了,现在我必须把它拿起并再次开始使用它。

我想在entry(i,j)格式中构建一个f(x_i,y_j)的矩阵,其中f是两个变量的函数,例如f(x,y)=cos(x-y)。在Matlab或Python(Numpy)中,有有效的方法来处理这种特定问题。我想知道Fortran中是否有这样的优化。

BTW,在Fortran中也是如此,向量化操作比do / for循环更快(如Matlab和Numpy中的情况)?

1 个答案:

答案 0 :(得分:0)

如果你的意思是矢量化与你在Matlab和Python中的意思相同,那么你在整个数组上调用的简短形式则不然,这些形式通常较慢,因为它们比简单的循环更难以优化。什么是更快的是当编译器实际使用CPU的向量指令时,但那是另外的。并且编译器更容易将它们用于简单的循环。

Fortran拥有elemental functionsdo concurrentforallwhere构造,隐含循环和数组构造函数。在这里重复它们没有意义,它们已在本网站或教程中多次描述过。

您的示例最简单地使用循环

完成
  do j = 1, ny
    do i = 1, nx
      entry(i,j) = f(x(i), y(j))
    end do
  end do

一种简短的方法,你可能意味着类似于Python的矢量化,就是全数组操作,例如,

  A = cos(B)
  C = A * B
  D = f(A*B)

和类似的。该函数(在数组的每个元素上调用)必须为elemental。这些操作不一定有效。例如,最后一次调用可能需要创建一个临时数组,这在使用循环时可以避免。