与小物体虚假共享

时间:2018-11-22 14:52:29

标签: caching memory-layout false-sharing

我目前正在重构遗留代码,偶然发现了链表的这个奇怪的节点

#define CACHE_LINE 128

struct Node {
public:
    intptr_t value;
    Node *next;
    Node *prev;
    bool dummy;
private:
    // Avoid false sharing
    unsigned char padding[CACHE_LINE - sizeof(intptr_t) - 2 * sizeof(Node *) - sizeof(bool)];
};

假设我正在处理的系统的缓存行宽为32字节,这意味着该对象将占用多达4个缓存行(带有32字节缓存行)。其中3个将完全为空。

此链接列表是无锁队列的一部分。我尚未确定有多少生产者和多少消费者在使用它。在this other post中,答案指出以下内容:

  

一个澄清:对于负面影响,至少应写一些对“错误共享”变量的访问。如果很少写入,那么错误共享对性能的影响就可以忽略不计;写的越多(使高速缓存行使消息无效),性能越差。

我的问题如下:什么会使我的表现下降最多?在这个小对象上错误共享,还是我的缓存的四分之一将填充填充?

Compiler Explorer上的内存布局的实时表示

0 个答案:

没有答案