相关疑难解决方法(0)

168
推荐指数
7
解决办法
7万
查看次数

了解std :: hardware_destructive_interference_size和std :: hardware_constructive_interference_size

C++ 17添加std::hardware_destructive_interference_sizestd::hardware_constructive_interference_size.首先,我认为这只是获取L1缓存行大小的可移植方式,但这是过于简单化.

问题:

  • 这些常量如何与L1缓存行大小相关?
  • 是否有一个很好的例子来演示他们的用例?
  • 两者都是定义的static constexpr.如果您构建二进制文件并在具有不同缓存行大小的其他计算机上执行它,这不是问题吗?当您不确定您的代码将运行在哪台机器上时,如何防止错误共享?

c++ concurrency c++17

64
推荐指数
2
解决办法
4605
查看次数

x86-64 的缓存填充大小应该为 128 字节吗?

我发现了一条来自 的评论crossbeam

从 Intel 的 Sandy Bridge 开始,空间预取器现在一次提取成对的 64 字节缓存线,因此我们必须对齐到 128 字节而不是 64。

资料来源:

我在英特尔的手册中没有找到这样的说法。但直到最新的提交,folly仍然使用 128 字节填充,这让我很有说服力。所以我开始编写代码来看看是否可以观察到这种行为。这是我的代码。

#include <thread>

int counter[1024]{};

void update(int idx) {
    for (int j = 0; j < 100000000; j++) ++counter[idx];
}

int main() {
    std::thread t1(update, 0);
    std::thread t2(update, 1);
    std::thread t3(update, 2);
    std::thread t4(update, 3);
    t1.join();
    t2.join();
    t3.join();
    t4.join();
}
Run Code Online (Sandbox Code Playgroud)

编译器资源管理器

我的CPU是锐龙3700X。当索引为0123时,大约需要 1.2 秒才能完成。当索引为0, 16, 32,时 …

c++ x86-64 rust cpu-cache false-sharing

15
推荐指数
1
解决办法
2210
查看次数