【问题标题】:Cores and hyperthreading内核和超线程
【发布时间】:2012-07-13 14:08:39
【问题描述】:

我正在用 C 语言编写一个极其优化且 CPU 密集型的多线程代码,它在或多或少有限的时间空间内执行任务。在此期间,除了加载初始值和存储最终结果之外,它不会冒险离开其 L1 缓存。所以本质上这是一个并行代码,它为每个添加的核心线性扩展。这就是在非 HT 内核上发生的情况。

在我的带有 HT 的 2 核 i5 上(BIOS 不允许禁用它 - 无论如何这是一个不切实际的解决方案),当我从一个核心变为两个核心时,我得到了令人讨厌的令人沮丧的改进。我的假设是第一个线程单独运行在一个核心上,第二个线程与第一个共享核心。

Windows API 中有一些函数可以检索有关可用内核和 HT 的信息。但是如何利用这些信息来确保每个内核的一个超线程上只有一个线程呢?

【问题讨论】:

  • 试试 SetThreadAffinityMask 还是 SetProcessAffinityMask?

标签: winapi scalability multicore hyperthreading


【解决方案1】:

这篇文章可能会有所帮助: http://msdn.microsoft.com/en-us/magazine/cc300701.aspx#S11

请参阅“CPU 关联性”部分和“检测超线程”部分。

【讨论】:

    【解决方案2】:

    无论您是否使用,操作系统都将使用 HT 逻辑内核,其结果是缓存的大小有效减半。您可以将线程固定到逻辑核心,但我怀疑它对您没有帮助。您的问题仅仅是 HT 的存在。您确实需要将其关闭。

    【讨论】:

    • 即使是这样,机器将由我的线程控制,与他们所做的工作相比,操作系统的东西可以忽略不计。而且每个线程的代码和数据只有几个KiB,所以缓存应该没问题。
    猜你喜欢
    • 2015-04-14
    • 2018-06-09
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多