用于带有间接超长指令字处理部件至处理部件通信的有效同步mimd操作的方法和设备的制作方法

文档序号:6415885阅读:283来源:国知局
专利名称:用于带有间接超长指令字处理部件至处理部件通信的有效同步mimd操作的方法和设备的制作方法
技术领域
本发明要求1997年11月7日递交的标题为“有效同步MIMDVLIW通信的方法和系统”的临时申请序列号为60/064,619中的利益。
对于带有给定数量的并行处理部件的单指令多数据流(SIMD)机,存在着一些不能有效地使用可利用的并行处理部件,或者换言之,可利用的计算资源的算法。多指令多数据流(MIMD)类型机更有效地执行这些算法中的一些算法,但需要用于在每个处理器上支持独立的指令流的附加硬件,并且由于紧耦合程序实现下的通信等待时间在性能上有所损失。本发明提出一种更好的机器组织,用于在减少硬件成本及复杂性下和在保持SIMD机及MIMD机的最佳特征以及使通信等待时间最小下执行这些算法。本发明提供对SIMD间接超长指令字(iVLIW)处理部件的一个MIMD计算自主性层并同时保持SIMD机组织中使用的单个控制线程。相应地,采用术语“同步MIMD(SMIMD)”来描述本发明。
存在二种主要的并行程序设计模型SIMD模型和MIMD模型。在SIMD模型中,存在用于控制多个同步前后紧接(lock-step)方式下的处理部件(PE)的单程序线程。每个PE执行相同指令但在不同数据上。这是和MIMD模型不同的。在MIMD模型中存在多个控制程序线程,并且任何处理器内操作必须竞争当在多个处理器之间通信时由于需要在通信前使各个独立的程序线程同步而出现的等待时间。SIMD的问题在于不是所有的算法都能有效地使用处理器中存在的可使用的并行性。不同算法中固有的并行性大小的不同导致难以在SIMD机上有效地实现各种各样的算法。MIMD机的问题在于,多个处理器之间通信的等待时间导致难以有效地同步各处理器以在算法的处理上相协同。典型地,和SIMD机相比MIMD在实现上还导致更大的成本。因为每个MIMD PE必须具有其自己的指令排序机构,这可造成相当大的硬件数量。MIMD固有地还具有为管理多个独立的并行处理部件所要求的复杂得多的程序设计控制。从而,在采用并行处理部件时,在各种环境下会导致多种层次的程序设计复杂性和通信等待时间。从而,如后面详细说明那样有效地解决这些问题是很有好处的。
本发明最好和ManArrary体系结构一起使用。ManArray体系结构的各个方面在下述文献中分别详细说明1997年6月30日的递交的美国专利申请序列号08/885,310,1997年10月10日递交的美国专利申请序列号08/949,122,1998年10月9日递交的美国专利申请序列号09/169,225,1998年10月9日递交的美国专利申请序列号09/169,256,1998年10月9日递交的美国专利申请序列号09/169,672,1997年12月4日递交的标题为“动态修改极长指令字处理器的指令的方法和设备”的临时申请序列号60/067,511,1997年12月18日递交的标题为“用于可扩缩指令集体系结构的方法和设备”的临时申请序列号60/068,021,1998年1月12日递交的标题为“动态扩展超长指令字处理器的指令流水线的方法和设备”的临时申请序列号60/071,248,1998年1月28日递交的标题为“在带有子字执行的基于VLIM阵列处理器中支持条件执行的方法和设备”的临时申请序列号60/072,915,1998年3月12日递交的标题为“用于在VLIW处理器中提供寄存器的间接控制的寄存器文件牵引方法和设备”的临时申请序列号60/077,766,1998年7月9日递交的标题为“间接VLIW处理机中指令定址的方法和设备”的临时申请序列号60/092,130,1998年10月9日递交的标题为“ManArray上高效复数乘法及快速傅里叶变换(FFT)的实现”的临时申请序列号60/103,712,以及1998年11月3日递交的标题为“用于改进视频编码的传递估计的方法和设备”的临时申请序列号__,它们都转让给本发明受让人并整体上是本文的参考资料。
依据本发明的适用于和ManArray间接超长指令字(iVLIW)一起使用的ManArray处理机可实现成一个阵列处理机,其具有一个用于一个提供间接超长指令字体系结构的可扩缩处理部件(PE)阵列的、充当阵列控制器的顺序处理机(SP)。依据本发明的间接超长指令字(iVLIW)可通过该SIMD阵列控制器顺序处理机(SP)在一个iVLIW指令存储器(VIM)中构成。VIM最好存在于每个处理部件或PE中并包括多个iVLIW。当在VIM中构成某iVLIW后,另一条在优选实施例中被称为用于“执行iVLIW”的XV的SP指令在所有的PE中的相同VIM地址上并行地执行该iVLIW。若所有的PE VIM包含相同的指令组,则出现SIMD操作。在该XV指令和每个PE中存在的单个相同的iVLIW之间存在一对一的映射。
为了提高在ManArray上运行的某些算法的效率,有可能借助通过某执行VLIW(XV)指令启动的间接执行和借助多个PE中相同VLIW存储器地址处存储的不同VLIW指令来间接操作VLIW存储器中存储的各VLIW指令。当SP指令使得在所有PE上并行地执行该组iVLIW时,出现同步MIMD或SMIMD操作。在该XV指令和各个PE中存在的多个不同iVLIW之间存在一对多的映射。不再需要专用的同步机制,因为通过发出XV指令由单个控制点SP同步地激励多个不同的iVLIW。由于采用“Receive Model(接收模型)”来管理PE和ManArray网络之间的通信,如后面进一步说明的那样避免了MIMD操作共有的通信等待时间特性。另外,由于执行只存在一个同步轨迹,不需要在每个PE中使用用于独立程序流的附加MIMD硬件。以这种方式,在减少硬件成本并使通信等待时间为最小下把该计算机组织成支持SMIMD操作。
最好在程序控制下装入ManArray间接VLIW或iVLIW,尽管并不排除iVLIW的直接存储器存取(DMA)装入并且借助包含着固定iVLIW的ROM实现VIM地址空间段的替代办法。为了保持某种程度的动态程序灵活性,一部分VIM(若不是全部VIM)可以典型地为随机存取型存储器。为了装载该随机存取类型的VIM,一个定界符指令,即用于装入iVLIW的LV,规定把该定界符后面的一定数量的指令装入到VIM中而不是被执行。对于SIMD操作,每个PE为每个VIM地址得到相同的指令。为了建立SMIMD操作必须在各个PE中的相同VIM地址上装入不同的指令。
在本优选实施例中,这是通过屏蔽机制达到的,该屏蔽机制只对屏蔽成ON的PE装入VIM。用OFF屏蔽的PE不执行该定界符指令,从而不把该定界符后面的规定指令组装入VIM。替代地,可以平行地把不同的指令组从PE本地存储器装入,或者,VIM可以是DMA传送的目标。向相同的VIM地址装入不同指令的另一种替代办法是通过使用第二LV指令即LV2,该指令在LV指令后面跟着第二32位的控制字。第一和第二控制字重新排列它们之间的位组从而可添加PE标号。这种第二LV2方法不需要屏蔽PE,从而可能在不同的系统实现上提供某些优点。通过选择性地把不同指令装入到不同PE上的相同VIM地址中,ManArray被建立以用于SMIMD操作。
在实现SMIMD操作时遇到的一个问题是在对待处理部件间的通信上。在SIMD方式下,阵列中的所有PE执行相同的指令。典型地,这些SIMD处理部件至处理部件通信指令被认为是采用Send Model(发送模型)的。也就是说,SIMD Send Model通信指令指明每个PE应向哪个方向或对哪个目标PE发送它的数据。当遇到例如SEND WEST的通信指令时,每个PE向拓扑上定义成是它的西方邻居的PE发送数据。Send Model既规定发送方PE也规定接收方PE。在该SEND WEST例子中,每个PE向其West PE发送数据并从其East PE接收数据。在SIMD方式中,这不是问题。
在SMIMD操作方式下,采用Send Model可能使多个处理部件都试图向同一个邻居发送数据。这样的试图代表危险情况,因为诸如ManArray中的处理部件可能定义成只具有一个接收端口,一次只能从另一个处理部件接收。当每个处理部件定义成具有一个接收端口时,不能成功地完成这样尝试的操作,并造成通信危险。
为了避免上述的通信危险,对PE间的通信采用Receive Model(接收模型)。利用Receive Model,每个处理部件控制一个选择要从哪个处理部件接收的变换器。由于不可能使任意二个处理部件去竞争相同的接收端口,不可能出现通信危险。按照定义,每个PE控制它自己的接收端口并在不具有目标PE规定下使数据是可使用的。为了在采用Receive Model的处理部件之间出现有意义的通信,必须把PE编程成在接收可使用的数据上是协同的。利用同步MIMD(SMIMD),若协同指令都存在于相同的iVLIW单元上可保证出现有意义的通信。若不带有SMIMD,需要一种复杂的机制使通信同步并采用ReceiveModel。
从下述详细说明和附图可清楚地得到本发明的更完整理解和清楚本发明的特点和优点。


图1示出依据本发明的ManArray间接VLIW指令存储器的各个方面;图2示出基本iVLIW数据通路;图3示出带有ALU槽的扩展图的五槽iVLIW;图4A表示LV装入/修改VLIW指令;图4B表示XV执行VLIW指令;图4C表示指令字段定义;图4D仍表示指令字段定义;图4E表示ADD指令;图4F示出用于2×2ManArray配置中的三个同步MIMDiVLIW的槽存储;图5示出依据本发明的iVLIW装入和取出流水线;图6示出SIMDiVLIW数组处理的各个方面;图7示出iVLIW转换扩充;图8A示出iVLIW转换扩充的装入和取出流水线;图8B示出VIMiVLIW存储的一种替代格式;图9示出发送模型群集切换控制以及一个采用发送模型的SHIMD通信的示例性危险;图10示出带有集中式群集切换控制的发送模型;以及图11示出用于避免SMIMD操作方式下通信危险的接收模型群集切换控制。
下面详细说明一组和本发明一同使用的当前优选的间接超长指令字(iVLIW)控制指令。图1描述一个系统,用于在一个2×2的PE 104,PE0-PE3,的ManArray中在地址“i”处执行iVLIW,其中iVLIW由每个VIM中的垂直的框组SLAMD 105表示,每个VIM表示一组指令S=存储、L=装入、A=算术逻辑单元(ALU)、M=乘法累积单元(MAU)以及D=数据选择单元。在图1中,该2×2ManArray 100还包括一个在单条32位总线上向该阵列的PE调度32位的指令的顺序处理机(SP)控制器102。一种类型的32位指令是一条执行iVLIW(XV)指令,其包括一个VIM地址偏移值以和VIM基地址一起生成指向需要执行的iVLIW的指针。PE 104通过群集交换器107互连。
ManArray体系结构中依据本发明适用的SP 102以及每个PE104包含一个iVLIW存储器(VIM)106的量,如图1中所示。每个VIM 106包括用于保持多个VLIW指令地址103的存储空间,并且每个地址能够存储多至八个的单工指令。当前的优选实施例允许每条iVLIW指令最多包含五条单工指令每条指令各和存储单元108、装入单元110、算术逻辑单元112(ALU)、乘法累积单元114(MAU)和数据选择单元116(DSU)中的每一个相关。例如,在VIM地址“i”105处的一条iVLIW指令包含五条SLAMD。
图2表示基本iVLIW数据通路配置200,通过该通路某取出的指令存储到与VIM装入和存储控制功能22连接的指令寄存器20中。该VIM装入和存储控制功能提供至VIM 24的接口信号。在图1的每个VIM 106具有相关的如图2中所示的寄存器和控制功能下,VIM 24对应于VIM 106。VIM 24的输出流水线式传递到iVLIW寄存器26。图3示出带有N个入口,0、1…N-1,的五槽iVLIW VIM 300。每个VIM 300定址单元包括用于存储、装入、ALU、MAU和DSU指令301-305的存储空间。扩充ALU槽图303′示出位31“d”被增亮的一条32位的存储空间。后面会更详细地讨论VIM存储中这些指令位的使用。
可以集合地把iVLIW指令装入到PE VIM阵列中,或者,通过使用屏蔽一个或多个PE的专用指令独立地装入每个PE VIM。通过执行VLIW(XV)指令可存取VIM中的供执行的iVLIW,当按单条指令执行XV指令时它造成同时执行位于该VIM存储器地址处的各单工指令。XV指令可造成下列指令的同时执行1.位于各个SP或PE的VIM地址中的所有单工指令,或者2.位于所有PE中相同的相对VIM地址上的所有指令,或者3.位于所有PE的子集或分组中相同的相对VIM地址上的所有指令。
只需要二种控制指令来装入/修改iVLIW存储器并执行iVLIW指令。它们是1.图4A中示出的装入/修改VLIW存储器地址(LV),以及2.图4B中示出的执行VLIW(XV)。
图4A中示出的LV指令400如编码框410如示用于32位编码,并且具有语法/操作框420示出的并在后面进一步说明的目前优选的语法/操作。LV指令400用于装入和/或禁止规定的SP或者PE VLIW存储器(VIM)的各个指令槽。VIM地址是按基VIM地址寄存器Vb(V0或V1)加上无符号8位偏移VIMOFFS计算的,其中VIMOFFS在图4A的编码框410里的位组框411的位0-7中示出。VIM地址必须在硬件配置的有效范围内,否则该指令的操作是无定义的。
通过禁止槽参数′d={SLAMD}′可以禁止各个指令槽的任何组合,其中S=存储单元(SU)、L=装入单元(LU)、A=算术逻辑单元(ALU)、M=乘法累积单元(MAU)和D=数据选择单元(DSU)。空′d=′参数不禁止任何槽。在装入任何指令前禁止各规定的槽。
利用Instr Cnt参数规定要装入的指令的数量。对于当前的实施,有效值为0-5。LV之后的一批Instr Cnt指令被装入到该规定的VIM中。单元影响标志(UAF)参数′F=[AMD]′选择哪一个算术指令槽(A=ALU,M=MAU,D=DSU)在执行时被允许可为规定的VIM设定条件标志。空′F=′选择ALU指令槽。在处理LV指令期间算术标志不被影响,并且周期数等于装入的指令数加1。
图4B中示出的XV指令425如编码框430所示也用于32位编码,并且具有语法/操作框435示出的并在后面进一步说明的目前优选的语法/操作。XV指令425用于执行规定的SP或PE VLIW存储器(VIM)的各个指令槽。VIM地址是按基VIM地址寄存器Vb(V0或V1)加上无符号8位偏移VIOMOFFS计算的,其中VIMOFFS在图4B的编码框430的位组框431的位0-7中示出。VIM地址必须在硬件配置的有效范围内,否则该指令的操作是无定义的。
通过执行槽参数′E={SLAMD}′可以执行各个指令槽的任何组合,其中S=存储单元(SU)、L=装入单元(LU)、A=算术逻辑单元(ALU)、M=乘法累积单元(MAU)和D=数据选择单元(DSU)。空′E=′参数不执行任何槽。单元影响标志(UAF)参数′F=[AMDN]′改写已通过LV指令装入的VLIW规定的UAF。该改写选择哪一个算术指令槽(A=ALU,M=MAU,D=DSU)可为执行该VLIW设定条件标志或者都不能设定条件标志(N=无)。该改写不影响由LV指令规定的UAF设定。空′F=′选择该VLIW装入时所规定的UAF。
条件标志是由通过来自原始LV指令的′F=′参数的设定所规定的槽中各单工指令设定的,或者是通过XV指令中的′F=[AMD]′参数的改写设定的。当在一个周期中出现′F=N′操作时条件标志不受到影响。根据每个要执行槽中的各个单工指令必须考虑流水线问题。这些iVLIW指令中的各个字段的说明在图4C和4D中示出。图4C和4D示出通过名字442、位数444和描述值446列表的指令字段定义440。图4E和4F分别示出目前优选的ADD指令和用于2×2ManArray配置中的三个同步MIMDiVLIW的槽存储。
图4E中示出的ADD指令450如编码框455中所示也用于32位编码,并且具有语法/操作框460示出的并在后面进一步说明的目前优选的语法/操作。ADD指令450用于把源寄存器Rx和Ry的和存储到目标寄存器Rt中。算术标量标志在最小有效操作上改变,其中N=结果和的MSB,若结果为0则Z=1反之为0,若出现溢出则V=1反之为0,若出现进位则C=1反之为0。对于带符号的操作,v位是有意义的,对于无符号的操作C位是有意义的。周期数为1。
单个操作、成组操作以及“同步MIMD”PEiVLIW操作LV指令和XV指令可以在程序员所定义的各个PE中或者PE分组中用来装入、修改、禁止或执行iVLIW指令。为了达到这一点,各个PE是通过一条修改每个PE内的控制寄存器的指令使能或禁止的,该指令除别的作用外使能或禁止每个PE。为了装入和操作单个PE或者一组PE,修改各控制寄存器,以便使能一个(或一些)PE并禁止所有其它PE。仅当使能一些PE后才接着操作常规iVLIW。
参照图5,连同iVLIW系统500说明iVLIW装入和取出流水线的各个方面。除其它方面外,图5示出一种选择机制,用于允许从VIM存储器选择指令。取出的指令被装入到第一指令寄存器(IR1)510中。寄存器510广义地对应于图2的指令寄存器20。在装入第二指令寄存器(IR2)514之前,在流水线周期的早期IR1的输出在译码器或预编码功能512中预译码。当IR1中的指令是一个带有非零指令计数的装入iVLIW指令(LV)时,预译码器512生成一个LVc1控制信号515,该控制信号用于建立LV操作周期,而VIM地址511是通过加法器504把规定的Vb寄存器502和来自通路503的该LV指令中所包含的偏移值相加计算出的。结果VIM地址511存储在寄存器506中并通过多路复用器508以定址VIM 516。VIM 516一般对应于图1的VIM 106。要求寄存器506在LV操作期间保持VIM地址507。VIM地址511和LV控制状态允许把在该LV指令后面接收的指令装入到VIM 516中。在接收该LV的那个周期的终点,把图4A中示出的禁止位组10-17装入到d位组寄存器518,供向VIM 516装入指令组时使用。一旦在IR1 510中接收到要装入到VIM 516中的下一条指令,根据指令类型,即Storec1 519、Loadc1 521、ALUc1 523、MAUc1 525或DSUc1 527生成适当的控制信号。预译码功能512最好设置成基于对图4A、4B和4E示出的定义指令类型的分组位组(位30和31)和图4D和4E示出的单元字段位组(规定执行单元类型的位27和28)的简单译码。通过采用该预译码步骤,可以把IR1 510中指令装入到VIM 516中的适当功能单元位置。例如,对于指令LV表中包括的图4E的ADD指令,当把该指令接收到IR1 510中时可以通过预译码功能512判定应把该指令装入到VIM 516中的ALU指令槽520。此外,用于该功能槽部位的适当d位被装入到该槽的位31中。该装入的d位占据来自原始指令的分组代码位位置上的一个位置。
一旦接收IR1 510中的XV指令,通过利用加法器504使规定的Vb寄存器502和来自通路503的XV指令中包含的偏移值相加而计算出VIM地址511。结果VIM地址507通过多路复用器508以定址VIM。从VIM 516中读出该规定地址上的iVLIW并通过多路复用器530、532、534、536和538送到IR2寄存器514。作为一种使读VIM访问计时关键路径最小的替代方法,可以把VIM 516的输出锁存到一个其输出通过译码状态逻辑电路前面的某多路复用器的寄存器中。
为了执行XV指令,IR2 MUX1控制信号533和预译码XVc1控制信号517一起使所有的IR2多路复用器530、532、534、536和538选择VIM输出通路541、543、545、547和549。此刻,同步完成流水线540、542、544、546和548的五个分开的译码及执行阶段,以提供iVLIW平行执行性能。为了允许在PE或SP中由自身执行单个32位的指令,示出了旁路VIM通路535。例如,当在IR1 510中接收到单工ADD指令供平行阵列执行时,预译码功能512生成IR2MUX1 533控制信号,该控制信号533在一个ADD和没有XV 517或没有LV 515活动控制信号的情况下同指令类型预译码信号523一起使ALU多路复用器534选择旁路通路535。
由于ManArray可用可变数量的PE配置,图6示出诸如图5中示出的系统500那样的iVLIW系统的示范性SIMD iVLIW使用。在图6中,存在J+1个用PE0至PEJ编号的PE。在图6中示出一部分LV代码,其表示三条指令要装入到VIM地址27处并且禁止装入单元槽和MAU指令槽。该装入操作是根据图4A中示出的语法从LV指令601确定的。假定所有PE屏蔽成接通,则所指明的三条指令603、605和607会装入到该阵列的J+1个PE中的每个PE的VIM地址27处。在图6中通过示出这些指令被存储在VIM中的适当执行槽来表示该装入的结果,即指令603在ALU槽中,指令605在DSU槽中,以及指令607在存储单元槽中。
请注意,在前面由图3、5、6复盖的讨论中,预译码功能允许用图5中所示的从启动VIM装入序列的LV指令生成的已存储的d位组518写VIM槽字段的多个位31位置。还请注意,例如图4E的算术指令中单元字段,即位27和位28,对于确定某算术指令要装入到哪个VIM槽是必要的。从而,由于可以利用预译码功能把IR1中的指令和VIM中的执行单元槽具体地关联起来,不需要在VIM中存储分组位组和单元字段位组并且它们可用于其它目的,如前面讨论中示范那样使用单个d位。在图7中的VIM 700里示出各VIM槽中专用位的位置,其中图4E的指令分组位组中的一个位即位30以及指令单元字段位组位27和位28在VIM 700中由以下转换扩充选择位组替代,其中“0”为图7中标号为721的操作码扩充位30,“r”为标号为723的寄存器文件扩充位28,而“c”为标号为725的条件执行扩充位27。这些附加的位分别存储在图8A中示出的杂项寄存器850中,程序员可对该寄存器装入或存储。这些位提供扩充能力,在32位指令格式下由于指令编码位的不足不能提供这样的能力。对于操作码扩充位“0”;有可能把一组指令映射到新的一组指令。对于寄存器扩充位“r”;有可能使寄存器文件空间翻一番并且具有二排寄存器,这二排寄存器或者提供附加的寄存器空间或者充当一种快速环境切换机制以允许在二种环境中划分这二排寄存器。对于条件执行扩充位“c”,有可能规定二组不同的条件或者在程序员控制下规定不同的条件执行功能性。
图8A描述示出iVLIW转换扩充装入和取出流水线的各个方面的iVLIW系统800,以表示添加0位、r位和c位寄存器850以及预译码控制信号815、817、819、821、823、825、827和833的设立。请注意这些自由位的其它使用也是可能的。例如,这三个位都可以用于寄存器文件扩充,以提供对三条操作数指令的单独控制或提供八排32×32寄存器。
为了允许在iVLIW PE或iVLIW SP中由自身执行单个32位的指令,在图8A中示出旁路VIM通路835。例如,当在IR1 810中接收到单工ADD指令供平行阵列执行时,预译码功能812生成IR2MUX2 833控制信号,该控制信号833连同ADD及没有XV 817或LV 815活动控制信号情况下的指令类型预译码信号823使ALU多路复用器834选择旁路通路835。由于如本文中所说明的那样,在流水线的全阶段中可出现旁路操作,有可能在被旁路的指令进入IR2锁存阶段时替换被旁路的指令中的分组位组和单元字段位组。在图8A中这是通过利用“0、r和c”位信号通路851在多路复用器830、832、834、836和838的输入端处替换适当的位位置来示出的。
请注意,用于VIM iVLIW存储的替代格式是可能的,并且可能最好取决于技术及设计考虑。例如,图8B描述对图7和8A中的示出的形式的一种选代形式VIM 800′。每个执行槽的d位组和附加的位组“0,r,c和uaf”编组在一起。对于每个槽这十个位从在位0-26和29中定义的执行单元功能位独立编组。需要在单个iVLIW VIM地址处存储来自LV指令的图4A的单元影响字段(uaf)位组22和23,因为“uaf”位组和执行时哪一个算术单元影响标志有关。别的存储格式是可能的,例如,把d位组和功能位组一起存储,并单独地存储和整个iVLIW相关的位组例如“uaf”位组。还请注意对于一个k槽iVLIW,不是必须要把k×32位存储在VIM中。由于预译码功能,不仅可把附加的位组存储在设想成用来存储k个32位指令的该k×32位空间中,而且若不需要全部使用这些位还可减小k×32位空间。这在图8B中示出,其中每个VIM地址的存储位总数是这样给出的,5乘以每个执行单元槽位置所需的28位(0-26及29)加上5个d位、3个“0,r和c”位和2个“uaf”位,从而每个iVLIW地址总共150位,这比设想所需要的5×32=160位小10位。这既提高功能性又减少VIM存储器空间。通常,可以为每个执行单元单独地把附加的信息存储在VIM中,或者把影响该iVLIW上的控制的各个位单独地存储在该VIM地址上。例如,可把十六个附加装入立即位存储到一个单独的“常数”寄存器中并装入到某VIM地址中以把装入单元的能力扩充成装入32位的立即数据。为了实现这种扩充,必须适当地扩展VIM数据宽度。而且各被存储的iVLIW的长度和指令长度的倍数不相干,从而可根据需要使已存储的iVLIW大于或小于用于k个指令iVLIW的k×32位。
在包括一个如图1的SP控制器102(为简明,在图9或图10中未示出)和一个PE阵列的处理机中,例如图9的处理机900或图10的处理机1000,在处理PE间通信下实现SMIMD操作可能会遇到问题。典型的SIMD通信方式规定所有的PE执行相同的PE间通信指令。这种在每个PE中相同的SIMD PE间指令要求一种公用的控制机制,以便确保在PE之间定义的公用操作的一致性。典型地,在向阵列中的所有PE调度单个指令如SEND_WEST的情况下采用发送模型。SIMD PE间通信指令产生PE间的网络接口的协同控制以允许每个PE向由该PE间指令拓扑定义的PE发送数据。由于所有PE接收相同的指令,如图9中所示可以解释该单个SIMD指令并且可由单个PE控制网络接口911。请注意,图9中示出的ManArray 2×2群集切换是由四个4对1的多路复用器920、922、924和926构成的,以用于DSU之间的接口输入/输出(I/O)总线。这些总线可以是8位、9位、16位、32位、64位或别的位数不受限制的总线。对单个4对1多路复用器的控制是需要二个用于从四条可能的路径选出一条路径的控制位。当需要时借助更多的多路复用器可扩充成用于更大的群集。在SIMD系统中也有可能如图10中所示对PE之间的接口网络采用集中式控制。在图10中,集中控制器1010和网络中的其它PE一样从SP控制器接收相同的调度过的PE间通信指令1011。这种机制允许在逐个周期的基础上改变网络连接。SIMD发送模型的二种属性是对所有PE的公用指令以及规定发送方和接收方二方。在该SIMD方式下,这种方法不是问题。
在试图把发送模型扩充到SMIMD方式中时,可能出现其它问题。问题之一是在SMIMD方式下有可能多个处理部件都试图向单个PE发送数据。这是因为每个PE可接收不同的PE间通信指令。SIMD发送模型的这二个属性,即具有公用的PE间指令以及规定源和目标二者或发送方和接收方二者,立即失灵。在单周期通信中使多于一个PE在SIMD模型下以相同的PE为目标是一种通信危险。在图9中示出该通信危险,其中用于PE 1、2、3的各DSU要向PE0发送数据同时PE0要向PE3发送数据。对PE0的三个数据输入是不能接收的。在别的系统中对这种类型问题的解决办法大多是引入接口缓冲器和优先级控制逻辑以便延迟冲突通路中的一条或多条。由于单周期通信操作的调度必须在对要在各PE中执行的iVLIW指令的程序设计期间完成,这破坏了SMIMD处理固有的同步性质。为了在不违反同步MIMD要求下避免这样的通信危险,采用接收模型是有好处的。发送模型所带来方便的位于单个PE处或位于集中式控制机制处的单个网络控制点在接收模型中用分布式网络接口控制替代。每个PE控制它拥有的接收端口。接收模型通过网络接口规定接收通路。在ManArray网络的情况下,每个PE控制它拥有群集交换的多路复用器输入通路。
在图11中示出这种用于2×2阵列处理机1100的配置,其中每个PE分别具有对其输入多路复用器(1120、1122、1124或1126)拥有的控制。例如,PE0具有用于控制它的输入多路复用器1120的控制信号1111。接收模型还要求使可在不带有目标PE规定下能在PE输出端口上得到送至接口网络的数据。从而,为了在处理部件之间出现采用接收模型的有意义的通信,各PE必须编程成在接收可得到的数据上是协同的。采用同步MIMD下,若在相同的iVLIW单元存在协同指令可保证出现这样的协同。借助指令的这种定位,在执行XV指令时,各协同的PE执行适当的PE间通信指令以产生任何二个或更多的PE之间的数据传递。通常,在PE阵列中可存在多个PE分组。在每个这样的分组中一个或多个PE可从另一个PE接收数据,而在另一个分组中一个或多个PE可以从一个不同的PE接收数据。分组的大小可以从二个PE到整个PE阵列不等。尽管在图11中出于简化图示的目的没有示出SP例如图1的SP控制器102,虽然可以意识到如前面引用的美国临时申请序列号60/077,457中说明的那样把SP功能融入到某PE例如PE0中,或者可把SP功能添加到所有PE上,尽管该功能这样的增加是相对费钱的,但最好包括这一控制器。
图4F示出在2×2ManArray配置中三条同步MIMDiVLIW的定义470。上部480给出操作描述。下部490给出相应的分别装入到LU、MAU、ALU、DSU和SU里的指令助记码。每条iVLIW包括在粗的黑线之间的四行,一个PE一行。图的最左列示出在PE iVLIW指令存储器(VIM)中装入该iVLIW的地址。下一列示出PE号。每条iVLIW包含用于每个PE的一行,表示装入到该PE的VIM入口中的各指令。其余的列列出用于五个执行单元装入单元(LU)、乘法累积单元(MAU)、算术逻辑单元(ALU)、数据选择单元(DSU)和存储单元(SU)中之每个的指令。
例如,PE2 495中的VIM入口号29装入四条指令li.p.w R3,A1+,A7;fmpy.pm.1 fw R5,R2,R31;fadd.pa.1 fw R9,R7,R5以及pexchg.pd.w R8,R0,2×2_PE3。这些指令是在图4F的倒数第二行中找到的指令。该同一VIM入口(29)包含着PE0、PE1和PE3中的不同指令,如可从VIM入口29上与这些PE对应的行PE0 491、PE2493和PE3 497中可看到的那样。
下面示例1-1示出装入到如图4F中所定义的PEVIM存储器的指令序列。请注意,为了在相同地址上把不同的指令组装入到不同的PEVIM中,使用了PE屏蔽。例1-1把多个同步MIMDiVLIW装入到多个VIM中<pre listing-type="program-listing"><![CDATA[!首先装入PE1、2、3、共用的指令lim.s.h0 SCR1,1!为装入1、2、3而屏蔽掉PE0lim.s.h0 VAR.0 !向VIM基地址寄存器V0装入零lv.pv0,27,2,d=,f= !用下二个指令装入VIM入口V0!+27(=27);不禁止任何指令,!对ALU置缺省标志li.p.w R1,A1+,A7 !装入指令进入LUfmpy.pm.1fw R6,R3,R31 !乘指令进入MAUlv.p v0,28,2,d=,f=!用下二个指令装入VIM入口V0+28!(=28);不禁止任何指令;!对ALU置缺省标志li.p.w R2,A1+,A7 !装入指令进入LUfmpy.pm.1fw R4,R1,R31 !乘指令进入MAUlv.p v0,29,2,d=,f=!用下二个指令装入入口V0+29!(=29);不禁止任何指令;!对ALU置缺省标志li.p.w R3,A1+,A7 !装入指信进入LUfmpy.pm.1fwR5,R2,31 !装入指令进入MAU!现装入PE0独有的指令lim.s.h0 SCR1,14 !为装入PE0而屏蔽掉PE1、2、3nop !一个周期延迟以设立屏蔽lv.p v0,27,1,d=lmad,f=!用下个指令装入VIM入口V0!+27(=27);禁止LU、MAU、!ALU、DSU槽中的指令;!对ALU置缺省标志si.p,w R1,A2+,R28!存储指令进入SUlv.p v0,28,1,d=lmad,f=!用下个指令装入VIM入口V0!+28(=28);禁止LU、MAU、!ALU、DSU槽中的指令; !对ALU置缺省标志si.p.w R1,A2+,R28!存储指令进入SUlv.p v0,29,1,d=lmad,f= !用下个指令装入VIM入口V0 !+29(=29);禁止LU、MAU、 !ALU、DSU槽中的指令; !对ALU置缺省标志si.p.w R1,A2+,R28!存储指令进入SU!现装入PE1独有的指令lim.s.h0 SCR1,13 !为装入PE1而屏蔽掉PE0、2、3nop!一个周期延迟以设定屏蔽lv.p v0,27,3,d=s,f= !用下三个指令装入VIM入口 !v0+27(=27);禁止SU槽中 !对ALU置缺省标志fadd.pa.1fw R10,R9 R8 !加法指令进入ALUpexchg.pd,wR7,R0,2×2_PE3 !PE公用指令进入DSU si.p.w R10,+A2,A6!存储指令进入SUlv.p v0,28,2,d=,f= !用下二个指令装入VIM入口 !v0+28(=28);不禁止任何指令; !的指令;对ALU置缺省标志fadd.pa.1fw R9,R7 R4 !加法指令进入ALUpexchg.pd.wR8,R5,2×2_PE2!PE公用指令进入DSUlv.p v0,29,3,d=,f= !用下三个指令装入VIM入口 !v0+29(=29);不禁止任何指令;!对ALU置缺省标志fcmpLE.pa.1fw R10,R0!比较指令进入ALUpexchg.pd.wR15,R6,2×2_PE1 !PE公用指令进入DSUt.sii.p.w R0,A2+,0 !存储指令进入SU!现装入PE2独有的指令lim.s.h0 SCR1,11!为装入PE2而屏蔽掉PE0、1、3nop !一个周期延迟以设定屏蔽lv.p v0 27,3,d=,f= !用下三条指令装入VIM入口 !v0+27(=27);不禁止任何指令; !对ALU置缺省标志fcmpLE.pa.1fw R10,R0!加法指令进入ALUpexchg.pd.wR15,R6,2×2_PE2 ! PE公用指令进入DSUt.sii.p.w R0,A2+,0 !存储指令进入SUlv.p v0,28,3,d=,f= !用下三条指令装入VIM入口 !v0+28(=28);不禁止指令; !对ALU置缺省标志fadd.pa.1fw R10,R9,R8 !比较指令进入ALUpexchg.pd.wR7,R4,2×2_PE1 !PE公用指令进入DSUsi.p.w R10,+A2,A6 !存储指令进入SUlv.p v0,29,2,d=s,f=!用下二条指令装入VIM入口 !v0+29(=29);禁止SU槽中的指令; !对ALU置缺省标志fadd.pa.1fw R9,R7,R5 !加法指令进入ALUpexchg.pd.wR8,R0,2×2_PE3 !PE公用指令进入DSU!现装入PE3独有的指令lim.s.h0 SCR1,7!为装入PE3而屏蔽掉PE0,1,2nop !一个周期延迟以设定屏蔽lv.p v0,27,2,d=s,f= !用下二条指令装入VIM入口!v0+27(=27);禁止SU槽!中的指令;对ALU置缺省标志fadd.pa.1fw R9,R7,R6 !加法指令进入ALUpexchg.pd.wR8,R4,2×2_PE2 ! PE公用指令进入DSUlv.p v0,28,3,d=d,f= !用下二条指令装入VIM入口!v0+28(=28);禁止DSU槽!中的指令;对ALU置缺省标志fcmpLE.pa.1fw R10,R0 !比较指令进入ALUt.sii,p.w R0,A2+,0 !存储指令进入SUlv.p v0,29,3,d=,f=!用下三条指令装入VIM入口!v0+29(=29);不禁止任何指令;!对ALU置缺省标志fadd.pa.1fwR10,R9,R8 !加法指令进入ALUpexchg.pd.wR7,R5,2×2_PE1 ! PE公用指令进入DSUsi.p.w R10,+A2,A6 !存储指令进入SUlim.s.h0 SCR1,0!PE屏蔽复位从而所有PE都接通nop !一个周期延迟以设立屏蔽]]></pre>下面的例子1-2表示执行通过图4F中的例子1-1代码装入的各 PEVIM入口的指令顺序。请注意不需要PE屏蔽。在每个PE,PE0、PE1、PE2和PE3中执行规定的VIM入口。表1-2执行来自PEVIM的同步MIMDiVLIM<pre listing-type="program-listing"><![CDATA[!这里设立地址寄存器、循环等…!启动VLIW执行!f=参数表示对LV标志设定的缺省xv.p v0,27,e=l,f= !仅由LU执行VIM入口v0+27xv.p v0,28,e=lm,f=!仅由LU、MAU执行VIM入口v0+28xv.p v0,29,e=lm,f=!仅由LU、MAU执行VIM入口v0+29xv.p v0,27,e=lmd,f= !仅由LU、MAU、DSU执行VIM入口v0+27xv.p v0,28,e=lamd,f= !SU外的所有部件执行VIM入口v0+28xv.p v0,29,e=lamd,f= !SU外的所有部件执行VIM入口v0+29 xv.p v0,27,e=lamd,f= !SU外的所有部件执行VIM入口v0+27xv.p v0,28,e=lamd,f= !SU外的所有部件执行VIM入口v0+28xv.p v0,29,e=lamd,f= !SU外的所有部件执行VIM入口v0+29!循环体-前面已建立允许循环的机制loop_beginxv.p v0,27,e=slamd,f=!所有部件执行v0+27 xv.p v0,28,e=slamd,f= !所有部件执行v0+28loop-endxv.p v0,29,e=slamd,f= !所有部件执行v0+29]]></pre>对所执行的示例算法的说明图4F中定义的iVLIW组用于进行常数3×1向量和PE本地数据存储器中存储的3×1向量变量流的点积。每个PE存储着向量的一个分量。PE1存储x分量,PE2存储y分量而PE3存储z分量。PE0不存储分量。该常向量以不变的方式保持在一个PE寄存器中,在本情况下为计算寄存器R31。
为了避免冗余计算或者空闲的PE,iVLIW同时在三个变量向量上操作。由于向量分量在各PE上的散布,利用PE0计算第四个向量点积是不适宜的。把PE0用于替代处理将来算法阶段的某种建立是有好处的。这可以从各iVLIW装入槽中看出,即向量1装入iVLIW27(如上面所说明,跨越PE上的分量方式)、向量2装入iVLIW28和向量3装入Ivliw29(li.p,wR*,A1+,A7)。PE1为这三个向量的每个向量计算点积的x分量。PE2计算y分量,而PE3计算子分量(fmpy.pm.1fwR*,R*,R31)。此刻,为了对PE1得到向量1点积的y和z分量,对PE2得到向量2点积的x和z向量,对PE3得到向量3点积的x和y分量,必须在PE之间进行通信。在DSU中通过pexchg指令进行通信。以这种方式,每个PE同时将(fadd.pa,1fw R9,R7 R*和fadd.pa,1fw R10,R9,R8)唯一点积结果的各分量求和。接着把这些结果存储到(si.p.w R10,+A2,A6)RE存储器中。请注意每个PE将每隔三个结果计算和存储结果。然后以循环方式从PE1、2、3访问最后的结果集。
此外,每个PE执行其点积结果和零(在PE寄存器R0中保持)的比较(fcmpLE.pa,1fw R10,R0),并且在点积为负的条件下把计算出的点积替代地用零存储(t.sii.p.w Ro,A2+,0)。换言之,判定R10小于R0?的比较是否真。这种去掉负值的点积实现例如用于三维图形应用的亮度计算。
尽管在实现本发明的当前的优选方法和设备的环境下公开了本发明,对于一般的技术人员各种替代实现或改变是显而易见的。例如,本发明并不排除在VIM中装入指令而且执行该指令的能力。这种能力已被认为除指令格式和硬件复杂性之外不必要地使本发明的程序设计模型复杂。从而,选用了装入iVLIW定界符方法。
权利要求
1.一种间接超长指令字(VLIW)处理系统包括具有VLIW指令存储器(VIM)的第一处理部分(PE),用于把指令存储到一个VIM存储器单元内的槽组中;第一寄存器,用于存储具有多个定义指令类型的分组位的和多个定义执行单元类型的单元位的功能指令;一个预编码器,用于译码该多个分组位和该多个单元字段位;以及一种装入机制,用于根据所述译码把功能指令装入到VIM中的一个适当所述槽中。
2.权利要求1的系统还包括一种控制指令,其包含用于间接执行VLIW用途的地址偏移和指向基地址寄存器的基指针的执行VLIW指令(XV)。
3.权利要求1的系统还包括一种控制指令,其是包含用于间接执行VLIW用途的地址偏移和指向基地址寄存器的基指针的装入/修改VLIW指令(LV)。
4.权利要求1的系统,其中在把功能指令存入VIM之前从该功能指令剥离分组位组和单元字段位组以产生更紧凑的存储结果。
5.权利要求1的系统,其中在把控制指令存储到VIM前从功能指令剥离分组位组和单元字段位组并且把至少一个替代位替换到分组或单元字段的位组位置上。
6.权利要求5的系统,其中替代位是使能/禁止位。
7.权利要求5的系统,其中替代位是操作码扩充位。
8.权利要求5的系统,其中替代位是寄存器文件扩充位。
9.权利要求5的系统,其中替代位是条件执行扩充位。
10.权利要求8的系统还包括多个执行单元,并采用第一排和第二排寄存器以及寄存器文件扩充位,该多个执行单元对第一排寄存器或对第二排寄存器读或写。
11.权利要求1的系统还包括用于存储功能指令的第二寄存器;用于连接第一寄存器的一个输出端和第二寄存器的一个输入端的一条旁路通路;以及一种选择机制,用于选择不把功能指令装入VIM中而将它从第一寄存器送到第二寄存器的旁路操作。
12.权利要求11的系统,其中在把控制指令存储到第二寄存器之前替换一个或多个分组位和单元字段位。
13.权利要求1的系统,还包括至少一个通过网络接口连接和第一PE连接的附加PE,及每个PE具有一个相关的和一个接收端口连接的群集交换器,接收端口由群集交换器控制。
14.权利要求13的系统,其中相关的群集交换器包含一个互连的多路复用器,以提供群集PE内PE之间的独立通路。
15.权利要求1的系统,还包括一个和第一PE连接的并且向第一PE提供控制指令和所述功能指令的顺序处理机(SP),控制指令为执行VLIW指令(XV)或装入/修改VLIW指令(LV)中的一种,XV指令和LV指令二者都包括用于间接执行VLIW目的的地址偏移及基指针。
16.权利要求15的系统,还包括至少一个和SP连接的附加PE,及向第一PE以及所述至少一个附加PE二者同步地提供所述控制指令,以使当在相同的VIM地址上执行不同VLIW时所述各PE运行成同步多指令多数据流(SMIMD)机否则所述PE将运行成SMID机。
17.权利要求16的系统,其中多个PE和SP连接,并且多个PE组织成由一个或多个PE构成的第一和第二分组。
18.权利要求17的系统,其中在一个操作周期期间第一分组PE在第一VIM地址上间接在某VLIW指令上操作,并且在该操作周期期间第二分组PE在相同的第一VIW地址上间接在某不同的VLIW指令上操作。
19.权利要求17的系统,其中多个PE遵循通信控制的接收模型操作,在接收模型下每个PE具有一个接收端口并控制在该接收端口是否接收数据。
20.权利要求19的系统,其中每个PE具有一个和接收端口连接的输入多路复用器并且通过控制所述输入多路复用器而控制通信。
21.权利要求19的系统,其中多个PE编程成通过存储协同指令协同操作,从而每个PE具有规定一条经其另一个PE为所述多个PE中的每个在相同的位置可得到数据的通路的接收指令。
22.权利要求17的系统,还包括用于把各个PE屏蔽成ON或屏蔽成OFF的屏蔽机制。
23.权利要求22的系统,其中在装入VLIW操作期间为屏蔽成ON的PE装入VIM并且不为屏蔽成OFF的PE装入VIM。
24.权利要求17的系统,其中在相同的周期内不同的PE执行不同的VLIW。
25.权利要求1的系统,其中VIM包括用于存储下述类型的功能指令的槽组存储单元指令;装入单元指令;算术逻辑单元指令;乘法累积单元指令;或者数据选择单元指令。
26.权利要求25的系统,其中使用多个PE并且不同的任何关联着一个或多个VLIW槽,以允许在相同的周期中由PE同时在不同的任何上执行多个操作。
27.一种超长指令字(VLIW)处理系统包括具有VLIW存储器(VIM)的第一处理部件(PE),用于把VLIW存储到某规定的VIM地址中的各槽中;第一寄存器,用于存储控制指令和功能指令;一个预译码器,用于通过译码多个分组位而区分控制指令和功能指令;以及一种装入机制,用于根据对所述控制指令的所述译码把各功能指令装入到VIM的各所述槽中的一个适当的槽中。
28.权利要求27的VLW处理系统还包括一个顺序处理机(SP)控制器,该SP控制器向各PE发送装入VLIW(LV)定界符,LV定界符后面跟着一串要装入到所述VIM中由该LV定界符规定的某VIM地址上的指令。
29.一种带有至少二个处理部件(PE)的单指令多数据流(SIMD)机,所述SIMD机中的每个PE借助由某执行VLIW(XV)指令启动的间接执行和借助各PE中相同VIM地址上存储的不同VLIW指令而间接地在VLIW存储器(VIM)中存储的VLIW指令上操作。
30.权利要求29的SIMD机,其中XV指令包括用于间接执行VLIW目的的用于每个PE的偏移地址和对基地址寄存器的指针。
31.权利要求29的SIMD机,其中利用装入控制指令(LV)把指令存储到多个PEVIM中,该LV建立装入过程并按接收到多个PE的VIM中装入指令。
32.权利要求30的SIMD机还包括一个SIMD顺序处理器(SP)控制器,其中通过该SIMD SP控制器向各PE发送控制指令VL和LV。
33.一种间接超长指令字(VLIW)处理方法,包括取出要存储到第一处理器件(PE)中的VLIW指令存储器(VIM)里的第一VLIW功能指令,所述VLIW功能指令具有多个定义指令类型的分组位和多个定义执行单元类型的单元字段位;把第一功能指令存储到第一寄存器中;利用一个预译码器对每个分组位和多个单元字段位译码;以及根据所述译码利用一种所述VIM的装入机制把该功能指令装入到所述VIM中的适当地址处。
34.权利要求33的方法,还包括接收一个控制指令的步骤,该控制指令是包含用于间接执行VLIW目的的地址偏移和指向基地址寄存器的基指针的执行VLIW指令(XV)。
35.权利要求33的方法,还包括接收一个控制指令的步骤,该控制指令是包含用于间接执行VLIW目的的地址偏移和指向基地址寄存器的基指针的装入/修改VLIW指令(LV)。
36.权利要求33的方法,还包括在把功能指令存入VIM之前从该功能指令中剥离分组位组和单元字段位组以产生更紧凑的存储结果的步骤。
37.权利要求33的方法,还包括把控制指令存储到VIM前从功能指令中剥离分组位组和单元字段位组并且把至少一个替代位增加到分组或单元字段的位组位置上的步骤。
38.权利要求33的方法,还包括接收旁路指令并在不把第一VLIW功能指令装入VIM下把第一VLIW功能指令存储到第二寄存器中的步骤。
39.权利要求33的方法,还包括从和第一PE连接的顺序处理机(SP)中接收送至第一PE的控制指令和所述功能指令二者的步骤,控制指令或为执行VLIW指令(XV)或为装入/修改VLIW指令(LV),XV指令和LV指令二者都包含用于间接执行VLIW目的的地址偏移及基指针。
40.一种超长指令字(VLIW)处理方法,包括取出要存储到第一处理部件(PE)的VLIW存储器(VIM)中的功能指令,以把VLIW指令存储到某规定的VIM地址上的各槽中;把第一功能指令和控制指令二者存储到第一寄存器中;利用一个预译码器译码多个分组位,以便区分控制指令和功能指令;以及根据对所述控制指令的所述译码把功能指令存储到VIM里的所述各槽中的一个适当的槽中。
41.权利要求38的VLIW方法,还包括从一个顺序处理机(SP)控制器中接收装入VLIW(LV)定界符的步骤,LV定界符后面跟着一串要装入到所述VIM中由该LV定界符规定的某VIM地址上的指令。
全文摘要
一种SIMD机(160)采用多个在其中以有效方式消除了通信危险的平行处理机(PE)(104)。和执行指令及定界符指令一起采用间接超长指令字指令存储器(UIM)(160)。可采用屏蔽机制来控制哪些PE可使其UIM得到装入。此外,最好采用操作的接收模型。在一个方面,每个PE操作以控制一个选择从哪个PE接收的交换器(107)。本发明提出一种更好的用于执行平行算法的机器组织以减少硬件成本和复杂性并同时保持SIMD机和MIMD机二者的最佳特征以及使通信等待时间为最小。本发明对SIMD间接超长指令字(iVLIW)处理部件造成一级MIMD计算自主性并同时保持SIMD机组织中使用的单个控制线程。从而,用术语同步MIMD(SMIMD)描述本方法。
文档编号G06F9/38GK1278342SQ98810767
公开日2000年12月27日 申请日期1998年11月6日 优先权日1997年11月7日
发明者格拉尔德·G·皮查奈克, 托马斯·L·德拉本能托特, 朱安·奎莱尔莫·莱维拉, 戴维·卡尔·斯特鲁贝, 格莱森·莫里斯 申请人:博普斯公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1