回 帖 发 新 帖 刷新版面

主题:loop was vectorized

在Linux系统下安装了intel fortran和MPICH2,每次对程序编译是总会出现
loop was vectorized
我的部分makefile文件为:
Begin.o:Begin.f90 common1.f90 common2.f90
    mpif90 -c Begin.f90
请问loop was vectorized是不是会加快程序计算速度?
是不是编译器进行优化,程序并行执行?我的机为8核的工作站。

回复列表 (共8个回复)

沙发

我印象中ivf11.0的时候编译优化都会有loop was vectorized, 这个跟你的MPICH2没什么关系吧.
后来的ivf版本就没出现这个了...

板凳

[quote]我印象中ivf11.0的时候编译优化都会有loop was vectorized, 这个跟你的MPICH2没什么关系吧.
后来的ivf版本就没出现这个了...[/quote]
对,这个优化应该和MPICH2没有关心,可是这个优化是干啥的了?

3 楼

没有研究过编译器, 具体优化了什么不清楚. 字面理解是矢量化了吧. 我试过在单核心的机上编译同样有这个提示.
关于优化这方面"f2003"兄比较清楚.

4 楼

呼呼f2003兄来解释一下!

5 楼

矢量化是intel吹嘘的重点. 所谓的simd指令, 单指令多数据.

比如说, 有4个加法计算要运行, 分别是1.0+2.0,  3.0+4.0,  5.0+6.0,  7.0+8.0,
你可以逐一进行计算, 但那不是效率最高的. 更好的方法是定义两个矢量,
分别为(1.0 ,3.0, 5.0, 7.0) 和 (2.0 ,4.0 ,6.0, 8.0), 并把它们装入两个矢量寄存器, 然后一个指令"加"就可以完成4个数据加另外4个数据, 这就是单指令多数据. 当然, 要做到这一点必须有相应的硬件设施支持,加法器等计算电路必须4倍增加.

intel的sse就是矢量化指令集, 包含了数十种矢量计算, 包括上面的两个矢量相加. 目前的sse寄存器是128位的, 也就是矢量长度为4个单精度或者两个双精度. intel 2011年的新处理器sandy bridge将会把矢量寄存器长度扩到256位, sse也升级为AVX

原先计算密集型的应用完全被unix工作站把持,x86架构根本没力量竞争,intel推出sse是为了与powerpc等risc处理器竞争,sse指令集正是苹果倒向intel的原因。苹果是视频处理的主要机型,后来intel通过优化其编译器,sse指令集也开始支持科学计算。

听上去很吸引人, 事实上这也是intel编译器如此之快的重要原因, 但是使用avx就能把单精度运算速度提高到8倍? 可能, 但是比较理想的情形才可能, 因为数据之间的依赖关系导致不是总能将程序矢量化, 编译器智商有限.

矢量化的一个方法就是修改循环,
比如
do i=1,N
  x=x+y(i)
enddo
这其实是无法矢量化的,但是把求和改成4个子流分别求和, 最后再加起来.
do i=1,N,4
  x1=x1+y(i)
  x2=x2+y(i+1)
  x3=x3+y(i+2)
  x4=x4+y(i+3)
enddo
x=x1+x2+x3+x4
这个循环把数组y分成4个子流分别求和, 且彼此之间没有任何干扰, 这就可以矢量化了,即
do i=1,N,4
  (x1,x2,x3,x4)=(x1,x2,x3,x4)+(y(i),y(i+1),y(i+2),y(i+3))
enddo
x=x1+x2+x3+x4
计算时间缩短4倍, 如果使用avx指令, 把程序修改为分8个子流求和, 速度即提高8倍.

所以loop was vectorized是好事情啊, 细节不必管他, 你知道使用了sse指令集, 而不是老旧的x87, 编译器也成功地修改了你的程序并矢量化了, 对你这就够了

这些跟mpich没有任何关系.

6 楼

看了f2003兄真的长见识了。
    虽然看的模模糊糊的。呵呵

7 楼

搬个小凳子学习 
win下面目前的11.1x系列默认确实好像不提示loop was vectorized
linux 应该还是会提示的

8 楼

好像大家都喜欢4,lapack里也是以4为步长,好像这个数挺适合现在的计算机的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册