Fortran可以通过1d数组来划分2d数组

时间:2015-09-01 13:11:04

标签: arrays fortran vectorization intel-fortran fortran95

为了最大化速度,我试图对以下内容进行矢量化(以使编译器能够进行矢量化,因为它认为很好):

integer  :: i,j
real :: a(4),b(4,5),c(4,5)
!... setting values to a and b...

do i=1,5
  do j=1,4
    c(j,i)=b(j,i)/a(i)
  end do
end do

我试过以下

c=b/a

但这不起作用:

  

错误#6366:数组表达式的形状不符合。

我的想法是,既然你可以做一个/ i,(数组/标量),我希望可以这样做(2d数组/数组)。首先是b和c的维度是(5,4),我认为这是问题,它需要符合第一级别上较小级别的变量,但似乎并非如此。截至目前,我想知道它是否可能?或者我必须坚持使用do循环? (当然我对矢量化内循环感到满意)

对此有任何意见或想法非常满意。 (我在Windows上使用ifort 16)

1 个答案:

答案 0 :(得分:0)

如果您还没有得到答案,看似的非矢量化代码如下所示:

!Non-vectorized
do i=1,5
  do j=1,4
    c(j,i) = b(j,i) / a(j)
  enddo
enddo

看似的矢量化版本如下:

!Vectorized
do i=1,5
  c(:,i) = b(:,i) / a(:)
enddo

intel编译器将两者都矢量化。要确定某个循环是否已被矢量化,请使用标记-qopt-report-phase=vec。这会生成有关已编译程序的矢量化报告,并且是一种了解某个循环是否已被矢量化的简洁方法。

上面代码生成的矢量化报告如下所示:

.... Beginning stuff...
LOOP BEGIN at vect_div.f90(11,5)
remark #15542: loop was not vectorized: inner loop was already vectorized

 LOOP BEGIN at vect_div.f90(12,5)
    remark #15300: LOOP WAS VECTORIZED
 LOOP END
LOOP END

LOOP BEGIN at vect_div.f90(18,5)
remark #15542: loop was not vectorized: inner loop was already vectorized

 LOOP BEGIN at vect_div.f90(19,7)
    remark #15300: LOOP WAS VECTORIZED
 LOOP END
LOOP END

这里,(11,5),(12,5)等是我的.f90文本文件中存在do关键字的行号和列号。正如您可能注意到的那样,外部循环不是矢量化的,而内部循环则不是。它们都是矢量化的,没有任何明显的差异。

通过更改ifort标志-qopt-report=[n]

中的'n'值,可以生成更详细的报告