在阅读“MPI并行编程”的以下段落时:
没有向量,每个基本操作都必须被提取和解码n次。使用向量指令,每个基本指令只需要发出一次。差异有点类似于Fortran 77代码
之间的差异do i=1,n z(i) = x(i) + y(i) end do
和等效的Fortran 90代码
z(1:n) = x(1:n) + y(1:n)
为了验证两个代码版本确实给出了不同的运行时间,我编写了以下代码:
program vector
parameter (n=1000000, iruns=4)
real x(n),y(n),z(n),t1,t2,time
integer clock_rate,count_max
do i=1,n
x(i)=i
y(i)=i*2
enddo
time=0.
do irun=1,iruns
call cpu_time(t1)
do i=1,n
z(i) = x(i) + y(i)
enddo
call cpu_time(t2)
time = time + t2 - t1
enddo
time = time/real(iruns)
print '(a,e12.5)','sum z = ',sum(z)
print '(2(a,e12.5,2x))','time serial = ',time,'sec'
time=0.
do irun=1,iruns
call cpu_time(t1)
z(1:n) = x(1:n) + y(1:n)
call cpu_time(t2)
time = time + t2 - t1
enddo
time = time/real(iruns)
print '(a,e12.5)','sum z = ',sum(z)
print '(2(a,e12.5,2x))','time vector = ',time,'sec'
end
打印输出:
sum z = 0.15004E+13
time serial = 0.39995E-02 sec
sum z = 0.15004E+13
time vector = 0.12497E-02 sec
我的问题是,假设向量运算比串行运算快得多(本例中为3倍),那么在向量运算中使用串行运算是否更可取?