c++ - __builtin_prefetch,它读了多少?

标签 c++ optimization gcc x86-64 numerical-methods

我正在尝试使用

优化一些 C++ (RK4)
__builtin_prefetch

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

我不明白 const void *addr 读取了多少。我想加载 fromto 的下一个值。

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 机器指令,它基本上获取一个行缓存,其大小是特定于处理器的。

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

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

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

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


(2018 年 1 月添加:)

硬件(处理器)和编译器都在缓存方面取得了很大进展,因此在今天(2018 年)使用 __builtin_prefetch 似乎不太有用。一定要进行基准测试。

关于c++ - __builtin_prefetch,它读了多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460563/

相关文章:

C++覆盖具有与基类不同的返回类型的函数

c++ - 模板化类定义在 VS2017 中无法编译

c - 一条 switch 语句占用多少代码空间?

mysql - 查询优化 - WHERE 子句中的表达式顺序

gcc - 如何忽略外部库头文件中的 gcc 编译器迂腐错误?

c++ - CPPUTest 调试 - C++

c++ - 结合 std::wstring 和函数

C++:指针和编译器(别名?)优化

c - GCC:如何阻止 gcc 为 .o 文件创建随机临时文件名

c++ - 如何为外部 header 隐藏 'note: … ' gcc输出?