我正在用C编写一个优化程度极高、CPU密集型的多线程代码,它在或多或少有限的时间空间内执行任务。在此期间,除了加载初始值和存储最终结果之外,它不会冒险离开其一级缓存。所以本质上,这是一个并行化的代码,它对添加的每个核心都进行线性扩展。这就是在非HT内核上发生的情况。
在我的带有HT的2核i5上(BIOS不允许禁用它——无论如何,这是一个不切实际的解决方案),当我从一个核变成两个核时,我得到了令人恼火的惨淡改进。我的假设是,第一个线程在一个核心上单独运行,第二个线程与第一个线程共享核心。
Windows API中有一些函数可以检索有关可用内核和HT的信息。但是,我如何利用这些信息来确保每个核心在一个超线程上只有一个线程?
本文可能有助于:http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11
请参阅"CPU相关性"部分和"检测超线程"部分。
无论您是否使用HT逻辑内核,操作系统都将使用HT逻辑核心,其结果是缓存的大小实际上减半。你可以把一个线程固定在一个逻辑核心上,但我怀疑这对你没有帮助。你的问题只是HT的存在。你确实需要关闭它。