为什么循环如此之快?

时间:2015-12-31 11:24:21

标签: cpu compiler-optimization

fortran中的以下循环几乎没有时间

def got_three?(array)
  array.chunk_while(&:==).any?{|g| g.size >= 3}
end

但我只是不明白,我们的cpu大约是GHz,这意味着一秒钟就会有10 ^ 9个循环,而上面的循环周期远远超过10 ^ 9,为什么它几乎不需要时间?

似乎在编译时不计算这些值。我们可以添加外循环,直到

j=0
do i=1,1000000000000000000
    j=j+1
end do
print*,j

现在我的电脑需要一秒钟

修改

我正在使用windows,intel parallel studio 15,没有额外的编译选项:只需do m=1,1000000000 do i=1,1000000000000000000 j=j+1 end do end do print*,j 。定时方法很简单,只需在命令行按Enter后执行.exe

即可

1 个答案:

答案 0 :(得分:1)

不了解fortran,但如果这是C,编译器可以优化上面的代码,完全删除循环,因为j的值可以在编译时计算。

所以上面的代码将缩减为

print 1000000000000000000

关于周期和指令的逻辑是有缺陷的。现代CPU在硬件级别上并行化代码,即使代码是串行的:

  • cpu有更多的ALU可以并行计算算术指令

  • 指令在流水线中执行,因此在任何一点,并行执行连续指令的不同阶段。

所以"每个周期最多一条指令"没有。

increment by one也是CPU中最快的指令之一。