使用__builtin_prefetch无法获得性能改进

时间:2017-10-07 07:01:07

标签: c++ gcc prefetch

我正在尝试使用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(&degree_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)

0 个答案:

没有答案