我正在编写一个代码,创建32个线程,并将它们的亲和性设置为我的多核多处理器系统中的32个核心中的每一个.
线程只是执行RDTSCP指令,并且值存储在非重叠位置的共享数组中,这是共享数组:
uint64_t rdtscp_values[32];
Run Code Online (Sandbox Code Playgroud)
因此,每个线程都将根据其核心编号写入特定的阵列位置.
最重要的是,一切都正常工作,除了我知道我可能没有使用正确的数据结构来避免缓存行反弹.
PS: 我已经检查过我的处理器缓存行是64字节宽.
因为我使用的是一个简单的uint64_t数组,所以它意味着由于预读,单个缓存行将存储该数组的8个位置.
由于这个简单的数组,虽然线程写入不同的索引,但我的理解是,每次写入此数组都会导致所有其他线程的缓存失效?
我怎样才能创建一个与缓存行对齐的结构?
我的系统是: 2x Intel Xeon E5-2670 2.30GHz(8核,16线程)
我正在寻找一些atomic_set类似于函数的函数,它以原子方式设置变量的值,同时返回类似于的前一个值compare_and_swap.
这是我的期望:
int old_val = atomic_set(mem_address, 10);
Run Code Online (Sandbox Code Playgroud) 我需要在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”。