如何在sparc处理器中共享多个线程共享寄存器窗口

时间:2017-06-15 21:36:41

标签: multithreading cpu-registers processor sparc

在英特尔处理器中,从松散的角度来说,通常是寄存器文件,TLB和一些激活状态管理都是线程感知的。

sparc处理器中的寄存器窗口实现是否可识别线程? sparc处理器如何同时执行多个线程?

3 个答案:

答案 0 :(得分:1)

每个sparc硬件线程(strand)都有自己的私有寄存器集。因此,核心中的所有线程可以同时执行,而不必担心共享寄存器。基本上,每个h / w线程都是一个完整的cpu,尽管在一个内核中共享一些处理,缓存和TLB资源。详细信息取决于每个处理器型号。

答案 1 :(得分:0)

这不是问题。线程是操作系统的概念;这样,操作系统将管理线程。 AFAIK SPARC不为线程提供任何特定的硬件支持。但是我认为WIM寄存器派上用场。无论如何,您都可以查看RTEMS的源代码,以了解真正的OS如何在SPARC上管理线程。

这些是我的猜测。如果已知我们有2个线程,而HW有8个寄存器窗口,则我们可以为每个线程预先分配4个窗口。现在,作为过程调用的结果,即保存指令,将在要使用另一个线程的寄存器窗口时需要通知OS。

WIM寄存器包含无效寄存器窗口的掩码。每当使用无效的寄存器窗口时,在执行保存指令时,都会引发异常。操作系统执行该操作后,可以将先前的寄存器窗口推送到内存,然后将其分配给线程。操作系统所需要做的就是在将处理器分配给线程之前设置WIM寄存器。

当操作系统更改正在运行的线程时,操作系统也可以将完整的寄存器文件保存到内存中。这将增加内存流量。最后,以Supervisor模式执行的OS可以访问任何寄存器窗口。

总而言之,我认为没有用于线程管理的特定硬件(现在不记得SRMMU是否具有任何可感知线程的内容……)。但是,有一些方法可以在SPARC之上实现线程模型。

答案 2 :(得分:0)

您似乎在问SMT(一个物理内核假装成/表现为多个完整内核)。在SPARC术语中,显然逻辑核心称为“链”。

“线程感知”不是通常的术语:问题是是否为每个链复制硬件资源,静态分区(每个线程占1/2或1/8)或动态/竞争地共享。 (例如,L1缓存通常可以争用,因此,一个线程执行大量内存密集型工作可能会通过逐出它们的行而导致同一内核上其他线程的更多缓存丢失)。

每个逻辑线程(也称为链)都有其自己的完整寄存器窗口集,或者至少软件可以这样看。但是,它是在内部实现的,硬件线程(子线)的作用就像一个完整的内核。

我认为,硬件在何时陷入内部空间不足以及是否需要将窗口溢出到内存方面有一定的酌处权,因此,一种无法完全复制所有寄存器文件的所有窗口的空间的实现方式,溢出的可能性可能会降低当在同一物理核心上运行的线程更少时。 (我对SPARC不太了解,我忘记了这些陷阱是否应该是确定性的。)

UltraSPARC T1TM Supplement to the UltraSPARC Architecture 2005中,图1-3 SPARC核心框图表明该旧CPU中的硬件确实复制了全部寄存器文件。

UltraSparc manual Figure 1-3

在具有乱序的exec +寄存器重命名一小部分架构寄存器(例如x86)的CPU上,单个逻辑核心的架构寄存器仅占总寄存器文件的一部分。

但是SPARC的注册窗口占用很多空间。不过,CPU只需要随机访问当前使用的寄存器,因此用于存储不可见窗口的SRAM阵列应该不会太糟。我猜物理硬件会将一个寄存器块复制到一个保存区域,而不是为所有窗口提供一个巨大的可索引寄存器文件。


如果您要询问一个逻辑核心上的上下文切换:

否,x86寄存器不支持线程。软件在上下文切换期间保存/恢复寄存器。没有人使用x86 TSS硬件任务切换,因为它很慢且不方便。 (How does a software-based context-switch with TSS work?)。

用新的页表基地址写x86 CR4控制寄存器会使该逻辑内核的TLB条目无效。 (或者使用process-context-ID标记TLB条目。)

@Juanrgar的答案指出,操作系统可能会在寄存器窗口中玩弄花样,以在逻辑内核的物理寄存器中包含2个软件线程的上下文。我不知道是否有任何操作系统可以这样做。如果必须决定切换到新线程时要使用哪一半的寄存器窗口,这会使上下文切换簿记更加复杂。