小编phy*_*ash的帖子

如何避免多个线程写入共享数组的缓存行失效?

问题的背景:

我正在编写一个代码,创建32个线程,并将它们的亲和性设置为我的多核多处理器系统中的32个核心中的每一个.

线程只是执行RDTSCP指令,并且值存储在非重叠位置的共享数组中,这是共享数组:

uint64_t rdtscp_values[32];
Run Code Online (Sandbox Code Playgroud)

因此,每个线程都将根据其核心编号写入特定的阵列位置.

最重要的是,一切都正常工作,除了我知道我可能没有使用正确的数据结构来避免缓存行反弹.

PS: 我已经检查过我的处理器缓存行是64字节宽.

因为我使用的是一个简单的uint64_t数组,所以它意味着由于预读,单个缓存行将存储该数组的8个位置.

题:

由于这个简单的数组,虽然线程写入不同的索引,但我的理解是,每次写入此数组都会导致所有其他线程的缓存失效?

我怎样才能创建一个与缓存行对齐的结构?

编辑1

我的系统是: 2x Intel Xeon E5-2670 2.30GHz(8核,16线程)

c multithreading caching x86-64

5
推荐指数
1
解决办法
942
查看次数

是否有任何原子集操作在C中返回旧值?

我正在寻找一些atomic_set类似于函数的函数,它以原子方式设置变量的值,同时返回类似于的前一个值compare_and_swap.

这是我的期望:

int old_val = atomic_set(mem_address, 10);
Run Code Online (Sandbox Code Playgroud)

c atomic

5
推荐指数
1
解决办法
184
查看次数

如何根据 menuconfig 标志修改构建后脚本中的文件?

我需要在Buildroot编译之后和在创建 rootfs 之前找到一种方法来修改/编辑给定文件,具体取决于menuconfig标志选择。我可以在Buildroot文档中找到可以通过使用构建后脚本来做到这一点。

我的问题是,只有在menuconfig 中选择了某些内容时,我才会执行脚本操作,例如:

(x) Enable my_login_system;
Run Code Online (Sandbox Code Playgroud)

如果我选择my_login_system,那么我需要根据以下内容更改nsswitch.conf文件:

passwd:        my_login files
Run Code Online (Sandbox Code Playgroud)

如果我没有在 menuconfig 中选择“my_login_system”,那么 nsswitch.conf 应该是:

passwd:        files my_login
Run Code Online (Sandbox Code Playgroud)

所以,我的主要问题是如何知道在构建后脚本中是否选择了“my_login_system”。

login buildroot post-build

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

标签 统计

c ×2

atomic ×1

buildroot ×1

caching ×1

login ×1

multithreading ×1

post-build ×1

x86-64 ×1