茱莉亚•埃文斯

计算机是快速* * !!

所以我有一台电脑。我的电脑包含硬件(如CPU !RAM !L1 / L2缓存!),但我不明白很好hardwareis多快,我有什么工具配置文件,和多少次myprograms跑步是RAM /硬盘/ CPU之间的分裂。

所以今天我搭配萨莎Laundy,我们SeriousInvestigations跑多快我的电脑可以处理一个1 gb的文件。

对象:

  • 编辑部的一集(1 gb)
  • 一个任务:把所有字节(mod 256)

这是我能想到的最简单的任务,thatinvolved处理整个文件(所以没有得到优化的编译器)。

步骤1:编写一个程序,把所有的字节

我写了一个小的C程序,该程序添加一个文件的所有字节。它。bytesum.c,读64 k的文件块,然后添加所有bytesinto char。

这个运行非常快!我编译的gcc -Ofast(让itFASTER !)和它的所有字节

  • 2.5秒(我第一次运行程序)
  • 0.6秒(我第二次运行程序,因为它是alreadyloaded到RAM中)

我把这意味着它需要2 s文件读入内存(我一个固态硬盘在我的电脑,所以500 mb / s的意义),然后0.6 s todo实际adding-up-of-the字节。太棒了!我们现在知道,我从硬盘canread在500 mb / s。

第二步:尝试使用mmap让它快

这是一个很无聊的一步。我们使用mmap相反(见bytesum_mmap.c),希望这将使它更快。完全sameamount花了时间。下一个。

步骤3:使用向量intrinsic !!!!

然后我去了詹姆斯•波特,他告诉我,cpu有特殊指令做multipleadditions,我可以用它们来优化myprogram !所以我用google搜索“向量intrinsic”,从StackOverflow复制一些代码,和最后一个新版本:bytesum_intrinsics.c我安排它,它花了0.25秒!!!!

现在我们的程序运行快一倍,我们知道整个bunchof新单词(SSE !SIMD !向量intrinsic !)

第四步:让它慢。

既然我们已经写了一个超级快速程序,我想了解的CPU缓存更好。如果我们设计一大堆cachemisses吗?我写了一个新版本bytesum_mmap.c添加了所有字节以一种不规则的方式,而不是通过所有thebytes秩序,将跳过从字节1到2001 3001 4001然后循环和访问2002年,3002年,…,100002.当你mightimagine,这不是非常有效。

你可以看到它的代码bytesum_stride.c我跑它./bytesum_stride*.mp4 60000,它花了20秒。我们已经知道缓存错过可以使代码慢40倍

第五步:0.25秒来自哪里?吗?吗?吗?

我还没有完全理解如何超快vectorintrinsic程序的性能抛锚了,尽管:that0.25秒是花了多少钱做内存访问,和innumerical计算多少钱?詹姆斯建议使用火星willapparently无限量的信息给你,但我花了几分钟试图让它工作和失败。

所以我用性能,这是一个完全不可思议performancemeasurement Linux的工具。我需要升级我的内核,一种nervewracking一点。但我做到了!它是美丽的。arecolours,我们把它注释performancestatistics的汇编代码。这就是我跑去做:

perf记录./bytesum_intrinsics TheNews.S01E04.mp4perf注释--无源

这里是结果:

movdqa指令与访问内存,在这些指令和itspends 32%的时间。所以我认为这意味着花32%的时间访问内存,和其他68%的时候做计算。超级的!!

还有很多事情我不明白这里——myconclusions关于这个程序是正确的吗?有进一步的事情我做优化呢?吗?

我也惊讶于C是速度。我用来写indynamic编程语言,绝对不过程1 gbfiles 0.25秒。乐趣!!

多想 我可以监视CPU周期性能!!