Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 我如何知道我的CPU是在内核之间共享向量寄存器,还是每个内核都有自己的私有寄存器?_Multithreading_Cpu Architecture_Simd_Cpu Registers_Xeon Phi - Fatal编程技术网

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

Multithreading 我如何知道我的CPU是在内核之间共享向量寄存器,还是每个内核都有自己的私有寄存器?,multithreading,cpu-architecture,simd,cpu-registers,xeon-phi,Multithreading,Cpu Architecture,Simd,Cpu Registers,Xeon Phi,我如何知道我的CPU是在内核之间共享向量寄存器,还是每个内核都有自己的私有寄存器 我在哪里可以得到推荐人 我希望使用多线程和SIMD优化我的程序的浮点计算。它们会引起冲突吗?就开发人员而言,每个核心都是一个处理器,它恰好位于同一个芯片上。您可能关心的任何内容都是在硬件和/或操作系统的线程级别抽象出来的。从您在另一封回复中的评论判断,您所指的似乎是至强Phi。如果我理解正确的话,您会问每个线程是否都有自己的私有向量寄存器集?答案是肯定的 为了进一步澄清,Xeon Phi大约有50个核,每个核都有自

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

我在哪里可以得到推荐人


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

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

从您在另一封回复中的评论判断,您所指的似乎是至强Phi。如果我理解正确的话,您会问每个线程是否都有自己的私有向量寄存器集?答案是肯定的

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

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

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

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


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

我不明白。如果硬件都是抽象的,什么都不需要关心,那么对硬件的优化就毫无意义了。事实上,如果每个核都有向量寄存器,据我所知,最终会有不同的优化。不,我的意思是,就开发人员而言,一个芯片上的多个核与多个实际处理器是一样的,如果您真的对详细信息感兴趣,并且假设您谈论的是X86/64,那么您可以获得英特尔手册,但您提出的问题超出了您要做的范围,当您使用多线程和/或simd时,您不需要知道您使用的是内核还是单独的物理处理器,从程序员的角度来看也是一样的,通常你只需要知道1:有多少物理线程可以同时运行,2需要CPU限制,你不需要特别担心寄存器是如何设置的,现在如果你用一种更具体的方式告诉我们你想用什么语言做什么,什么样的应用程序类型等等,我可以提供更多的细节,但从全局来看,答案是cpu核心对于程序员来说与单独的处理器是一样的,只是物理上相同的芯片不同,即使在同一处理器上,线程也不共享寄存器,这是由操作系统处理的,它将它们/开关保存到另一个进程/开关,并将其还原。因此,作为程序员,使用这些寄存器,不必担心它们在哪里或是什么,因为这不是在您的级别上处理的,而是在操作系统级别上处理的,如果不是每个进程/开关都有自己的寄存器集,而是共享它们,这将是毫无意义的,这仍然是由OS,这将确保每一个线程,即使你有100个线程只有2个核心,有自己的登记价值,我使用的是C++ OpenMP,如果需要,我可以使用内联汇编。x86_64。Intel Xeon E5与Xeon Phic能否请您详细介绍一下“矢量功能单元”的内容?谢谢。我可以试试。我已经编辑了上面的答案。别忘了向上投票,并选择一个回答您问题的答案。英特尔超线程不是开启式的 实际上,它在非暂停线程之间交替进行前端循环。Xeon Phi在其大型核心芯片(如Skylake)上使用4路SMT而不是2路SMT的原因是为了更好地隐藏FP延迟,而无需大量无序的exec资源。-打开失速是粗粒度的。Intel的实际实现是细粒度的:在前端循环,竞争性地共享寄存器文件和调度程序,不同线程的指令能够并行地分配到执行单元。