主题:loop was vectorized
fgl630
[专家分:130] 发布于 2010-03-23 22:08:00
在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个回复)
沙发
yeg001 [专家分:14390] 发布于 2010-03-24 00:13:00
我印象中ivf11.0的时候编译优化都会有loop was vectorized, 这个跟你的MPICH2没什么关系吧.
后来的ivf版本就没出现这个了...
板凳
fgl630 [专家分:130] 发布于 2010-03-24 10:36:00
[quote]我印象中ivf11.0的时候编译优化都会有loop was vectorized, 这个跟你的MPICH2没什么关系吧.
后来的ivf版本就没出现这个了...[/quote]
对,这个优化应该和MPICH2没有关心,可是这个优化是干啥的了?
3 楼
yeg001 [专家分:14390] 发布于 2010-03-24 14:01:00
没有研究过编译器, 具体优化了什么不清楚. 字面理解是矢量化了吧. 我试过在单核心的机上编译同样有这个提示.
关于优化这方面"f2003"兄比较清楚.
4 楼
fgl630 [专家分:130] 发布于 2010-03-25 10:09:00
呼呼f2003兄来解释一下!
5 楼
f2003 [专家分:7960] 发布于 2010-03-28 19:35:00
矢量化是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 楼
blitheli [专家分:440] 发布于 2010-03-30 21:25:00
看了f2003兄真的长见识了。
虽然看的模模糊糊的。呵呵
7 楼
谁是谁的谁 [专家分:350] 发布于 2010-03-31 14:29:00
搬个小凳子学习
win下面目前的11.1x系列默认确实好像不提示loop was vectorized
linux 应该还是会提示的
8 楼
allocate [专家分:540] 发布于 2010-04-03 17:09:00
好像大家都喜欢4,lapack里也是以4为步长,好像这个数挺适合现在的计算机的。
我来回复