矢量与标量

时间:2017-09-06 18:51:54

标签: fortran gfortran

在阅读“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倍),那么在向量运算中使用串行运算是否更可取?

0 个答案:

没有答案