gpt4 book ai didi

c++ - 强制将缓存行迁移到另一个核心

转载 作者:太空狗 更新时间:2023-10-29 20:19:39 29 4
gpt4 key购买 nike

在用于 x86 硬件(例如 Intel Skylake)的 C++(使用平台上可用的任何低级内在函数)中,是否可以将缓存行发送到另一个内核而不强制该内核上的线程加载该行明确?

我的用例在并发数据结构中。在这种情况下,在某些情况下,一个核心在探测位置时会经过内存中可能由其他一些核心拥有的某些位置。这些核心上的线程通常在条件变量上被阻塞,因此它们有一些空闲周期可以运行额外的“有用的工作”。这里“有用的工作”的一个例子可能是它们将数据流式传输到另一个核心,该核心将在将来加载它们,因此加载核心在处理它之前不必等待行进入它的缓存。 x86 硬件上是否有一些可用的内在/指令可以实现?


__builtin_prefetch 并没有很好地工作,因为出于某种原因,它最终将延迟添加回执行加载的代码 :( 也许步幅配置不当,但我无法取得良好的步幅到目前为止。这可能会得到更好的处理,并且确定性地从知道它们的行最终可能被加载的其他核心。

最佳答案

没有“推”;缓存行仅在该内核请求后才进入物理内核上的 L1d。 (因为加载、SW 预取,甚至是 HW 预取。)

2 个逻辑核心可以共享相同的物理核心,以防万一:如果某些 future 负载的延迟比吞吐量重要得多,那么唤醒预取辅助线程来启动这种情况可能不会那么可怕。我在想象让作者使用条件变量或发送 POSIX 信号,或写入管道,或导致操作系统辅助唤醒另一个线程的东西,该线程的 CPU 亲和性设置为一个或两个逻辑核心您关心的其他一些线程也被固定到。


您可以从写入端做的最好的事情是触发写回共享 (L3) 缓存,这样其他核心就可以命中 L3,而不是发现它属于其他核心并拥有也等待回写。 (或者根据 uarch,直接 core->core transfer)

例如在 Ice Lake 或更高版本上,使用 clwb 强制回写,导致它干净但仍被缓存。 (但请注意,这会强制它一直到 DRAM。)clwb on SKX does evict like clflushopt .

另见 CPU cache inhibition如果在主流操作系统下可能的话,我建议可能使用内存区域设置为直写缓存。另见 How to force cpu core to flush store buffer in c?

当然,也可以将编写器和读取器固定到同一个物理内核,以便他们通过 L1d 进行通信。但随后他们会争夺执行资源。

关于c++ - 强制将缓存行迁移到另一个核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57336172/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com