【发布时间】:2015-09-01 13:11:04
【问题描述】:
为了最大限度地提高速度,我正在尝试对以下内容进行矢量化(以使编译器能够按照它认为好的方式进行矢量化):
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:数组表达式的形状不符合。
我的想法是,既然你可以做 a/i,(数组/标量),我希望可以做(2d 数组/数组)。首先 b 和 c 的维度是 (5,4),我认为这就是问题所在,它需要符合第一级排名较小的变量,但情况似乎并非如此。截至目前,我想知道这是否有可能???还是我必须坚持使用 do 循环? (当然我可以对内循环向量化感到满意)
对任何与此相关的 cmets 或想法都非常满意。 (我在 Windows 上使用 ifort 16)
【问题讨论】:
-
c(j,:)=b(j,:)/a ?编译器通常很乐意对循环进行矢量化,因此我不希望性能发生太大变化。
-
是的..这就是我的选择......或者相反(因为列主要安排)......好的,谢谢弗拉基米尔F
-
您可以声明
a(4,5)并适当地初始化它,这样c=b/a就正确了。顺便说一句,当您声明a(4)并在i,5上循环a(i)时,您的初始代码不正确
标签: arrays fortran vectorization intel-fortran fortran95