专用处理块中的混合精度浮点运算电路的制作方法

文档序号:15736480发布日期:2018-10-23 21:34阅读:229来源:国知局

本实施例涉及集成电路,并且更特别地,涉及集成电路中的专用处理块中的混合精度浮点运算电路。



背景技术:

随着应用的复杂性的增加,将专用处理块包括在集成电路中变得更加常见。这样的专用处理块可以是部分或完全硬连线的以执行一个或多个具体任务,诸如逻辑或数学运算。专用处理块还可以包含一个或多个专用结构,诸如可配置存储器元件的阵列。

通常在此类专用处理块中实施的结构的示例包括:乘法器、加法器、累加器、算术逻辑单元(ALU)、桶型移位器、各种存储器元件或存储电路,诸如先进先出(FIFO)电路、后进先出(LIFO)电路、串入并出(SIPO)移位寄存器电路、并入串出(PISO)移位寄存器电路、随机存取存储器(RAM)电路、只读存储器(ROM)电路、内容可寻址存储器(CAM)电路和寄存器文件、逻辑与、逻辑与非、逻辑或、逻辑或非阵列等等,或者其组合。

一种特别有用的类型的专用处理块,其有时也被称为数字信号处理(DSP)块,可以被用来处理诸如视频信号、音频信号等等的数字信号。此类块常常也被称为乘法累加(MAC)块,因为它们包括用来执行乘法运算、以及乘法运算的求和和/或累加的结构。

诸如可编程集成电路的集成电路常常包括专用处理块。那些专用处理块中的每一个都包括乘法器、加法器和寄存器,以及允许以不同方式来配置块的各种部件的可编程连接器(例如复用器)。

通常,此类专用处理块中的算术运算符(加法器和乘法器)是定点运算符。如果需要浮点运算符,则将使用设备的通用可编程逻辑、或使用专用处理块内部的定点运算符和通用可编程逻辑中的附加逻辑的组合来在专用处理块外部构造它们。

附图说明

图1示出根据一些实施例的诸如可编程集成电路的说明性集成电路的图解。

图2是根据一些实施例的用于执行混合精度浮点运算的说明性专用处理块的图解。

图3是根据一些实施例的以级联链布置并且一起执行递归模式点积运算的第一级的两个说明性专用处理块的图解。

图4是根据一些实施例的以级联链布置并且一起执行递归模式点积运算和累加运算的第一级的两个说明性专用处理块的图解。

图5是根据一些实施例的以级联链布置并且生成两个浮点数向量的点积的六个说明性专用处理块的图解。

图6是根据一些实施例的以级联链布置并且执行两个浮点数向量的递归模式点积以及结果的累加的四个说明性专用处理块的图解。

图7是根据一些实施例的示出用于操作生成第一和第二向量的点积的集成电路的说明性操作的流程图的图解。

图8是根据一些实施例的利用用于配置集成电路以生成第一和第二向量的点积的机器可执行指令集编码的磁性数据存储介质的横截面视图。

图9是根据一些实施例的利用用于配置集成电路以生成第一和第二向量的点积的机器可执行指令集编码的光学可读数据存储介质的横截面视图。

具体实施方式

本文中提供的本实施例涉及集成电路,并且更特别地,涉及在集成电路中的专用处理块中的混合精度浮点运算电路。

浮点数常见用于在计算系统中以科学记数法表示实数并且被设计成覆盖大的数值范围和不同的精度要求。2008年8月29日公开的IEEE 754标准,ANSI/IEEE Std. 754-2008,通常被用于浮点数。浮点数包括三个不同部分:符号、尾数(有时也被称为有效的)和阶码。这些部分中的每一个都可以用二进制数来表示,并且按IEEE 754标准的格式具有取决于精度的不同位数。例如,单精度浮点数可能需要32位,其按如下分配:1个符号位(位31)、8个阶码位(位[30:23])和23个尾数位(位[22:0])。双精度浮点数可能需要64位,包括1个符号位(位63)、11个阶码位(位[62:52])和52个尾数位(位[51:0])。半精度浮点数可能需要16个位,包括1个符号位(位15)、5个阶码位(位[14:10])和10个尾数位(位[9:0])。

根据IEEE 754标准,尾数还可能具有附加位。具有附加位的尾数有时也被称为经扩展的尾数。例如,经扩展的单精度尾数可能具有5个附加位(即,经扩展的单精度尾数可以由28位而不是23位组成)。添加到最低有效位(LSB)的右侧的最后三个位表示舍入、保护和粘贴位。

当执行算术运算时舍入和保护位可以提供附加的准确性。例如,将在最低有效位位置中具有‘1’的尾数除以2可能导致舍入位变为‘1’。除数为2的附加除法可能导致保护位变成‘1’。因此,舍入和保护位使得在没有这些附加位的情况下小于尾数的数字表示可以能够准确地表示。粘贴位可以通过执行与舍入和保护位的逻辑或运算来记录移位超出尾数的精度的值‘1’的任何位。

可以超出最高有效位(MSB)位置添加两个位(如果需要的话),并且所述两个位可以吸收由浮点算术运算产生的任何溢出。

使用单个位来表示根据IEEE 754标准的浮点数的符号,在这里0表示正数并且1表示负数。

浮点数的阶码优选地是无符号二进制数,对于单精度格式其范围从0到255。为了表示非常小的数字,有必要使用负阶码。因此,阶码优选地具有负偏移。对于单精度浮点数,偏移优选地是-127。例如,阶码值140实际上表示(140-127)=13,并且值100表示(100-27)=-27。对于双精度和半精度浮点数,阶码偏移优选地分别是-1023和-15。

如上面所讨论的,根据IEEE 754标准,尾数是规格化数(即它没有前导零并且表示浮点数的精度分量)。因为尾数以二进制格式存储,所以前导位可以或者是0或者是1,但是对于规格化数,它将总是1。因此,在数字总是规格化的系统中,前导位不需要被存储并且可以暗示有效地给予尾数一个额外的精度位。

执行算术运算的专用处理块常常包括多个乘法器、加法器、寄存器以及允许以不同方式来配置专用处理块的各个部件的可编程连接器(例如复用器)。通常,此类专用处理块中的算术运算符是定点运算符。

如果需要浮点运算符,则将(例如使用集成电路中的附加逻辑,或者使用专用处理块内部的定点运算符和集成电路中的附加逻辑的组合)在专用处理块外部构造它们。

然而,随着应用的复杂性的增加,浮点运算符的使用变得更加常见。此外,不同应用可能具有不同的精度要求。例如,一些应用可能要求使用双精度浮点算术运算符,而对于其他应用使用半精度浮点算术运算符是足够的。因此,期望提供可被适配成利用不同精度(例如根据IEEE 754标准,半精度浮点运算和/或单精度浮点运算和/或双精度浮点运算和/或四倍精度浮点运算和/或八倍精度浮点运算)来高效地实施浮点运算的专用处理块。

本领域技术人员将认识到,可以在没有这些具体细节中的一些或所有的情况下实践本示例性实施例。在其他情况下,没有详细地描述公知运算以便不会不必要地使本实施例模糊。

图1示出根据一些实施例的诸如可编程集成电路100的说明性集成电路的图解。

可编程集成电路100可以具有用于将信号驱动出可编程集成电路100以及用于从其他设备接收信号的输入-输出电路102。该输入-输出电路102可以包括常规输入-输出电路,串行数据收发器电路、差分接收器和发射器电路、或用来将一个集成电路连接至另一集成电路的其他电路。

如所示的,输入-输出电路102可以被定位在可编程集成电路100的外围附近。如果需要的话,可编程集成电路100可以具有以不同方式布置的输入-输出电路102。例如,输入-输出电路102可以形成可被定位在可编程集成电路上的任何地方(例如均匀地跨可编程集成电路的宽度分布)的一列或多列输入-输出电路的一个或多个列。如果需要的话,输入-输出电路102可以形成(例如跨可编程集成电路的高度分布的)输入-输出元件的一个或多个行。备选地,输入-输出电路102可以形成在可编程集成电路的表面上分布或在所选区域中群聚的输入-输出元件的岛状物。

垂直互连资源140和水平互连资源150(诸如全局和本地垂直和水平导电线和总线)可以被用来在可编程集成电路100上路由信号。垂直和水平互连资源140和150包括导电线以及相应导电线之间的可编程连接,并且因此有时被称为可编程互连、可配置互连或可配置互连电路。

可编程逻辑区可以包括可编程部件诸如数字信号处理电路120和存储电路130(这二者可以被组织在专用块中),或组织在逻辑阵列块110中的其他组合和时序逻辑电路。可编程逻辑区可以被配置成执行定制逻辑功能。如果需要的话,数字信号处理电路120和存储电路130可以具有有限的可配置性。在一些实施例中,可编程逻辑区可以包括附加的专用块,诸如可编程锁相环电路、可编程延迟锁定环电路、或具有有限可配置性的其他专用块。

在一些实施例中,数字信号处理电路120可以可适配成利用不同精度来高效地实施浮点运算。例如,数字信号处理电路120可以实施半精度浮点运算和/或单精度浮点运算和/或双精度浮点运算和/或四倍精度浮点运算等等。

在一些实施例中,可以以级联链来布置数字信号处理电路120的多个块,并且数字信号处理电路120的级联链中的两个或更多块可以一起实施两个向量的点积。

例如,数字信号处理电路120的每个块可以实施一个或多个乘法运算,每一个都通过用两个向量中的一个的元组乘以两个向量中的另一个的元组来生成相应的积。如果需要的话,数字信号处理电路120的第一块可以生成由第一块生成的相应积的和数并且在级联输出端处提供该和数,该级联输出端有时也被称为链出、级联输出端口、链输出端口或级联链输出端。

数字信号处理电路120的第二块可以经由级联或链连接在级联输入端处接收来自第一块的和数,该级联输入端有时也被称为级联入、级联输入端口、链输入端口或级联链输入端。

该第二块可以生成由第二块生成的相应积与在级联输入端处接收的和数的和数,并在级联输出端处提供所生成的和数以用于在数字信号处理电路120的附加块中进行进一步处理(如果需要的话)。

可编程集成电路100可以包括可编程存储器元件。可以使用输入-输出电路102来使这些存储器元件加载有配置数据(有时也被称为编程数据)。一旦被加载,存储器元件中的每一个都提供控制可编程逻辑区中的相关联逻辑部件的操作的对应静态控制信号。在典型场景中,将被加载的存储器元件的输出应用于可编程逻辑区中的晶体管的栅极以接通或断开某些晶体管并且由此配置可编程逻辑区中的逻辑和路由路径。可以以这种方式控制的可编程逻辑电路元件包括复用器(例如用于在可编程互连中形成路由路径的复用器)、查找表、逻辑阵列、异或、与、或、与非和或非逻辑门、传输门、逆变器等等的部分。

存储器元件可以使用任何适当的易失性和/或非易失性存储器结构,诸如随机存取存储器(RAM)单元、熔丝、反熔丝、可编程只读存储器存储器单元、掩模编程和激光编程结构、这些结构的组合等等。因为在编程期间存储器元件被加载有配置数据,所以存储器元件有时被称为配置存储器、配置RAM、或可编程存储器元件。

可以使用任何适当的架构来组织可编程集成电路100的电路。作为一个示例,可编程集成电路100的逻辑可以被组织在较大可编程逻辑区的一系列行和列中,所述较大可编程逻辑区中的每一个都包含多个较小的逻辑区。

较小的区可以是例如有时被称为逻辑元件(LE)的逻辑的区,其均包含查找表、一个或多个寄存器和可编程复用器电路。较小的区还可以是例如有时被称为自适应逻辑模块(ALM)或切片的逻辑的区。每个逻辑的区都可以包括一对加法器、一对相关联的寄存器、移位寄存器、以及一个或多个查找表或其他共享组合逻辑(即,来自一对LE(在该上下文中有时被称为自适应逻辑元件(ALE))的资源)的块。较大的区可以是例如包含多个逻辑元件或多个ALM或多个切片的逻辑阵列块(LAB)或可配置逻辑块(CLB)。

在设备编程期间,将配置数据加载到可编程集成电路100中,该可编程集成电路100配置可编程逻辑区以使得它们的逻辑资源执行期望的逻辑功能。

在图2中示出可适配用于高效地实施混合精度浮点算术运算的专用处理块200的一个说明性实施例。在该逻辑表示中,省略诸如寄存器之类的实施细节以及诸如复用器和路由之类的一些可编程路由特征以简化讨论,所述路由可以允许在某些部件附近路由特定结构的输出或者将特定结构的输出直接从专用处理块路由出。此外,在实际实施例中,被示出的一些元件可能被实施多于一次。例如,乘法器202可以实际上表示两个或更多乘法器。

如所示的,专用处理块200可以包括输入端口271、273、275、277和279、输出端口280、链入端口262(有时也被称为级联入端口或级联输入端)、链出端口263(有时也被称为级联出端口或级联输出端)、复用器230、231、232和235、乘法器级205、加法器电路203和204、寄存器213、214、215、216、217、218、219、220、221、222和223、以及转型功能电路250。乘法器级205可以包括乘法器电路201和202。

专用处理块200可以在输出端口280处产生输出信号并且在输入端口271、273、275、277和279处接收输入信号。如果需要的话,专用处理块200可以布置在与其他专用处理块的级联链中(例如,在行或列中)并且经由直接级联连接在链入端口262处从邻近专用处理块接收附加输入信号并且经由另一直接级联连接在链出端口263处将附加输出信号提供给另一邻近专用处理块。

在一些实施例中,加法器电路203和具有乘法器电路201和202的乘法器级205可以对第一浮点精度的浮点数进行操作(例如,根据IEEE 754标准,半精度、单精度、双精度、四倍精度或八倍精度),并且加法器电路204可以对第二浮点精度的浮点数进行操作(例如,根据IEEE 754标准,半精度、单精度、双精度、四倍精度或八倍精度)。如果需要的话,第二浮点精度可以与第一浮点精度不同。

作为一个示例,该第二浮点精度可以是比第一浮点精度更高的精度。例如,根据IEEE 754标准,如果第一浮点精度是半精度,则该第二浮点精度可以是单精度、双精度、四倍精度或八倍精度;如果第一浮点精度是单精度,则该第二浮点精度可以是双精度、四倍精度或八倍精度;如果第一浮点精度是双精度,则该第二浮点精度可以是四倍精度或八倍精度;或者如果第一浮点精度是四倍精度,则该第二浮点精度可以是八倍精度。

作为另一示例,该第二浮点精度可以是比第一浮点精度更低的精度。例如,根据IEEE 754标准,如果第一浮点精度是八倍精度,则该第二浮点精度可以是半精度、单精度、双精度或四倍精度;如果第一浮点精度是四倍精度,则该第二浮点精度可以是半精度、单精度或双精度;如果第一浮点精度是双精度,则该第二浮点精度可以是半精度或单精度;或者如果第一浮点精度是单精度,则该第二浮点精度可以是半精度。

在一些实施例中,转型功能电路250可以将加法器电路203的输出从第一浮点精度转换成第二浮点精度。例如,加法器电路203的输出可以是半精度浮点数并且转型功能电路可以将积的和数转换成单精度浮点数。作为另一示例,加法电路203的输出可以是双精度浮点数并且转型功能电路250可以将积的和数转换成单精度浮点数。

为了将浮点数从第一浮点精度转换成比该第一浮点精度更高的第二浮点精度(这有时也被称为上转换),转型功能电路250可以增加尾数的位数和阶码的位数,并相应地调整阶码的偏移。例如,为了将半精度浮点数转换成单精度浮点数,转型功能电路250可以将尾数的大小从10位增加至23位(例如通过将13个零添加至最低有效位(LSB)位置的右侧)并且将阶码的大小从5位增加至8位(例如通过将3个零添加至最高有效位(MSB)位置的左侧)。转型功能电路250可以通过将112添加至半精度浮点阶码来调整阶码的偏移。

为了将浮点数从第一浮点精度转换成低于第一浮点精度的第二浮点精度(这有时也被称为下转换),转型功能电路250可以减小尾数的位数(例如通过舍入)、相应地调整阶码的偏移、以及减小阶码的位数。

如果需要的话,转型功能电路250可以包括特殊情况的转换(例如第一浮点精度数可以是非规格化的、零、无穷大、或非数字(NaN))。作为一个示例,非规格化的第一浮点精度数字可以被转换成零,这有时也被称为非规格化数为零(DAZ)。作为另一示例,在下转换中,可以将零、非规格化数或太大的阶码下溢转换成零,并且可以将无穷大或阶码溢出转换成无穷大。

专用处理块200中的可配置互连电路可以在输入端口271、273、275、277和279、输出端口280、链入端口262、链出端口263、乘法器电路201和202、加法器电路203和204、寄存器213、214、215、216、217、218、219、220、221、222和223、以及转型功能电路250之间路由信号。

如所示的,可配置互连电路可以包括复用器230、231、232和235,以及互连,其有时也被称为路由轨迹。该可配置互连电路可以被用来绕过专用处理块200的部件中的一些。例如,复用器231可以在转型功能电路250的输出和乘法器级205的输出之间选择,由此绕过寄存器218和219以及加法器电路203。类似地,复用器235可以在寄存器223的输出和加法器电路203的输出之间选择,由此实现绕过转型功能电路250、复用器231、寄存器221、加法器电路204和寄存器223的旁路路径。

如果需要的话,该可配置互连电路可以包括用来增加连接专用处理块200的不同部件的灵活性且允许附加旁路路径的附加复用器。例如,在寄存器218和219前面的附加复用器可以实现乘法器级205附近的旁路路径,寄存器(例如寄存器218、219、220等等)后面的附加复用器可以实现相应寄存器等等附近的旁路路径。

控制信号可以控制由复用器230、231、232和235执行的选择。该控制信号可以由动态控制相应复用器的选择的逻辑电路来生成和/或被存储在存储电路中。该逻辑电路和/或存储电路可以被定位在专用处理块200内部。如果需要的话,该逻辑电路和/或存储电路中的一些或所有可以被定位在专用处理块200的外部并且可以通过附加输入端口将控制信号提供给相应复用器。

可以为每个复用器单独地存储控制信号,或为多个复用器成组地存储控制信号。存储电路可以在专用处理块200的配置或再配置期间加载控制信号。在一些实施例中,存储电路可以是集成电路(例如图1的可编程集成电路100)的可编程存储器元件。

复用器230可以在将转型功能电路250以及寄存器220和223的输出路由至级联输出端263之间选择。复用器231可以在将乘法器级205、转型功能电路250以及寄存器220的输出路由至寄存器221之间选择。复用器232可以在将寄存器220的输出和来自级联输入端262的信号路由至寄存器222之间选择。复用器235可以在将转型功能电路250和寄存器223的输出路由至输出端口280之间选择。

在图2的逻辑表示中,专用处理块200可以以第一浮点精度实施定点加法、浮点加法、定点乘法、浮点乘法、两个乘法的求和,其中转型或不转型成第二浮点精度,并且后者跟随着以第二浮点精度进行的后续加法(如果需要的话)、等等。

考虑在其中专用处理块200在输入端口271、273、275、277和279处分别接收输入信号A、B、C、D和E以及在级联输入端262处接收链入信号CHAIN_IN的场景。进一步考虑输入信号A、B、C和D是对第一浮点精度(例如根据IEEE 754标准的半精度、单精度、双精度或四倍精度)的浮点数进行编码的信号,并且输入信号E和链入信号CHAIN_IN是对比第一浮点精度更高的精度的第二浮点精度(例如根据IEEE 754标准,如果第一浮点精度是半精度则是单精度,如果第一浮点精度是单精度则是双精度,如果第一浮点精度是双精度则是四倍精度,或如果第一浮点精度是四倍精度则是八倍精度)的浮点数进行编码的信号。

在该场景中,乘法器级205可以在乘法器电路201中计算A和B的积(即A*B)以及在乘法器电路202中计算C和D的积(即C*D)。积可以分别被存储在寄存器218和219中,如果需要的话。加法器电路203可以生成积的和数(即A*B+C*D)。

在一些实施例中,转型功能电路205可以将积的和数从第一浮点精度转换成第二浮点精度。例如,积的和数可以是半精度浮点数并且转型功能电路可以将积的和数转换成单精度浮点数。作为另一示例,积的和数可以是双精度浮点数并且转型功能电路250可以将积的和数转换成单精度浮点数。

可配置互连电路可以在复用器231中选择转型功能电路250的输出并且在复用器232中选择级联输入端262处的CHAIN_IN信号,由此将已转换的积的和数从转型功能电路250的输出端路由至加法器电路204并且将CHAIN_IN信号从级联输入端262路由至加法器电路204。

如果需要的话,加法器电路204可以将积的和数与CHAIN_IN信号相加以生成另一和数信号。可配置互连电路的复用器235可以在来自加法器电路203的积的和数与来自加法器电路204的其他和数信号之间选择。该可配置互连电路可以通过在复用器235中选择加法器电路203的输出端来将积的和数路由至输出端280。备选地,该可配置互连电路可以通过在复用器235中选择加法器电路204的输出端来将其他和数路由至输出端280。

在某些实施例中,专用处理块200可以实施附加特征。例如,专用处理块200可以包括从寄存器223的输出端至复用器231的附加输入端或至复用器232的附加输入端的路径,由此实现累加运算的实施,如果需要的话。

基于该可配置互连电路的配置,专用处理块200可以实施如上面描述的不同算术运算。图3是根据一些实施例的以级联链布置并且一起执行递归模式点积运算的第一级的两个说明性专用处理块300A和300B的图解。

如果需要的话,图2的专用处理块200可以实施专用处理块300A和300B中的每一个。在图3的逻辑表示中,省略专用处理块300A和300B的实施细节(诸如寄存器)和一些可编程路由特征(诸如复用器)以简化讨论。

如所示的,专用处理块300A和300B二者可以包括输入端371、372、375和377、输入端380、转型功能电路350、乘法器电路301和302、以及加法器电路303和304。级联连接可以将专用处理块300B的级联输出端耦合至专用处理块300A的级联输入端。

在一些实施例中,乘法器电路301和302以及加法器电路303可以对第一浮点精度的浮点数进行操作,加法器电路304可以对第二浮点精度的浮点数进行操作,并且转型功能电路350(其可以以与图2的转型功能电路250相似的方式操作)可以被耦合至加法器电路303的输出端以将加法器电路303的输出从第一浮点精度转换成第二浮点精度。

考虑在其中专用处理块300A和300B一起生成具有元组A、C、E和G的第一向量Y(即Y=(A,C,E,G)^T)与具有元组B、D、F和H的第二向量Z(即Z=(B,D,F,H)^T)的点积的场景。进一步考虑向量Y和Z的元组具有第一浮点精度(例如根据IEEE标准754,半精度、单精度、双精度或四倍精度)。

在该场景中,在输入端371、375、373和377处,分别地,专用处理块300A可以接收来自于向量Y和Z中的每一个的两个元组(例如,来自于向量Y的元组A和C以及来自于向量Z的元组B和D),并且专用处理块300B可以接收来自于向量Y和Z中的每一个的另两个元组(例如,来自于向量Y的元组E和G以及来自于向量Z的元组F和H)。

专用处理块300B的乘法器电路301和302、加法器电路303和转型功能电路350可以基于在输入端371、373、375和377处接收的向量Y和Z的元组的第一四进制化简来生成具有第二浮点精度的第一部分结果,该第二浮点精度具有比第一浮点精度更高的精度(例如根据IEEE标准754,单精度、双精度、四倍精度、八倍精度)。例如,在专用处理块300B中,乘法器电路301可以生成积E*F,乘法器电路302可以生成积G*H,并且加法器电路303可以生成积的和数E*F+G*H。专用处理块300B中的转型功能电路350可以如以上所概述的那样将积的和数E*F+G*H从第一浮点精度转换成第二浮点精度,由此生成第一部分结果。

类似地,专用处理块300A的乘法器电路301和302、加法器电路303和转型功能电路350可以基于在输入端371、373、375和377处接收的向量Y和Z的元组的第二四进制化简来生成具有第二浮点精度的第二部分结果。例如,在专用处理块300A中,乘法器电路301可以生成积A*B,乘法器电路302可以生成积C*D,并且加法器电路303可以生成积的和数A*B+C*D。专用处理块300A中的转型功能电路350可以如以上所概述的那样将积的和数A*B+C*D从第一浮点精度转换成第二浮点精度,由此生成第二部分结果。

专用处理块300A和300B中的可配置互连电路可以将第一部分结果从专用处理块300B中的转型功能电路350经由级联连接路由至第二专用处理块300A中的加法器电路304并且将第二部分结果从转型功能电路350路由至专用处理块300A中的加法器电路304。

专用处理块300A的加法器电路304可以通过执行第一和第二部分结果的二进制化简(即加法)来生成向量Y和Z的点积(即Y*Z = A*B+C*D+E*F+G*H)并且将该点积提供为在专用处理块300A的输出端380处的信号J。

图4是根据一些实施例的以级联链布置并且一起执行递归模式点积运算和累加运算的第一级的两个说明性专用处理块的图解。

如果需要的话,图2的专用处理块200可以实施专用处理块400A和400B中的每一个。在图4的逻辑表示中,省略专用处理块400A和400B的实施细节(诸如寄存器)和一些可编程路由特征(诸如复用器)以简化讨论。

如所示的,专用处理块400A和400B二者可以包括输入端471、473、475和477、输出端480、转型功能电路450、乘法器电路401和402、以及加法器电路403和404。专用处理块400B可以进一步包括输入端479和耦合在加法器电路404的输出端和输出端480之间的寄存器405以及加法器电路404的输入端。级联连接可以将专用处理块400B的级联输出端耦合至专用处理块400A的级联输入端。

专用处理块400A和400B可以一起实施在图3中描述的向量Y和Z的点积。如果需要的话,专用处理块400B可以另外实施在输入端479处接收的信号I的累加运算。例如,信号I可以对与信号A、B、C、D、E、F、G或H不同的浮点精度的浮点数编码。专用处理块400B的加法器电路404可以将存储在寄存器405中的信号(例如,重置时的零)与输入端479处接收的信号相加。寄存器405可以存储由加法器电路404生成的和数并且加法器电路404可以将所存储的和数与在输入端479处接收的信号相加,由此实施累加运算。

通过将图3的两个专用处理块300A和300B用作相邻专用处理块的构建块,可以构造用于生成两个向量的点积的递归树。图5是根据一些实施例的以级联链布置并且生成两个浮点数的向量的点积的六个说明性专用处理块的图解。

如果需要的话,图2的专用处理块200可以实施专用处理块500A、500B、500C、500D、500E和500F中的每一个。在图5的逻辑表示中,省略专用处理块500A、500B、500C、500D、500E和500F的实施细节(诸如寄存器)和一些可编程路由特征(诸如复用器)以简化讨论。

如所示的,专用处理块500A-500F(即500A、500B、500C、500D、500E和500F)中的每一个都可以包括输入端571、573、575和577、输出端580、转型功能电路550、乘法器电路501和502、以及加法器电路503和504。专用处理块500B、500C、500D和500E可以进一步包括输入端579。级联连接可以将专用处理块500F、500E、500D、500C和500B的级联输出端分别耦合至专用处理块500E、500D、500C、500B和500A的级联输入端。

考虑在其中专用处理块500A-500F一起实施具有元组A、C、E、G、I、K、M、O、Q、S、U、W的向量Y(即Y=(A,C,E,G,I,K,M,O,Q,S,U,W)^T)与具有元组B、D、F、H、J、L、N、P、R、T、V和X的向量Z(即Z=(B,D,F,H,J,L,N,P,R,T,V,X)^T)的点积的场景。进一步考虑向量Y和Z的元组具有第一浮点精度(例如根据IEEE标准754,半精度、单精度、双精度或四倍精度)。

在该场景中,专用处理块500A可以在输入端571、573、575和577处分别接收来自向量Y和Z中的每一个的两个元组(例如来自向量Y的元组A和C以及来自向量Z的元组B和D)。类似地,专用处理块500B-500F中的每一个都可以在输入端571、573、575和577处分别接收来自向量Y和Z中的每一个的两个元组(例如,500B接收来自向量Y的元组E和G并且接收来自向量Z的元组F和H,500C接收I、J、K和L,500D接收M、N、O、P,500E接收Q、R、S、T,并且500F接收U、V、W和X)。

每一对专用处理块都可以通过使用乘法器电路501和502、加法器电路503和转型功能电路550生成基于在输入端571、573、575和577处接收的向量Y和Z的元组的四进制化简的部分结果,之后是在当前专用处理块中生成的部分结果与在相邻专用处理块中生成的部分结果的二进制化简来如实施如在图3中所示的递归模式点积运算的第一级。

例如,专用处理块500B的乘法器电路501和502、加法器电路503和转型功能电路550可以生成从第一浮点精度转换成如以上概述的具有更高浮点精度的第二浮点精度的积的和数E*F+G*H,由此生成一个部分结果。类似地,专用处理块500A的乘法器电路501和502、加法器电路503和转型功能电路550可以生成从第一浮点精度转换成第二浮点精度的积的和数A*B+C*D,由此生成另一个部分结果。

专用处理块500A和500B中的可配置互连电路可以将两个部分结果路由至专用处理块500A中的加法器电路504。

专用处理块500A的加法器电路504可以通过执行两个部分结果(即A*B+C*D和E*F+G*H)的二进制化简(即加法)来生成向量Y和Z的点积的第一级结果(即A*B+C*D+E*F+G*H)并且在专用处理块500的输出端580处提供该点积的第一级结果。类似地,专用处理块500C和500D可以生成第一级结果I*J+K*L+M*N+O*P且专用处理块500E和500F可以生成第一级结果Q*R+S*T+U*V+W*X。

通过使用相邻专用处理块的构建块(即500A和500B、500C和500D和500E和500F),可以构造递归树。例如,可以经由专用处理块500A-500F外部的路由资源(例如使用图1的可编程集成电路100的垂直互连资源140和水平互连资源150)来将向量Y和Z的点积的第一级结果(即专用处理块500A、500C和500E的输出)分别路由至专用处理块500B、500C和500E的输入端579。

如所示的,专用处理块500B和500C中的可配置互连电路可以经由级联连接将第一级结果I*J+K*L+M*N+O*P从专用处理块500C的输入端579路由至专用处理块500B的加法器电路504,并且将第一级结果A*B+C*D+E*F+G*H从输入端579路由至专用处理块500B的加法器电路504。专用处理块500B可以使用加法器504来生成第二级结果(即A*B+C*D+E*F+G*H+I*J+K*L+M*N+O*P)并且在输出端580处提供第二级结果。

可以经由在专用处理块500A-500F外部的路由资源将该第二级结果路由至专用处理块500D的输入端579,并且从那里路由至专用处理块500D的加法器504。专用处理块500D和500D中的可配置互连电路可以经由级联连接将第一级结果Q*R+S*T+U*V+W*X从专用处理块500E的输入端579路由至专用处理块500D的加法器电路504。专用处理块500D可以使用加法器504来在第三级中生成最终点积结果(即A*B+C*D+E*F+G*H+I*J+K*L+M*N+O*P+Q*R+S*T+U*V+W*X)并且在输出端580处提供最终点积。

如果需要的话,可以在图5中描述的递归树的任何层级处执行寄存器流水线操作(例如以简化路由和/或提高速度)。由于在第一级后面的后续级加法器(即专用处理块500B和500D的加法器504)完全独立于第一级加法器(并且彼此完全独立),所以可以将后续级加法器放置在专用处理块500B、500D或500F中的在其中加法器504在点积计算的第一级中未被使用的任一个中。例如在其中可能存在更长的从级到级长度的后面的级中,这可以是有用的。

可以省略专用处理块500F的加法器电路504,因为每个向量中具有N个元组的两个向量的点积需要N个乘法器电路和(N-1)个加法器电路。备选地,为了其他目的可以独立地使用第N个加法器电路504。

图6是根据一些实施例的以级联链布置并且执行两个浮点数向量的递归模式点积以及结果的累加的四个说明性专用处理块600A-600D(即600A、600B、600C和600D)的图解。

如果需要的话,图2的专用处理块200可以实施专用处理块600A-600D中的每一个。在图6的逻辑表示中,省略专用处理块600A和600D的实施细节(诸如寄存器)和一些可编程路由特征(诸如复用器)以简化讨论。

如所示的,专用处理块600A-600D中的每一个都可以包括输入端671、673、675和677、输出端680、转型功能电路650、乘法器电路601和602、以及加法器电路603和604。专用处理块600B、600C和600D可以进一步包括输入端679,并且专用处理块600D可以包括可用加法器电路604实施累加器的寄存器605。级联连接可以将专用处理块600D、600C和600B的级联输出端分别耦合至专用处理块600C、600B和600A的级联输入端。

作为一个示例,专用处理块600A-600D可以实施在图5中示出的递归点积生成的前面两个级。换言之,专用处理块600A-600D可以生成具有元组A、C、E、G、I、K、M和O的向量Y(即Y=(A,C,E,G,I,K,M,O)^T)与具有元组B、D、F、H、J、L、N和P的向量Z(即Z=(B,D,F,H,J,L,N,P)^T)的点积Y*Z = A*B+C*D+E*F+G*H+I*J+K*L+M*N+O*P,并在专用处理块600B的输出端680处提供点积。

如果需要的话,可以经由在专用处理块600A-600D外部的路由资源将点积路由至专用处理块600D的输入端679,并且将点积从那里路由至专用处理块600D的加法器604。专用处理块600D的加法器电路604可以将存储在寄存器605中的信号(例如,重置时的零)与在输入端679处接收的信号相加。寄存器605可以存储由加法器电路604生成的和数并且加法器电路604可以将所存储的和数与在输入端679处接收的信号相加,由此实施点积的累加运算。

图7是根据一些实施例的示出用于操作生成第一和第二向量的点积的集成电路的说明性操作的流程图的图解。

在操作710期间,集成电路可以利用第一专用处理块来生成第一浮点精度的第一部分结果。作为一个示例,诸如图1的可编程集成电路100的集成电路可以包括图3的专用处理块300A和300B;并且专用处理块300B可以生成积的和数E*F+G*H作为具有第一浮点精度(例如单精度浮点数格式)的第一部分结果。

在操作720期间,该集成电路可以在第一专用处理块的级联输出端处提供第一部分结果。例如,图3的专用处理块300B可以在级联输出端处提供第一部分结果(即积的和数E*F+G*H)。

在操作730期间,该集成电路可以经由级联连接在第二专用处理块的级联输入端处接收来自第一专用处理块的级联输出端的第一部分结果。例如,图3的专用处理块300A可以经由级联连接在级联输入端处接收来自专用处理块300B的积的和数E*F+G*H。

在操作740期间,该集成电路可以基于在第二专用处理块中来自第一和第二向量中的每一个的具有第二浮点精度的两个元组的四进制化简来生成具有第一浮点精度的第二部分结果。例如,图3的专用处理块300A可以接收来自向量Y的元组A和C以及来自向量Z的元组B和D。如果需要的话,元组A、B、C和D可以具有第二浮点精度(例如半精度浮点数格式)。专用处理块300A可以使用乘法器电路301和302和加法器电路303,之后是在转型功能电路350中的到第一浮点精度的转换,以生成积的和数A*B+C*D作为具有第一浮点精度(例如单精度浮点数格式)的第二部分结果。

在操作750期间,该集成电路可以通过在第二专用处理块中执行第一和第二部分结果的二进制化简来生成点积。例如图3的专用处理块300A中的加法器电路304可以通过将第一部分积(即E*F+G*H)和第一部分积(即A*B+C*D)相加来生成点积,由此生成具有元组A、C、E和G的向量Y和具有元组B、D、F和H的向量Z的点积。

机器可读介质可以根据一些实施例在集成电路上编码用于实行方法的指令(例如如由图7的方法描述的用于配置集成电路以生成第一和第二向量的点积的指令)。适当的计算机或类似设备可以执行这些指令,由此在集成电路中实施方法。例如,个人计算机可以被装配有接口(可以将集成电路连接至该接口),并且在个人计算机的帮助下适当的软件工具和/或用户可以通过该接口将方法编程到集成电路中。

在一些实施例中,可以通过编码在相同或附加机器可读介质上的其他指令来生成用于实行该方法的指令。换言之,在计算机或类似设备上执行的第一指令集(例如C语言编译器或电子设计自动化(EDA)工具)可以生成第二指令集(例如用于编程可配置电路的汇编代码或一系列位),由此第二指令集包括在集成电路(例如微处理器或可编程集成电路设备(诸如图1的可编程集成电路100))上执行的方法。

机器可读介质可以包括允许指令的存储的任何类型的设备或技术,其包括半导体存储器(其可以是易失性的(例如动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、等等)或非易失性的(例如可编程只读存储器(PROM)、闪速存储器等等))、磁性存储设备、光学存储设备或其组合。

图8表示可以利用机器可执行程序编码的磁性数据存储介质800的横截面,该机器可执行程序可以由诸如前面提到的个人计算机或其他计算机或类似设备之类的系统来实行。介质800可以是软磁盘或硬盘或磁带,其具有适当衬底810(该衬底810可以是常规的)以及在一侧或两侧上的包含磁畴的适当涂层820(该涂层820可以是常规的),该磁畴的极化或定向可通过磁的方式来改变。除了在介质800是磁带的情况下之外,介质800还可以具有用于接收磁盘驱动器或其他数据存储设备的主轴的开口。

介质800的涂层820的磁畴可以被极化或定向以便以可以是常规的方式来编码机器可执行程序,以便由具有插座或外围附件的编程系统(诸如个人计算机或其他计算机或类似系统)来执行,可以将要被配置的集成电路插入到该插座或外围附件中以达到根据一些实施例来配置集成电路的适当部分(包括其专用处理块,如果有的话)的目的。

图9示出光学可读数据存储介质900的横截面,所述光学可读数据存储介质900可利用要由系统(诸如前面提到的个人计算机或其他计算机或类似设备)实行的前面提到的机器可执行程序编码。介质900可以是蓝光光盘(BD)、常规压缩盘(CD)只读存储器(ROM)、或数字多功能盘(DVD,有时也被称为数字视频盘)只读存储器(ROM)、或任何可重写介质(诸如CD R、CD RW、DVD R、DVD RW、DVD+R、DVD+RW或DVD-RAM)或光学可读且磁光可重写的磁光盘。介质900可以具有适当的衬底910和通常在衬底910的一侧或两侧上的适当涂层920。

在如所公知的基于CD或基于DVD的介质的情况下,涂层920是反射的并且利用布置在一个或多个层上的多个凹陷930来压印以对机器可执行程序编码。通过使激光从涂层920的表面反射掉来读取凹陷的布置。可以在涂层920的顶部上提供保护性涂层940。

在如所公知的磁光盘的情况下,涂层920不具有凹陷930,但是具有多个磁畴,当例如通过激光器将磁畴加热到某一温度以上时其极化或定向可以可通过磁的方式来改变。可以通过测量从涂层920反射的激光的极化来读取畴的定向。如以上描述的那样,畴的布置可以对程序编码。

可以将本文中描述的方法和装置合并到任何适当电路或电路的系统中。例如,可以将该方法和装置合并到诸如微处理器或其他集成电路之类的许多类型的设备中。示例性集成电路包括可编程阵列逻辑(PAL)、可编程逻辑阵列(PLA)、现场可编程逻辑阵列(FPGA)、电可编程逻辑设备(EPLD)、电可擦除可编程逻辑设备(EEPLD)、逻辑单元阵列(LCA)、现场可编程门阵列(FPGA)、粗粒度可重构结构(CGRA)、数字信号处理(DSP)电路、专用标准产品(ASSP)、专用集成电路(ASIC),仅举几个例子。

本文中描述的集成电路可以是数据处理系统的一部分,其包括以下部件中的一个或多个:处理器;存储器;I/O电路和外围设备。可以在各种各样的应用中使用数据处理系统,该应用诸如计算机联网、数据联网、仪表化、视频处理、数字信号处理或其中使用高效地执行混合精度浮点算术运算的电路的优点是期望的任何适当的其他应用。

该集成电路可以被配置成执行各种各样的不同逻辑功能。例如,该集成电路可以被配置为与系统处理器合作地工作的处理器或控制器。该集成电路还可以被用作用于仲裁对数据处理系统中的共享资源的访问的仲裁器。在又一示例中,该集成电路可以被配置为在处理器与系统中的其他部件中的一个之间的接口。在一个实施例中,该集成电路可以是受让人所拥有的设备族中的一个。

尽管以特定顺序描述了方法操作,但是应该理解的是,可以在描述的操作中间执行其他操作,可以调整描述的操作以使得它们在稍稍不同的时间发生或者可以将描述的操作分布在允许在与处理相关联的各个间隔发生处理操作的系统中。

前述内容仅仅说明实施例的原理,并且本领域技术人员可以在不脱离本文中公开的实施例的范围和精神的情况下做出各种修改。可以单独或以任何组合来实施前述实施例。

下面的示例关于另外的实施例。

示例1是一种集成电路,其生成第一和第二向量的点积,并且包括:第一专用处理块,其提供第一浮点精度的第一部分结果;以及第二专用处理块,其经由级联连接从第一专用处理块接收第一部分结果并且包括:第一浮点算术运算符电路,其基于来自第一和第二向量中的每一个的具有第二浮点精度的两个元组的四进制化简来生成具有第一浮点精度的第二部分结果;以及第二浮点算术运算符电路,其通过执行第一和第二部分结果的二进制化简来生成点积。

示例2包括示例1的主题,其中该第一浮点算术运算符电路进一步包括:第一乘法器电路,其基于来自第一向量的两个元组的第一元组和来自第二向量的两个元组的第一元组来生成第一积,其中该第一积具有第二浮点精度;以及第二乘法器电路,其基于来自第一向量的两个元组的第二元组和来自第二向量的两个元组的第二元组来生成第二积,其中该第二积具有第二浮点精度。

示例3包括示例2的主题,其中该第一浮点算术运算符电路进一步包括生成第一积和第二积的和数的加法器电路,其中该和数具有第二浮点精度。

示例4包括示例3的主题,其中该第一浮点算术运算符电路进一步包括转型功能电路,其从加法器电路接收和数并且通过将该和数从第二浮点精度转换成第一浮点精度来生成第二部分结果。

示例5包括示例4的主题,其中该转型功能电路将该和数的阶码大小从第二浮点精度增加至第一浮点精度。

示例6包括示例4或5中的任一个的主题,其中该转型功能电路将该和数的阶码的偏移从第二浮点精度的偏移调整至第二浮点精度的偏移。

示例7包括示例4至6中的任一个的主题,其中该第二专用处理块进一步包括耦合至第二浮点算术运算符电路的输出端口,以及在加法器电路和输出端口之间的旁路路径,其中该旁路路径绕过转型功能电路和第二浮点算术运算符电路。

示例8包括示例1-7中的任一个的主题,其中该第二浮点算术运算符电路进一步包括加法器电路,其通过将第一和第二部分结果相加来生成点积。

示例9是一种用于操作生成第一和第二向量的点积的集成电路的方法,其包括用第一专用处理块生成第一浮点精度的第一部分结果;在第一专用处理块的级联输出端处提供第一部分结果;经由级联连接在第二专用处理块的级联输入端处接收来自第一专用处理块的级联输出端的第一部分结果;基于在第二专用处理块中来自第一和第二向量中的每一个的具有第二浮点精度的两个元组的四进制化简来生成具有第一浮点精度的第二部分结果;以及通过在第二专用处理块中执行第一和第二部分结果的二进制化简来生成点积。

示例10包括示例9的主题,其中生成第二部分结果进一步包括:使用第一乘法器电路来基于来自第一向量的两个元组的第一元组和来自第二向量的两个元组的第一元组来生成第一积,其中该第一积具有第二浮点精度;以及使用第二乘法器电路来基于来自第一向量的两个元组的第二元组和来自第二向量的两个元组的第二元组来生成第二积,其中该第二积具有第二浮点精度。

示例11包括示例10的主题,进一步包括使用加法器电路来生成第一积和第二积的和数,其中该和数具有第二浮点精度。

示例12包括示例11的主题,进一步包括使用转型功能电路,其从加法器电路接收和数并且通过将该和数从第二浮点精度转换成第一浮点精度来生成第二部分结果。

示例13包括示例12的主题,进一步包括利用转型功能电路,将该和数的阶码大小从第二浮点精度增加至第一浮点精度。

示例14包括示例12或13中的任一个的主题,进一步包括利用转型功能电路,将该和数的阶码的偏移从第二浮点精度的偏移调整至第二浮点精度的偏移。

示例15包括示例12至14中的任一个的主题,进一步包括在将加法器电路耦合至第二专用处理块的输出端口的旁路路径上绕过转型功能电路。

示例16是一种利用用于将集成电路设备配置成生成第一和第二向量的点积的指令来编码的非瞬时性机器可读存储介质,其中该集成电路设备包括通过级联连接耦合的第一和第二专用处理块,其中该第一和第二专用处理块中的每一个都包括第一和第二浮点算术运算符电路和可配置互连电路,该指令包括:用来将第一专用处理块中的第一浮点算术运算符电路配置成基于来自第一和第二向量中的每一个的具有第二浮点精度的第一两个元组的第一四进制化简来生成具有第一浮点精度的第一部分结果的指令;用来将第一和第二专用处理块中的可配置互连电路配置成经由级联连接将第一部分结果从第一专用处理块中的第一浮点算术运算符电路路由至第二专用处理块中的第二算术运算符电路的指令;用来将第二专用处理块中的第一浮点算术运算符电路配置成基于来自第一和第二向量中的每一个的具有第二浮点精度的第二两个元组的第二四进制化简来生成具有第一浮点精度的第二部分结果的指令,以及用来将第二专用处理块中的第二浮点算术运算符电路配置成通过执行第一和第二部分结果的二进制化简来生成点积的指令。

示例17包括示例16的主题,进一步包括用来生成示例16的指令的指令。

示例18包括示例16或17的任一个的主题,其中用来配置第一专用处理块中的第一浮点算术运算符电路的指令进一步包括:用来将第一乘法器电路配置成基于来自第一向量的第一两个元组的第一元组和来自第二向量的第一两个元组的第一元组生成第一积的指令,其中该第一积具有第二浮点精度;以及用来将第二乘法器电路配置成基于来自第一向量的第一两个元组的第二元组和来自第二向量的第一两个元组的第二元组生成第二积的指令,其中该第二积具有第二浮点精度。

示例19包括示例18的主题,其中用来配置第一专用处理块中的第一浮点算术运算符电路的指令进一步包括用来将加法器电路配置成生成第一积和第二积的和数的指令,其中该和数具有第二浮点精度。

示例20包括示例19的主题,其中用来配置第一专用处理块中的第一浮点算术运算符电路的指令进一步包括用来将转型功能电路配置成通过将该和数从第二浮点精度转换成第一浮点精度来生成第二部分结果的指令。

示例21包括示例20的主题,进一步包括用来将该和数的阶码大小从第二浮点精度增加至第一浮点精度的指令。

示例22包括示例20或21中的任一个的主题,进一步包括用来将该和数的阶码的偏移从第二浮点精度的偏移调整至第一浮点精度的偏移的指令。

示例23包括示例19的主题,其中用来将第二专用处理块中的第二浮点算术运算符电路配置成通过执行第一和第二部分结果的二进制化简来生成点积的指令进一步包括用来将第一和第二部分结果相加的指令。

示例24是一种用于生成第一和第二向量的点积的集成电路,其包括第一专用处理块,其用于提供第一浮点精度的第一部分结果;和第二专用处理块,其经由级联连接从第一专用处理块接收第一部分结果,并且包括用于基于来自第一和第二向量中的每一个的具有第二浮点精度的两个元组的四进制化简来生成具有第一浮点精度的第二部分结果的第一装置,和用于通过执行第一和第二部分结果的二进制化简来生成点积的第二装置。

示例25包括示例24的主题,进一步包括用于存储第一向量的至少一个元组的存储电路。

示例26包括示例25的主题,其中该存储电路是从由以下各项组成的组中选择的:先进先出电路、后进先出电路、串入并出移位寄存器电路、随机存取存储器电路、只读存储器电路、内容可寻址存储器电路和寄存器文件。

示例27包括示例24或25中的任一个的主题,进一步包括可配置互连电路,其包括用于将第一和第二向量路由至第一和第二专用处理块的互连资源。

示例28包括示例27的主题,其中在第一和第二专用处理块外部的互连资源进一步包括垂直互连资源和水平互连资源。

示例29包括示例28的主题,进一步包括多个导电线。

示例30包括示例29的主题,进一步包括在多个导电线的第一导电线和多个导电线的第二导电线之间的可编程连接。

示例31包括示例28-30中的任一个的主题,其中垂直和水平互连资源在集成电路上路由信号。

示例32包括示例27的主题,其中该可配置互连电路进一步包括多个复用器。

示例33包括示例32的主题,进一步包括所述多个复用器中的在转型功能电路的第一输出端和乘法器级的第二输出端之间选择的复用器。

示例34包括示例24、25或27中的任一个的主题,进一步包括可编程逻辑区。

示例35包括示例34的主题,其中该可编程逻辑区进一步包括在由逻辑阵列块和可配置逻辑块组成的组之中选择的多个逻辑块。

示例36包括示例35的主题,其中该多个逻辑块的至少一个逻辑块进一步包括多个逻辑块部件。

示例37包括示例36的主题,其中从由查找表电路、寄存器、切片、附加加法器和移位寄存器组成的组中选择多个逻辑块部件的至少一个逻辑块部件。

为了说明而非限制的目的呈现了以上描述的实施例,并且本发明仅由所附权利要求来限制。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1