用于并行访问多个存储器模块的方法和设备的制作方法

文档序号:6404669阅读:197来源:国知局
专利名称:用于并行访问多个存储器模块的方法和设备的制作方法
技术领域
本发明总体上涉及在一个具有多个存储器模块的设备中进行数据处理,所述多个存储器模块被并行访问以便在这些存储器模块中检索和存储数据元素,更具体而言,本发明涉及对于这样一个设备的2的幂跨越(stride)访问以及对于一个设备的动态存储方案。
背景技术
在含有并行处理资源的硬件结构中,来自存储器的若干操作数需要被同时传送以便使得处理能力与存储器带宽相匹配。可以通过为每个操作数访问分配一个独立的存储器模块来实现多个操作数访问。不过,如果使用这种方案,则由于并行数据访问不总是线性的,因此会出现问题。这样会引入访问冲突,因为要被访问的数据操作数是在相同的存储器模块中,因此它们不能被同时访问。
在数字信号处理(DSP)中,通常是通过从N个元素的数据数组中获取每第K个元素而访问数据元素,其中N=2n,K=2k,n=1,2,...并且k=0,1,2,...,n-1。特别地,每第K个元素被获取,但是当访问超过N-1时,访问模式绕回到开始。按照如下所示的顺序来访问元素,其中p是新的地址,i是线性排序索引 其中, 表示z的弱取整函数,也就是小于或等于z的最大整数;mod是模数运算。利用这种访问排序,一个N点数组(x0,x1,x2,...,xN-1)将被按照(x0,xK,x2K,...,xN-K,x1,xK+1,x2K+1,...)来访问。这种访问模式涉及通过K排列(permutation)来跨越。这里,K是由2的幂定义的一个数,因此,所述访问被称作2的幂跨越访问。这种互连拓扑存在于例如离散三角变换以及网格编码中。在Melton等人的EP 0 313788B1中公开了增强并行2的幂跨越访问的映射方法。当一个N元素数据块具有分布在Q个存储器模块上的N个存储位置时,可以执行每第K个数据元素的Q个并行访问,使得N=2n,Q=2q,K=2k,其中n=1,2,...,q=1,2,...,n-1并且k=0,1,2,...,n-1。
过去,通过使用一种称作双缓存的技术来避免访问冲突,其中为一个N点数据数组分配2N个存储位置。利用双缓存,当正在写入一个位置的数据时,读取另一个位置的数据。在某些DSP处理器中的维特比解码中已经使用了这种方案。这种方案的主要缺点是它增加了存储器的大小并且还增加了等待时间。存储器访问也可以被硬编码到软件代码中。这种方法增加了代码大小。作为选择,也可以使用查找表。不过,查找表也增加了存储器消耗以及存储器访问的数量。此外,还可以使用多端口存储器,但是这种存储器在面积方面是昂贵的。
已经建议了专门的地址产生单元,但是它们只支持一个特定的2k跨越(单一访问模式)连同1跨越,它是线性访问;或者它们被限于某些数据数组大小。Harper(美国专利No.4,918,600)公开了一种跨越访问的方法,其中每次只支持两个跨越1和2k。不过,当使用2个以上的存储器时,也就是4、8等时,Harper不支持1跨越和N/2跨越。在这种情况下,我们需要访问元素索引(0,N/2,1,N/2+1,2,...)。特别是,N/2和1的并行访问会造成冲突。专门的地址产生单元也可以支持某个数量的并行存储器,正如Cohen(IEEE期刊声学、语音和信号处理,1976年12月,第577-579页)中所公开的那样。
目前,还有一些并行访问方案,这些方案需要奇数个存储器模块,并且存储器模块的数量大于同时被访问的操作数的数量,这在D.T.Harper的“Block,multistride vector,and FFT accesses inparallel memory systems(在并行存储器系统中的块、多跨越矢量以及FFT访问)”(IEEE期刊并行和分布式系统,第2卷、第1期、第43-51页,1999年1月)中被公开。利用这些方案,存储器消耗也较高并且存储器被分段。
因此,有利的并且希望的是提供一种有效地根据跨越排列来为Q个并行存储器访问产生地址的方法和设备。

发明内容
本发明的一个主要目的是提供一种在数据处理设备中无冲突地访问并行存储器模块的方法。
本发明的另一个目的是提供一种设备和系统,用于把地址位置映射到并行存储器模块中的物理存储位置,以便对于若干跨越进行无冲突访问。
可以通过基于每个数据块中的元素的数量以及存储器模块的数量来为所述每个数据块预先选择一个存储方案,从而达到上述目的。
因此,根据本发明的第一方面,提供了一种方法,用于经由Q个并行访问来访问分布在Q个存储器模块上的N个存储位置上的N元素数据块的数据元素,其中所述N个存储位置是在一个n比特索引地址中可寻址的,并且所述Q个存储器模块是在一个q比特模块地址以及一个(n-q)比特行地址中可寻址的。所述方法的特征在于从索引地址中选择(n-q)个比特来提供行地址;把索引地址分组成为包括多个第一字段的多个字段,其中每个第一字段包含q个比特;并且在从所述多个字段中的相应位置获得的比特上执行一个逻辑函数运算,以便提供用于访问所述Q个存储器模块之一中的数据元素的模块地址。
根据本发明,所述多个字段可包括一个第二字段,其中该第二字段包含e个比特,e是小于q的正整数,并且e依赖于n与q之间的关系。
优选地,所述方法的特征还在于在所述多个字段之一上执行一个旋转操作来提供一个第三字段,其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
优选地,所述方法的特征还在于把(q-e)个零拼接到所述第二字段。
根据本发明,所述方法的特征还在于在所述多个字段之一上执行一个旋转操作来提供一个第三字段,其中被执行旋转操作的那个字段包含最低有效位,并且其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
优选地,所述逻辑函数是逐位异或运算。
根据本发明,n比特索引地址可以被安排为一个任意顺序。此外,q比特存储器模块地址还可以被重新排序为任意顺序。
根据本发明的第二方面,提供了一种设备,用于轻由Q个并行访问来访问分布在Q个存储器模块上的N个存储位置上的N元素数据块的数据元素,其中所述N个存储位置是在一个n比特索引地址中可寻址的,并且所述Q个存储器模块是在一个q比特模块地址以及一个(n-q)比特行地址中可寻址的。所述设备的特征在于装置(12),该装置操作连接到所述索引地址,用于从索引地址中选择(n-q)个比特来提供所述行地址;以及装置(40),该装置操作连接到索引地址,用于把索引地址分组成为包括多个第一字段的多个字段,并且在从所述多个字段中的相应位置获得的比特上执行一个逻辑函数运算,以便提供用于访问所述Q个存储器模块之一中的数据元素的模块地址,其中每个第一字段包含q个比特。
根据本发明,所述多个字段还可包括一个第二字段,其中该第二字段包含e个比特,e是小于q的正整数,并且e依赖于n与q之间的关系;并且所述设备还包括装置(31),该装置操作连接到所述第二字段,用于在执行逻辑函数之前把(q-e)个零拼接到所述第二字段。
有利的是,所述设备的特征还在于装置(30),该装置操作连接到所述多个字段中的一个字段,用于在所述多个字段的所述一个字段上执行旋转操作来提供一个第三字段,其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
优选地,所述分组和执行装置(40)包括多个异或装置。
根据本发明的第三方面,提供了一种数据处理系统(100),该系统包括一个用于存储数据元素的存储器单元(120)和数据处理模块(140),该模块操作连接到所述存储器单元以便访问数据元素,其中所述存储器单元包括在N个存储位置中的、在一个n比特索引地址(20)中可寻址的N元素数据块。所述系统的特征在于N个存储位置上的N元素数据块分布在Q个存储器模块上(1200,...,102Q-1),其中Q个存储器模块在一个q比特模块地址(M)以及一个(n-q)比特行地址(R)中可寻址;所述数据处理模块包括Q个数据处理器(1420,...,142Q-1),用于经由Q个并行访问来访问Q个存储器模块;所述系统的特征还在于地址发生器(100),该地址发生器操作连接到所述存储器单元,用于提供对于所述存储器单元中的数据元素的访问,其中所述地址发生器包括第一地址发生器(12),该第一地址发生器操作连接到所述索引地址(20),来提供行地址(R);以及第二地址发生器(40),该第二地址发生器操作连接到索引地址(20),来提供模块地址(M),以及互连装置(130,132),该互连装置操作连接到地址发生器(100)、存储器单元120以及数据处理器模块140,来允许Q个数据处理器访问Q个存储器模块中的数据元素,其中由所述第一地址发生器(20)提供的行地址是从索引地址的(n-q)个比特中选择的,并且由所述第二地址发生器提供的模块地址是如下获得的把索引地址(20)分组成为包括多个第一字段的多个字段,每个第一字段包含q个比特;并且在从所述多个字段中的相应位置获得的比特上执行一个逻辑函数运算。
当阅读了连同附图1到6所作的描述之后,本发明将变得很清楚。


图1是包含本发明的各个方面的数据处理系统的框图。
图2是根据本发明的行地址产生的原理框图。
图3是根据本发明的优选方法的模块地址产生原理的框图。
图4是根据本发明的旋转单元的原理框图。
图5是用于模块地址产生的替代方法的框图。
图6是用于所述替代方法的拼接单元的框图。
执行本发明的最佳模式图1是包含本发明各个方面的数据处理设备100的框图。该数据处理设备包括处理器140,它可每次使用或产生Q个数据元素。处理器140可以包含用于数据处理的多个算术单元1420,1421,...,142Q-1。数据元素被从总体上由120指明的主存储器中读取并且被写入该主存储器,该主存储器包括一组Q个存储器模块1200,1201,...,120Q-1。每个存储器模块中的存储位置不是由邻接的一组地址来定位的,由处理器定位的存储器地址到存储器模块的物理存储位置的特定映射被称作系统的存储方案。
对于图1所示的系统,映射是由一个地址发生器110提供的,该地址发生器110基于依赖于所述数据块中的元素数量以及存储器模块的数量的预定访问控制150来动态改变映射。只要存储到存储器中的数据块中的元素数量保持,则这种预定访问控制就是不变的。处理器140通过将Q个地址索引放置到Q个地址总线160上来执行对于存储器的Q个定位。地址发生器110把每个地址索引Ai映射到一个由一个存储器模块地址MI和一个行地址Ri所组成的地址对。模块地址被用于通过开关网络132把相应的行地址Ri发送到存储器模块Mi。同时,借助于开关网络130来建立数据总线Di170与MI之间的路径,从而允许数据被写入存储器或者从存储器中读取。图2中示出了由行地址发生器12i来产生行地址Ri。图3-6示出了由模块地址发生器10i来产生存储器模块地址Mi。
在一个块中的数据元素数量为N=2n并且这些数据元素分布在Q个存储器模块(Q=2q并且1<q<n)上的数据处理环境中,需要n个比特来识别一个块中的单个数据元素(索引地址);需要q个比特来指定单独的存储器模块;以及需要(n-q)个比特来寻址一个特定的存储器模块中的存储位置。把用于索引地址的n个比特定义成A=(an-1,an-2,...,a2,a1,a0),其中an-1是最高有效位;把用于存储器模块地址的q个比特定义成M=(mq-1,mq-2,...,m2,m1,m0),其中mq-1是最高有效位;并且把用于模块中的行地址的(n-q)个比特定义成R=(rn-q-1,rn-q-2,...,r2,r1,r0),其中rn-q-1是最高有效位。为了访问该数据数组中一个具有索引A(一个n比特地址)的单个数据元素,需要产生一个q比特模块地址M和一个(n-q)比特行地址R。实际上,要计算Q个这种地址。
仅仅通过取由参考编号20所表示的索引地址A的(n-q)个最高有效位来形成行地址R。例如,如图2所示,R=(rn-q-1,rn-q-2,...,r2,r1,r0)=(an-1,an-2,...,aq)。不过,这(n-q)个比特的选择不是关键的;任何来自A的(n-q)个比特都可以用作行地址R。
可以利用如下公式来计算模块地址M 其中,表示逐位异或运算,mod是模数运算,gcd(.)是最大公约数,并且 表示弱取整函数。应当指出,比特ai的顺序并不是关键的;比特ai可以被重新排序为任意顺序。
例如,可以如下解释模块地址M的计算。该解释可以用于实现跨越访问。
首先,将索引地址A划分成为从最低有效位A开始的q比特字段Fi,也就是 如果e=mod(n,q)>0,则超过q比特块边界的A的e个最高有效位就被提取为比特矢量L=(le-1,le-2,...,l0),它因此被定义为L=(an-1,an-2,...,an-e) (3)接下来,通过从索引地址A中提取(q-h)个最低有效位来形成一个q比特字段X=(xq-1,xq-2,...,x0),其中h=gcd(q,e),并且把零拼接到所述比特字段的最高有效位端,也就是比特字段F0的h个最高有效位被调零成X=(0,...,0,aq-h-1,...,a1,a0) (4)比特矢量X被向左端旋转g=mod(n-q,q)比特,从而获得一个比特矢量O=(oq-1,....,o0),也就是O=rotmod(n-q,q)(X)(5)其中rotg(.)表示给定比特矢量操作数向左端旋转(循环移位)g比特,也就是rotg((ak-1,ak-2,...,a1,a0))=(ak-g-1,ak-g-2,...a0,ak-1,...,ak-g+1,ak-g) (6)
通过如下在矢量Fi、O和L之间执行逐位异或运算来获得最终的模块地址M 图3示出了模块地址产生10的原理框图。如图3所示,由参考数字20表示的索引地址A被分组成为 个第一字段 以及一个第二字段L。由参考数字22表示的所述第一字段中的每一个包含q个比特。由参考数字24表示的第二字段L包含e个比特。一组q个异或装置400,401,...,40q-1中的每一个被用于在第一和第二字段中的相应位置中的一组比特上的逐位异或运算,以便提供模块地址M。应当指出,在执行逐位异或运算之前,对于所述第一字段中的一个第一字段进行比特旋转,从而成为第三字段0。如图3所示,第一字段F0被一个旋转单元30转换成为第三字段0。这样,在第一、第二和第三字段中的相应位置中的一组比特上的逐位异或运算提供用于访问Q个存储器模块中的元素的模块地址M。根据旋转控制32以及字段选择控制34,旋转单元30被用于产生一个q比特字段/矢量O。还应当指出,图3示出了一个单独的M是如何被产生的。为了执行Q个访问,需要类似于图3所示的Q个单元。图4示出了矢量O的产生。如图所示,gcd(q,e)个最高有效位被调零,也就是(q-h)个最低有效位被通过,h=gcd(q,e),以便形成q比特矢量X=(0,0,...,0,aq-h-1,aq-h-2,...,a1,a0)。比特的选择可以通过提供一个字段选择控制34来执行,所述字段选择控制34是一个q比特矢量S=(sq-1,sq-2,...,s1,s0),其中q-h个最低有效位是逻辑一并且h个最高有效位是逻辑零。当执行与输入矢量的逐位‘与’运算时,形成矢量X。然后,这个比特矢量被向左端旋转g=mod(n-q,q)比特,来产生q比特输出矢量O=(oq-1,oq-2,...,o1,o0)。
应当指出,在索引地址A中的比特ai的顺序并不重要,A可以被重新排序为任意顺序。以类似的方式,在模块地址M中的比特mi可以被重新排序为任意顺序。
替代方法图5和6示出了替代方法。以与前面描述的如图2所示的相同方式来产生行地址R。同样,(n-q)比特的选择并不是关键的;任何来自A的(n-q)比特都能够被用作行地址R。
如下来获得模块地址M首先,索引地址A被分到从最低有效位开始的q比特字段中,即,比特矢量Fi如下地形成 如果e=mod(n,q)>0,也就是A的e个最高有效位超过q比特边界,则在最高有效部分无法形成一个完整的q比特字段。然后,如下形成一个额外的q比特字段O=(oq-1,....,o0)。一个比特矢量L=(le-1,le-2,....,l0)被形成,它含有A的剩余e个最高有效位,也就是L=(aq-1,aq-2,...,aq-e)。L被拼接 次,也就是L被拼接单元31拷贝 次,如图5所示。
如果e=mod(n,q)=0,则可以通过如下执行q比特矢量Fi之间的逐位异或运算来获得模块地址M 在这种情况下,不需要拼接单元31。同样,图5中的结构只产生一个M。实际上,需要Q个这种结构来执行Q个并行访问。
如果s=mod(q,e)=0,则拼接产生q比特字段,因此矢量O被形成为oi=lmod(i,e),i=0,1,...,q-1|mod(q,e)=0(10)如果s=mod(q,e)>0,也就是拼接不产生q比特矢量,则剩余的s比特被如下产生。通过拼接L的s个最低有效位和L的(w-s)个最高有效位来形成矢量X,其中w定义为w=e-gcd(q,e)(11)因此,w比特矢量X可以定义成
X=(ls-1,ls-2,...,l0,le-1,le-2,...,le-w+s) (12)矢量O的w个最高有效位是通过在w比特矢量X与L的w个最高有效位(le-1,le-2,...,le-w)之间执行逐位异或运算来获得的,也就是oq-i=xw-ile-i,i=1,2,...,w|mod(q,e)>0 (13)O的剩余(q-w)个最低有效位只是通过如下拼接矢量L来获得ol=lmod(i,e),i=0,1,...,q-w-1|mod(q,e)>0(14)图6示出了矢量O的计算。
最后,可以如下通过在矢量Fi与O之间执行逐位异或运算来获得存储器模块地址M 同样,索引地址A中的比特ai的顺序并不重要,A可以被重新排序成为任意顺序。以类似的方式,模块地址M中比特mi可以被重新排序成为任意顺序。
尽管已经参考本发明的优选实施例来描述了本发明,但是本领域技术人员应当理解,可以在不偏离本发明范围的情况下作出本发明的形式和细节上的前述以及各种其它改变、省略和背离。
权利要求
1.一种经由Q个并行访问来访问分布在Q个存储器模块上的N个存储位置上的N元素数据块的数据元素的方法,其中所述N个存储位置是在一个n比特索引地址中可寻址的,并且所述Q个存储器模块是在一个q比特模块地址以及一个(n-q)比特行地址中可寻址的,其中N=2n,而Q=2q,所述方法的特征在于从索引地址中选择(n-q)个比特来提供行地址;把索引地址分组到包括多个第一字段的多个字段中,其中每个第一字段包含q个比特;并且在从所述多个字段中的相应位置获得的比特上执行一个逻辑函数运算,以便提供用于访问所述Q个存储器模块中的数据元素的模块地址。
2.根据权利要求1所述的方法,其特征在于所述多个字段还包括一个第二字段,其中该第二字段包含e个比特,e是小于q的正整数,并且e依赖于n与q之间的关系。
3.根据权利要求1所述的方法,其特征还在于在所述多个字段中的一个字段上执行一个旋转操作来提供一个第三字段,其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
4.根据权利要求2所述的方法,其特征还在于在所述多个字段中的一个字段上执行一个旋转操作,使得该字段的h个最高有效位被设置成逻辑零,从而提供一个第三字段,h=gcd(q,e),其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
5.根据权利要求2所述的方法,其特征还在于把(q-e)个零拼接到所述第二字段。
6.根据权利要求5所述的方法,其特征还在于在所述多个字段中的一个字段上执行一个旋转操作来提供一个第三字段,其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
7.根据权利要求5所述的方法,其特征还在于在所述多个字段中的一个字段上执行一个旋转操作,使得该字段的h个最高有效位被设置成逻辑零,从而提供一个第三字段,h=gcd(q,e),其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
8.根据权利要求1所述的方法,其特征在于所述逻辑函数是逐位异或运算。
9.根据权利要求1所述的方法,其特征在于所述多个字段中的所述一个具有q个比特,该q个比特比所述多个字段中的其它字段的比特的有效性低。
10.根据权利要求1所述的方法,其特征在于n比特索引地址被以任意顺序排列。
11.根据权利要求1所述的方法,其特征在于存储器模块地址中的q个比特被以任意顺序排列。
12.根据权利要求1所述的方法,其特征在于行地址中的(n-q)个比特被以任意顺序排列。
13.根据权利要求2所述的方法,其特征在于第二字段中的e个比特被以任意顺序排列。
14.一种设备,用于经由Q个并行访问来访问分布在Q个存储器模块上的N个存储位置上的N元素数据块的数据元素,其中所述N个存储位置是在一个n比特索引地址中可寻址的,并且所述Q个存储器模块是在一个q比特模块地址以及一个(n-q)比特行地址中可寻址的,其中N=2n,而Q=2q,所述设备的特征在于装置(12),该装置操作连接到所述索引地址,用于从索引地址中选择(n-q)个比特来提供所述行地址;以及装置(40),该装置操作连接到所述索引地址,用于把索引地址分组到包括多个第一字段的多个字段中,并且在从所述多个字段中的相应位置获得的比特上执行一个逻辑函数运算,以便提供用于访问所述Q个存储器模块中的数据元素的模块地址,其中每个第一字段包含q个比特。
15.根据权利要求14所述的设备,其特征在于所述多个字段还包括一个第二字段,其中该第二字段包含e个比特,e是小于q的正整数,并且e依赖于n与q之间的关系。
16.根据权利要求15所述的设备,其特征还在于装置(31),该装置操作连接到所述第二字段,用于在执行逻辑函数之前把(q-e)个零拼接到所述第二字段。
17.根据权利要求14所述的设备,其特征还在于装置(30),该装置操作连接到所述多个字段中的一个字段,用于在所述多个字段的所述一个上执行旋转操作来提供一个第三字段,其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
18.根据权利要求14所述的设备,其特征还在于装置(30),该装置操作连接到所述多个字段中的一个字段,用于在所述多个字段的所述一个上执行旋转操作,以便该字段的h个最高有效位被设置成为逻辑零,从而提供一个第三字段,h=gcd(q,e),其中所述逻辑函数除了在所述多个字段上执行之外还在所述第三字段上执行。
19.根据权利要求14所述的设备,其特征在于分组和执行装置(40)包括多个异或装置。
20.一种数据处理系统(100),该系统包括一个用于存储数据元素的存储器单元(120)和数据处理模块(140),该模块操作连接到所述存储器单元以便访问数据元素,其中所述存储器单元包括在N个存储位置中的、在一个n比特索引地址(20)中可寻址的N元素数据块,有N=2n,所述数据处理系统的特征在于N个存储位置上的N元素数据块分布在Q个存储器模块(1200,...,102Q-1)上,其中Q个存储器模块在一个q比特模块地址(M)以及一个(n-q)比特行地址(R)中可寻址,有Q=2q;所述数据处理模块包括Q个数据处理器(1420,...,142Q-1),用于经由Q个并行访问来访问Q个存储器模块;所述系统的特征还在于地址发生器(100),该地址发生器操作连接到所述存储器单元,用于提供对于所述存储器单元中的数据元素的访问,其中所述地址发生器包括第一地址发生器(12),该第一地址发生器操作连接到所述索引地址(20),来提供行地址(R);以及第二地址发生器(40),该第二地址发生器操作连接到所述索引地址(20),来提供模块地址(M),以及互连装置(130,132),该互连装置操作连接到地址发生器(100)、存储器单元120以及数据处理器模块140,来允许Q个数据处理器访问Q个存储器模块中的数据元素,其中由所述第一地址发生器(20)提供的行地址是从索引地址的(n-q)个比特中选择的,并且由所述第二地址发生器提供的模块地址是如下获得的把索引地址(20)分组到包括多个第一字段的多个字段中,每个第一字段包含q个比特;并且在从所述多个字段中的相应位置获得的比特上执行一个逻辑函数运算。
全文摘要
一种用于经由Q个并行访问来访问分布在Q个存储器模块(120)上的N个存储位置上的N元素数据块的数据元素的方法和设备。Q个存储器模块是以2的幂的跨越方式、在一个q比特模块地址和一个(n-q)比特行地址中可寻址的。行地址是从索引地址(20)的(n-q)比特中选择的,在从索引地址分组的多个q比特字段中的相应位置中获得的比特上执行逐位异或运算,从而获得用于Q个访问之一的模块地址。
文档编号G06F12/06GK1639683SQ03805327
公开日2005年7月13日 申请日期2003年2月28日 优先权日2002年3月7日
发明者J·塔卡拉 申请人:诺基亚有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1