__builtin_prefetch,它读多less?

我试图通过使用优化一些RK4 GCC C ++代码

__builtin_prefetch 

我在试图弄清楚如何预取一整堂课时遇到一些麻烦。 我不明白有多less的const void *addr被读取。 所以我有from和加载的下一个值。

 for (int i = from; i < to; i++) { double kv = myLinks[i].kv; particle* from = con[i].Pfrom; particle* to = con[i].Pto; //Prefetch values at con[i++].Pfrom & con[i].Pto; double pos = to->px- from->px; double delta = from->r + to->r - pos; double k1 = axcel(kv, delta, from->mass) * dt; //axcel is an inlined function double k2 = axcel(kv, delta + 0.5 * k1, from->mass) * dt; double k3 = axcel(kv, delta + 0.5 * k2, from->mass) * dt; double k4 = axcel(kv, delta + k3, from->mass) * dt; #define likely(x) __builtin_expect((x),1) if (likely(!from->bc)) { from->x += (( k1 + 2 * k2 + 2 * k3 + k4) / 6); } } 

链接: http : //www.ibm.com/developerworks/linux/library/l-gcc-hacks/

我认为它只是发出一个FETCH机器指令,它基本上取得一个行caching,其大小是处理器特定的。

你可以使用__builtin_prefetch (con[i+3].Pfrom)作为例子。 根据我的(小)经验,在这样的循环中,最好提前预取几个元素。

不要经常使用__builtin_prefetch (即不要把它们放在循环中)。 如果您需要测量性能增益,并使用GCC优化(至less-O2 )。 如果你非常幸运,手动__builtin_prefetch可以使你的循环性能提高10%或20%(但也可能会伤害它)。

如果这样的循环对您来说至关重要,您可以考虑在OpenCL或CUDA的GPU上运行它(但要求以OpenCL或CUDA语言重新编码一些例程,并将其调整到特定的硬件)。

也使用最近的GCC编译器(最新版本是4.6.2 ),因为它在这些领域取得了很大的进展。

它读取caching行。 高速caching行大小可能会有所不同,但在现代CPU上最可能是64字节。 如果您需要读取多个caching行,请查看prefetch_range