相关疑难解决方法(0)

生产者 - 消费者在超兄弟姐妹与非兄弟姐妹之间共享内存位置的延迟和吞吐量成本是多少?

单个进程中的两个不同线程可以通过读取和/或写入来共享公共存储器位置.

通常,这种(有意)共享是使用lockx86上的前缀使用原子操作实现的,该前缀对于lock前缀本身(即,无竞争成本)具有相当广为人知的成本,并且当实际共享高速缓存行时还具有额外的一致性成本(真或共享).

在这里,我对生产 - 消费者成本感兴趣,其中单个线程P写入内存位置,另一个线程`C从内存位置读取,都使用普通读取和写入.

在同一个套接字上的不同内核上执行此类操作的延迟和吞吐量是多少,并且在最近的x86内核上在同一物理内核上执行兄弟超线程时进行比较.

在标题中,我使用术语"超级兄弟"来指代在同一核心的两个逻辑线程上运行的两个线程,以及核心间兄弟,以指代在不同物理核心上运行的两个线程的更常见情况.

concurrency performance x86 hyperthreading

17
推荐指数
2
解决办法
846
查看次数

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

问题的背景:

我正在编写一个代码,创建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
查看次数