我如何知道我的 CPU 是在内核之间共享向量寄存器,还是每个内核都有自己的私有寄存器?
我在哪里可以获得参考资料?
我希望使用多线程和 SIMD 来优化我的程序的浮点计算。它们会引起任何冲突吗?
我如何知道我的 CPU 是在内核之间共享向量寄存器,还是每个内核都有自己的私有寄存器?
我在哪里可以获得参考资料?
我希望使用多线程和 SIMD 来优化我的程序的浮点计算。它们会引起任何冲突吗?
从您在另一条回复中的评论来看,您似乎指的是 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 个在任何给定时间并行工作,其余的只是非常快速地切换线程。
就开发人员而言,每个“核心”都是一个处理器,它恰好位于同一个芯片上。您可能关心的任何事情都在线程级别的硬件和/或操作系统中抽象出来。