我怎么知道我的 CPU 是在内核之间共享向量寄存器还是每个内核都有自己的专用寄存器?

How can I know whether my CPU shares the vector registers among the cores or each core has its private ones?

我怎么知道我的 CPU 是在内核之间共享向量寄存器还是每个内核都有自己的专用寄存器?

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

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

就开发人员而言,每个 "core" 都是一个处理器,恰好位于同一芯片上。您可能关心的任何事情都在硬件和/或线程级别 os 中进行了抽象。

从您在另一个回复中的评论来看,您指的似乎是 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 个内核在任何给定时间并行工作,其余的只是非常快速地切换线程。