我正在尝试使用优化一些C++(RK4)
__builtin_prefetch
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何预取整个结构.
我不明白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; …Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序来分析社交网络图.这意味着程序需要大量的随机内存访问.在我看来,预取应该有所帮助.这是从顶点的邻居读取值的一小段代码.
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)