【问题标题】:How can I know whether my CPU shares the vector registers among the cores or each core has its private ones?我如何知道我的 CPU 是在内核之间共享向量寄存器还是每个内核都有自己的私有寄存器?
【发布时间】:2015-05-03 17:41:52
【问题描述】:

我如何知道我的 CPU 是在内核之间共享向量寄存器还是每个内核都有自己的私有寄存器?

我在哪里可以获得参考资料?

我希望使用多线程和 SIMD 来优化我的程序的浮点计算。它们会引起任何冲突吗?

【问题讨论】:

    标签: multithreading cpu-architecture simd cpu-registers xeon-phi


    【解决方案1】:

    从您的 cmets 在另一个回复中判断,您似乎指的是 Xeon Phi。如果我理解正确,您是在问每个线程是否有自己的一组私有向量寄存器?答案是肯定的!

    为了进一步澄清,Xeon Phi 有大约 50 个内核,每个内核都有自己的寄存器文件。在内部,每个内核都支持同时多线程 (SMT),因此寄存器文件在线程之间共享,但是每个内核至少会有 4x16 个 512 位逻辑向量寄存器。如果选择使用 SMT,寄存器不会有任何冲突,但向量功能单元可能会发生冲突。这个想法是,当一个正在等待缓存未命中或类似情况时,您可以在同一核心内的线程之间切换。

    编辑以回答您的问题:什么是 SMT?

    Xeon Phi 有 50 个物理有序内核。每个内核都有自己的 L1 指令缓存、数据缓存和两个功能单元。在传统设计中,核心会在一个线程中从 i-cache 中获取两条相邻的指令,并尝试在两个可用的功能单元上执行它们。在执行数据不存在于 d-cache 中的加载指令时,会出现一个使该技术效率低下的常见问题。处理器很难找到发送到其功能单元的指令,因为后续指令通常取决于正在加载的数据。

    SMT 是一种有助于缓解这种情况的技术。它为每个内核提供了足够的额外结构来有效地管理额外的线程。在 Xeon Phi 中,逻辑寄存器文件和程序计数器被复制了四次。大多数其他结构,如缓存和功能单元,可以保持或多或少相同。现在,当存在 d-cache 未命中时,处理器将开始获取另一个线程的指令并将它们发送到它们在该线程的寄存器子集上操作的功能单元。这样它就可以在等待主内存时找到工作要做,而无需完全上下文切换的高开销。

    总结一下:您可能会在 Xeon Phi 上看到 200 个内核,但实际上其中只有 50 个在任何给定时间并行工作,其余的只是非常快速地切换线程。

    【讨论】:

    • 您能详细说明一下“向量功能单元”的内容吗?谢谢。
    • 我可以试试。我在上面编辑了我的答案。不要忘记投票并选择一个回答您问题的答案。
    • 英特尔超线程不是切换停止,它实际上在非停止线程之间交替前端周期。 Xeon Phi 在其大核芯片(例如 Skylake)上使用 4 路 SMT 而不是 2 路的原因是为了更好地隐藏 FP 延迟,而无需大量无序执行资源。 en.wikipedia.org/wiki/Simultaneous_multithreading#Taxonomy - switch-on-stall 是粗粒度的。英特尔的实际实现是细粒度的:前端循环,竞争性地共享寄存器文件和调度程序,来自不同线程的指令能够并行调度到执行单元。
    【解决方案2】:

    就开发人员而言,每个“核心”都是一个处理器,它恰好位于同一个芯片上。您可能关心的任何事情都在线程级别的硬件和/或操作系统中抽象出来。

    【讨论】:

    • 我不明白。对硬件进行优化,如果全部抽象出来,什么都不用关心,那将是毫无意义的。实际上,如果每个内核都提供向量寄存器,据我所知,最终会得到不同的优化。
    • 不,我的意思是,就开发人员而言,一个芯片上的多个内核与多个实际处理器相同,如果您真的对细节感兴趣(假设您在谈论关于 X86/64)您可以获得英特尔手册,但是您提出的问题超出了您尝试做的范围,当您使​​用多线程和/或 simd 时,您不需要知道是否您正在使用内核或单独的物理处理器,从程序员的角度来看是一样的,通常您唯一需要知道的是 1:可以同时运行多少个物理线程
    • 和 2 比你需要更多的 CPU 绑定,你不需要特别担心如何自己设置寄存器,现在如果你告诉我们你想做什么一种更具体的方式(什么语言,什么应用程序类型等)我可以更详细地介绍,但在全球范围内,答案是 CPU 内核与程序员的单独处理器相同,只是物理上不同(相同的芯片)甚至在相同的处理器线程不“共享”寄存器,由操作系统处理,将它们保存/切换到其他进程/切换回并恢复它们
    • 所以作为一个程序员,使用这些寄存器,不要担心它们在哪里或它们是什么,因为它不是在你的级别处理,而是在操作系统级别(基本上,如果不是每个都有自己的他们共享的一组寄存器,这毫无意义,仍然会被操作系统抽象出来,这将确保你的每个线程,即使你只有 2 个内核有 100 个线程,也有自己的寄存器值)
    • 好的,我正在使用 C++ OpenMP,如果需要,我可以使用内联汇编。 x86_64。 (英特尔至强 E5 与至强融核)
    猜你喜欢
    • 2015-05-03
    • 2020-09-04
    • 2012-11-06
    • 2013-03-16
    • 2018-01-14
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多