我正在尝试使用gcc' s __builtin_prefetch
访问模式如下所示
A [B [C [i]]] // i是诱导变量
我遵循以下博客(link)的建议来加速此访问模式。 (博客中的规范示例如下所示:)
for (i=0; i<NUM_KEYS; i++) {
// The intuitive case, but also
// required for optimal performance.
SWPF(key_buff1[key_buff2[i + offset]]);
// Required for optimal performance.
SWPF(key_buff2[i + offset*2]);
key_buff1[key_buff2[i]]++;
}
我的代码段如下所示
int prefetchOffset(64);
#pragma omp parallel for
for (auto n=0; n < g.num_nodes(); n++) {
/* prefetch instructions added */
__builtin_prefetch(°ree_id_pairs[n + prefetchOffset], 0);
__builtin_prefetch(&new_ids[degree_id_pairs[n + (prefetchOffset / 2)].second], 1);
/* kernel I wish to optimize */
degrees[n] = degree_id_pairs[n].first; //degree_id_pairs is a containers of std::pair<int, int>
new_ids[degree_id_pairs[n].second] = n;
inv_degrees[n] = g.in_degree(degree_id_pairs[n].second);
}
在多次尝试(调整偏移值)时,我无法提高性能。更糟糕的是,在大多数尝试中,表现似乎都是坦克
任何想法为什么SW prefetches不适用于间接内存访问模式。我很困惑,因为这是HW预取器无法处理的案例
此外,欢迎不加预取加速A [B [C [i]]]的提示
系统信息:Intel Xeon E5-2660v4(14C:28T),Debian stretch(内核4.9),gcc-6.3(优化级别-O3)