我正在用 C 编写一个极其优化且 CPU 密集型的多线程代码,它在或多或少有限的时间空间内执行任务。在此期间,除了加载初始值和存储最终结果之外,它不会冒险离开其 L1 缓存。所以本质上这是一个并行化的代码,它为每个添加的核心线性扩展。这就是在非 HT 内核上发生的情况。
在我的带有 HT 的 2 核 i5 上(BIOS 不允许禁用它 - 无论如何这是一个不切实际的解决方案),从一个核心变为两个核心时,我得到了令人讨厌的令人沮丧的改进。我的假设是第一个线程单独运行在一个核心上,第二个线程与第一个共享核心。
Windows API 中有一些函数可以检索有关可用内核和 HT 的信息。但是我如何利用这些信息来确保每个核心的一个超线程上只有一个线程?