为了账号安全,请及时绑定邮箱和手机立即绑定

__builtin_prefetch,它读多少?

/ 猿问

__builtin_prefetch,它读多少?

C++
慕仰0522570 2020-01-05 04:00:10

我正在尝试通过使用优化一些C ++(RK4)


__builtin_prefetch

我不知道如何预取整个结构。


我不知道const void *addr读了多少书。我希望有下一个值from和to加载。


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/


查看完整描述

2 回答

?
Qyouu

我认为它只是发出一条FETCH机器指令,该指令基本上会获取行高速缓存,其大小取决于处理器。


您可以使用__builtin_prefetch (con[i+3].Pfrom)例如。以我的(少量)经验,在这样的循环中,最好预先预取几个元素。


不要__builtin_prefetch太频繁地使用(即不要将它们大量放入循环中)。如果需要,请测量性能提升,并使用GCC优化(至少-O2)。如果您很幸运,手动__builtin_prefetch可以将循环的性能提高10%或20%(但也可能会造成伤害)。


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


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


硬件(处理器)和编译器在缓存方面都取得了很大进步,因此似乎__builtin_prefetch在今天(2018年)使用的用处不大。一定要进行替补。



查看完整回答
反对 2020-01-06
?
慕村9548890

它读取高速缓存行。高速缓存行的大小可能有所不同,但是在现代CPU上最有可能为64字节。如果您需要读取多条缓存行,请签出prefetch_range

查看完整回答
反对 2020-01-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信