C++性能优化 —— __builtin_prefetch()数据预读

C++性能优化 —— __builtin_prefetch()数据预读

References

  1. __builtin_prefetch()
  2. Prefetching with __builtin_prefetch
  3. Data Prefetch 数据预取
  4. 数据预读对二分查找的优化
  5. 你见过哪些令你瞠目结舌的C/C++代码技巧?

一、什么是 __builtin_prefetch()?

为了降低内存读取的cache-miss延迟,可以通过gcc提供的这个内置函数来预读数据。当知道数据的内存地址即将要被读取(在下一个load & store指令到来之前),在数据被处理之前,就可以在代码中通过指令通知目标,去读取数据并放到缓存中。

Note that the prefetching instruction is a hint, which means that your target processor might, or might not, actually prefetch the data.

二、用法

__builtin_prefetch (const void *addr[, rw[, locality]]) 

1. addr (required): 代表内存地址

  • 0 (default): prepare the prefetch for a read

  • 1 : prepare the prefetch for a write to the memory

2. rw (optional) : 编译时的常量

  • 0: None, the data can be removed from the cache after the access.

  • 1: Low, L3 cache, leave the data in the L3 cache level after the access.

  • 2: Moderate, L2 cache, leave the data in L2 and L3 cache levels after the access.

  • 3 (default): High, L1 cache, leave the data in the L1, L2, and L3 cache levels after the access.

三、适用场景

适用于数据访问有较大随机性的场景。

  1. 数组的二分查找,此时,数组访问具有较大的随机性。
  2. 用来加快各种结构的迭代速度:链表、树、堆、哈希等。
  3. Vpp bihash预读bucket和data。

四、缺点

需要注意,软件预取是有代价的:我们的系统执行了更多的指令,并将更多的数据加载到缓存中,这在某些情况下可能会导致其他方面的性能下降。

posted on 2023-02-02 14:38  七昂的技术之旅  阅读(2582)  评论(0编辑  收藏  举报

导航