将缓存线迁移到另一个核心
Force a migration of a cache line to another core
in C (使用平台上可用的任何低级内在设备(用于X86硬件(例如,Intel Skylake(在该核心上螺纹显式加载行?
我的用户酶是在同一数据结构中。在这种情况下,在某些情况下,核心会经历内存中的某些位置,而这些位置可能由其他核心在探测斑点时可能拥有。这些内核上的线程通常在条件变量上被阻塞,因此它们有一些备用周期,可以在其中运行其他"有用的工作"。这里可能的"有用工作"的一个示例可能是它们将数据流到了另一个核心,以便将来加载它们,因此加载核心不必等待该行才能进入其缓存之前。x86硬件上是否可以使用一些内在/指令?
__builtin_prefetch的工作不佳,因为出于某种原因,它最终添加了延迟到执行加载的代码:(也许步伐不佳,但我无法获得良好的步伐到目前为止。这可能是更好地处理的,并且从知道最终会加载的其他核心方面进行决定。
没有"推";仅在核心请求之后,缓存线才能在物理核心上输入L1D。(由于负载,SW预取甚至HW预取。(
2逻辑核心可以共享相同的物理核心,以防万一有帮助:如果某些未来负载的延迟远比吞吐量更重要,则唤醒预摘要的线程可能会不那么恐怖。我想象的是让作者使用条件变量或发送posix信号,或写入管道,或者将某些cpu亲和力设置为一个或两个逻辑核心的线程,或者将其写入管道。您关心的其他一些线程也被固定在。
您可能从作者侧做的最好的是触发写作 - 共享(l3(缓存,因此另一个核心可以在L3中击中,而不是找到其他核心所有核心所有的核心并具有也等待写作。(或取决于UARCH,对于直接核心 ->核心传输(
例如。在冰湖上或以后,使用clwb
迫使写下,从而使其干净但仍然缓存。(但是请注意,迫使它一直到DRAM。(SKX上的clwb
确实像clflushopt
一样驱逐。
另请参见CPU缓存抑制,我建议在主流操作系统下可能使用设置的记忆区域来写入缓存。另请参见如何强制CPU核心在C?
中冲洗存储缓冲区,当然也可以将作者和读者固定到相同的物理核心上,因此它们通过L1D进行通信。但是他们竞争执行资源。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 将缓存线迁移到另一个核心
- 如何在另一个核心上启动线程而不将处理器亲和力设置为特定核心
- C 语言中的另一个核心转储问题
- 在Win32上,如何将线程移动到另一个CPU核心