SSE 和超线程

Posted

技术标签:

【中文标题】SSE 和超线程【英文标题】:SSE and hyper threading 【发布时间】:2009-10-09 06:35:29 【问题描述】:

SSE 寄存器是否在逻辑处理器之间共享或复制(超线程)? 我能否期望 SSE 繁重程序的并行化速度与普通程序相同(英特尔声称超线程处理器可实现 30% 的速度)?

【问题讨论】:

【参考方案1】:

从英特尔的文档中我不清楚超线程处理器是在线程之间共享寄存器文件还是有两个不同的(我猜它们实际上是不同的,因为否则 HT 线程之间的上下文切换时间会相当长,但是这纯粹是猜测)。

至于加速 - 这将取决于您的指令组合和调度。请记住,HT CPU 没有任何额外的执行资源(ALU、加载/存储单元等),性能改进是由于更好地利用这些资源,因为典型的代码,特别是在现代处理器上,花费了合理的数量时间阻塞等待内存加载和存储完成,然后才能继续执行。 HT 允许这些加载和存储交错进行,以便一个线程在读取时停止,另一个线程可以切换并开始使用之前处于空闲状态的执行资源。

我猜你会看到多线程 SSE 程序的性能提升将取决于内存操作与算术操作的比率。例如,如果您的 SSE 程序从内存中加载 4 个 SSE 寄存器,对它们执行 10,000 次 SSE 操作,然后将 4 个寄存器写回,那么您不太可能看到 HT 能够重叠内存访问的优势,因为99% 的程序运行时间将用于 SIMD ALU,而不是内存访问。

另一方面,如果您的程序计算量很大,那么多线程程序可以大大提高多核处理器上的性能,并且可能会给您带来比 30% 更好的改进,因为在这种情况下,您的代码可以访问完整的一次执行多个内核的资源。

【讨论】:

【参考方案2】:

它们在逻辑上是重复的——每个线程都有自己的状态。在物理上,它们可能是共享的 - 取决于您的超线程实现。

【讨论】:

以上是关于SSE 和超线程的主要内容,如果未能解决你的问题,请参考以下文章

单核CPU多线程多核CPU和多个CPU

CPU篇---理清“核“概念-01

以编程方式检测物理内核的数量

为啥 asyncio 单线程 速度还能那么快

C# 多线程,ThreadStart()里面的方法带了参数就提示错误?

Redis单线程为何可以处理大量请求?