相关疑难解决方法(0)

__builtin_prefetch,它读了多少?

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

__builtin_prefetch
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何预取整个结构.

我不明白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; …
Run Code Online (Sandbox Code Playgroud)

c++ optimization gcc x86-64 numerical-methods

16
推荐指数
2
解决办法
2万
查看次数

为什么GCC __builtin_prefetch没有提高性能?

我正在编写一个程序来分析社交网络图.这意味着程序需要大量的随机内存访问.在我看来,预取应该有所帮助.这是从顶点的邻居读取值的一小段代码.

for (size_t i = 0; i < v.get_num_edges(); i++) {
    unsigned int id = v.neighbors[i];
    res += neigh_vals[id];
}
Run Code Online (Sandbox Code Playgroud)

我将上面的代码转换为下面的代码,并预取顶点的邻居值.

int *neigh_vals = new int[num_vertices];

for (size_t i = 0; i < v.get_num_edges(); i += 128) {
    size_t this_end = std::min(v.get_num_edges(), i + 128);
    for (size_t j = i; j < this_end; j++) {
        unsigned int id = v.neighbors[j];
        __builtin_prefetch(&neigh_vals[id], 0, 2);
    }
    for (size_t j = i; j < this_end; j++) {
        unsigned int id = v.neighbors[j];
        res …
Run Code Online (Sandbox Code Playgroud)

c performance gcc prefetch

2
推荐指数
1
解决办法
1559
查看次数

标签 统计

gcc ×2

c ×1

c++ ×1

numerical-methods ×1

optimization ×1

performance ×1

prefetch ×1

x86-64 ×1