menu

hjk41的日志

Avatar

orz... GCC居然不是默认打开prefetch的

GCC真的很奇怪!

Itanium平台提供显式预取指令,也就是在实际访问数据之前,提前把它取到cache里,减少因为cache miss造成的流水线断流。这种指令是显式的,也就是说编译器得自己产生这种指令。事实上,预取指令的生成是编译器的重要优化之一。

今天想测一下gcc的预取效果怎么样,于是准备用gcc编译SPEC CPU2006,我用了-O3。编译的时候自己写了一个小程序,一个简单的for loop,对一个数组连续赋值,然后用gcc编译,发现编译出来的目标代码居然没有预取指令。不管用-O2还是-O3,都不产生预取指令。于是上网查,发现gcc有个选项叫 -fprefetch-loop-arrays,可以打开预取优化。不过文档上写的是这个优化在 -Os (optimize for size)的时候是关闭的,但没写在-O3的时候是不是也是关闭的。然后我把这个选项打开,目标代码里就有了预取指令。所以gcc在-O3的时候也是默认关闭预取的。难道因为这个优化还不稳定,所以没有默认打开?真奇怪!

gcc考虑的更多是x86和x64平台吧
默认不打开这个参数,也是清理之中的
毕竟gcc不是给ia64开发的,是通用的

prefetch是典型的以空间换时间的策略了。当然,这个空间是在cache中的,会有限制,也影响cache中的其它数据。所以通常prefetch在大型数组的计算中才有必要,在通常的应用中,要用到的数组和循环那么多,就没有必要prefetch了。

prefetch主要是拿来掩盖cache load stall的,当然它会占用一些cache,但一般都不多。对循环来说,指令prefetch可能是没什么用了,但数据prefetch是相当重要的。

楼上可能说是的指令prefetch?

gcc的平台移植性是很好的,现在基本上所有的平台都有gcc的移植了,所以说gcc主要考虑哪个平台倒很难说了。可能x86下的开发者比较多,所以针对x86做的优化也会多点

不过在编译器安装的时候都会自动根据所在的平台进行配置,gcc下面就有个专门的目录,写着各种平台的配置文件。而且,事实上x86下面也有prefetch,虽然现在一般是用一般的load指令来实现prefetch,但Core 2架构和AMD的K10都已经有显式的prefetch指令了

所以gcc默认不打开prefetch就让人很费解,估计是觉得prefetch帮忙不大?

我说的是数据prefetch.

评论已关闭