首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一些高频的C++ cache line面试

一些高频的C++ cache line面试

作者头像
公众号guangcity
发布2023-09-02 10:43:02
发布2023-09-02 10:43:02
3690
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

C++那些事之False Sharing与Cache line

最近看到一段代码,手动做的对齐,于是研究一下不对齐又会带来什么影响?

代码语言:javascript
复制
template <typename T>
class AtomicWithPadding {
 private:
  static constexpr int kCacheLineSize = 64;
  uint8_t padding_before[kCacheLineSize];

 public:
  std::atomic<T> value;

 private:
  uint8_t padding_after[kCacheLineSize];
};

这里便引出了大家面试的必考点:

  • Cache line

于是有下面几个面试问题,你能答上来?

  • 什么是cache line?
  • 什么是MESI协议?
  • 什么是False sharing?
  • C++里面如何保证避免False sharing?
  • 避免False sharing可以带来什么好处?
  • 你知道C++17之后提供了哪两个变量解决这个问题?

于是,找了个性能测试,大概实现是:

  • 定义4个变量,a、b、c、d,多线程进行共享
  • 另外是对这四个变量对齐,然后开n个线程去调度。

下面是benchmark:

代码语言:javascript
复制
------------------------------------------------------------------
Benchmark                        Time             CPU   Iterations
------------------------------------------------------------------
singleThread                  4.05 ms         4.04 ms          133
directSharing/real_time       8.78 ms        0.069 ms           77
falseSharing/real_time        8.81 ms        0.083 ms           74
noSharing/real_time           1.16 ms        0.071 ms          578

可以看到noSharing得到了非常好的效果!缓存命中率大大提高,当然这里用perf分析一下是更好的,可以看看L1 cache miss。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++那些事之False Sharing与Cache line
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档