应用于加速板卡的数据调度方法、装置及加速板卡和介质与流程

文档序号:23418278发布日期:2020-12-25 11:39阅读:96来源:国知局
应用于加速板卡的数据调度方法、装置及加速板卡和介质与流程

本申请涉及计算机技术领域,更具体地说,涉及一种应用于加速板卡的数据调度方法、装置及一种加速板卡和一种计算机可读存储介质。



背景技术:

随着大数据、ai(artificialintelligence,人工智能)、5g等新兴产业的迅速发展,各式应用场景层出不穷,计算机系统当中的通用cpu处理压力持续增大,再加上通用cpu(centralprocessingunit,中央处理器)对一些计算任务的执行效率不高,这都不断地提高了计算机系统中cpu的占用率,cpu处理能力的瓶颈最终会限制计算机系统整体性能的提升与扩展。

基于此,工业界出现了各种各样的硬件加速板卡,这些板卡可以通过pcie(peripheralcomponentinterconnectexpress,外设高速互联)等通用高速数据接口接驳于计算机系统的主机主板之上,用于承载原来由cpu负责执行的某种/多种计算任务。

传统的主机和加速板卡之间的数据链路如下图1所示,共分为四个步骤:数据从主机ddr(doubledatarate,双倍速率)通过pcie总线拷贝到加速板卡的本地ddr,加速板卡上的数据处理单元从本地ddr内顺序读取数据并进行处理,数据处理单元不断将处理后的结果数据写回到本地ddr,在结果数据累积到一定大小后,将被本地ddr搬移至主机ddr,从而完成一次数据处理回路。由于本地ddr可以提供可观的数据缓冲空间,上述方案可以一次搬送比较大的数据块,以降低每次启动pcie所需要的固有时延对整体数据带宽的影响,最大化的利用pcie总线的带宽。然而,此方案对本地ddr的带宽有着更高的要求。在数据流动起来之后,同一个数据块要两入两出本地ddr,若不考虑数据块在处理前后大小上可能的变化,其带宽的需求上限是pcie设计带宽的两倍。例如,在理论pcie带宽32gb(pciegen4x16)的情况下,对应的,本地ddr需要支持实现64gb的理论带宽,这对系统架构设计和物理实现都十分具有挑战

因此,如何解决上述问题是本领域技术人员需要重点关注的。



技术实现要素:

本申请的目的在于提供一种应用于加速板卡的数据调度方法、装置及一种加速板卡和一种计算机可读存储介质,降低了加速板卡的系统复杂度和硬件成本,同时打破了板卡上本地ddr的带宽需求瓶颈。

为实现上述目的,本申请提供了一种应用于加速板卡的数据调度方法,所述加速板卡与主机通过pcie总线进行数据传输,所述方法包括:

对输入缓冲器的可用容量进行监测,若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割;

将分割后的子数据块拷贝至所述输入缓冲器,所述输入缓冲器通过同步时钟接口连接数据处理单元,以便所述数据处理单元依次读取所述输入缓冲器的数据并进行处理;

当所述数据处理单元得到处理结果后,将所述处理结果填充至输出缓冲器中,所述数据处理单元与所述输出缓冲器通过同步时钟接口进行连接;

对所述输出缓冲器的已用容量进行监测,若所述已用容量达到第二阈值,则通过pciedma将所述处理结果回填至所述主机ddr内的指定区域。

可选的,所述对输入缓冲器的可用容量进行监测,包括:

通过第一填充计数器确定所述输入缓冲器内的现存数据大小;其中,所述第一填充计数器的数值根据一次写入所述输入缓冲器的数据量和每个时钟周期所述数据处理单元的读取数据量进行确定;

结合所述输入缓冲器的总容量、处于pcie总线传输链路的待写入数据大小和所述现存数据大小,确定所述输入缓冲器的可用容量。

可选的,所述对所述输出缓冲器的已用容量进行监测,包括:

通过第二填充计数器确定所述输出缓冲器的已用容量;其中,所述第二填充计数器的数值根据一次从所述输出缓冲器迁出的数据量和每个时钟周期所述数据处理单元的填充数据量进行确定。

可选的,所述第一阈值和所述第二阈值均为预设调度颗粒度。

可选的,所述若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割,包括:

若监测到所述可用容量大于或等于所述预设调度颗粒度的大小时,则触发数据写入操作,以根据所述预设调度颗粒度、数据传输物理地址对pciedma进行配置,以利用pciedma对主机ddr内的目标数据进行分割。

可选的,还包括:

在每次将所述处理结果回填至所述主机ddr内的指定区域之后,根据当次数据调度过程中所述输入缓冲器和/或所述输出缓冲器的实时填充深度,对所述预设调度颗粒度进行修正,得到更新后调度颗粒度;

在对输入缓冲器的可用容量进行监测之前,查询所述更新后调度颗粒度,以根据所述更新后调度颗粒度进行下次数据调度。

为实现上述目的,本申请提供了一种应用于加速板卡的数据调度装置,包括:

容量监测单元,用于对输入缓冲器的可用容量进行监测,若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割;

数据拷贝单元,用于将分割后的子数据块拷贝至所述输入缓冲器,所述输入缓冲器通过同步时钟接口连接数据处理单元,以便所述数据处理单元依次读取所述输入缓冲器的数据并进行处理;

数据填充单元,用于当所述数据处理单元得到处理结果后,将所述处理结果填充至输出缓冲器中,所述数据处理单元与所述输出缓冲器通过同步时钟接口进行连接;

数据回填单元,用于对所述输出缓冲器的已用容量进行监测,若所述已用容量达到第二阈值,则通过pciedma将所述处理结果回填至所述主机ddr内的指定区域。

可选的,所述容量监测单元,包括:

现存数据确定子单元,用于通过第一填充计数器确定所述输入缓冲器内的现存数据大小;其中,所述第一填充计数器的数值根据一次写入所述输入缓冲器的数据量和每个时钟周期所述数据处理单元的读取数据量进行确定;

可用容量确定子单元,用于确定结合所述输入缓冲器的总容量、处于pcie总线传输链路的待写入数据大小和所述现存数据大小,确定所述输入缓冲器的可用容量。

为实现上述目的,本申请提供了一种加速板卡,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序时实现前述公开的任一种应用于加速板卡的数据调度方法的步骤。

为实现上述目的,本申请提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现前述公开的任一种应用于加速板卡的数据调度方法的步骤。

通过以上方案可知,本申请提供的一种应用于加速板卡的数据调度方法,所述加速板卡与主机通过pcie总线进行数据传输,所述方法包括:对输入缓冲器的可用容量进行监测,若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割;将分割后的子数据块拷贝至所述输入缓冲器,所述输入缓冲器通过同步时钟接口连接数据处理单元,以便所述数据处理单元依次读取所述输入缓冲器的数据并进行处理;当所述数据处理单元得到处理结果后,将所述处理结果填充至输出缓冲器中,所述数据处理单元与所述输出缓冲器通过同步时钟接口进行连接;对所述输出缓冲器的已用容量进行监测,若所述已用容量达到第二阈值,则通过pciedma将所述处理结果回填至所述主机ddr内的指定区域。由上可知,本申请利用片载的输入缓冲器和输出缓冲器替代了加速板卡的本地ddr缓存,在移除本地ddr之后可以降低加速板卡的系统复杂度和硬件成本,同时打破了板卡上本地ddr的带宽需求瓶颈,可以充分释放pcie的带宽性能。

本申请还公开了一种应用于加速板卡的数据调度装置及一种加速板卡和一种计算机可读存储介质,同样能实现上述技术效果。

应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本申请。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例公开的一种应用于加速板卡的数据调度方法的流程图;

图2为本申请实施例公开的应用于加速板卡的数据调度方法所适应的具体硬件架构图;

图3为本申请实施例公开的输入缓冲器中填充计数器的结构图;

图4为本申请实施例公开的输出缓冲器中填充计数器的结构图;

图5为本申请实施例公开的调度颗粒度更新模块的电路实现示意图;

图6为本申请实施例公开的一种应用于加速板卡的数据调度装置的结构图;

图7为本申请实施例公开的一种加速板卡的结构图;

图8为本申请实施例公开的另一种加速板卡的结构图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请实施例公开了一种应用于加速板卡的数据调度方法,降低了加速板卡的系统复杂度和硬件成本,同时打破了板卡上本地ddr的带宽需求瓶颈。

参见图1所示,本申请实施例公开的一种应用于加速板卡的数据调度方法包括:

s101:对输入缓冲器的可用容量进行监测,若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割;

本申请实施例中,加速板卡上预设有输入缓冲器,可以对其的可用容量进行监测。若输入缓冲器的可用容量达到第一阈值,则可利用pciedma(directmemoryaccess,直接存储器访问)对主机ddr内的目标数据进行分割。

具体地,本申请实施例可以通过第一填充计数器确定所述输入缓冲器内的现存数据大小;其中,第一填充计数器的数值根据一次写入输入缓冲器的数据量和每个时钟周期数据处理单元的读取数据量进行确定;结合输入缓冲器的总容量、处于pcie总线传输链路的待写入数据大小和现存数据大小,确定输入缓冲器的可用容量。由上可知,本申请实施例在确定输入缓冲器的可用容量时,可以不仅仅确定其现存数据大小,还进一步获取处于pcie总线传输链路的待写入数据大小,也即,先确定输入缓冲器的已用容量,包括刚刚被调度,还在链路上的传输而未进入输入缓冲器的数据,而不是当前缓冲器中实时填充的数值。如果依据实时填充数值进行调度请求,有一定的风险造成输入缓冲器满,但还有数据在链路上传输准备进入输入缓冲器的情况,从而可能反压内部数据总线接口,锁死pcie总线,降低系统的整体的数据吞吐率性能。

可以理解的是,若监测到可用容量大于或等于预设调度颗粒度的大小时,则触发数据写入操作,以根据预设调度颗粒度、数据传输物理地址对pciedma进行配置,以利用pciedma对主机ddr内的目标数据进行分割。由于输入缓冲器的存储容量较小,需要将数据分割后写入输入缓冲器中。

s102:将分割后的子数据块拷贝至所述输入缓冲器,所述输入缓冲器通过同步时钟接口连接数据处理单元,以便所述数据处理单元依次读取所述输入缓冲器的数据并进行处理;

本步骤中,可以将上述步骤分割后的子数据块拷贝至输入缓冲器。其中,输入缓冲器与加速板卡本地的数据处理单元通过同步时钟接口进行连接,由此在输入缓冲器获取到子数据块后,数据处理单元即可读取其中的数据进行相应的处理过程。

s103:当所述数据处理单元得到处理结果后,将所述处理结果填充至输出缓冲器中,所述数据处理单元与所述输出缓冲器通过同步时钟接口进行连接;

可以理解的是,当数据处理单元对读取到的数据进行处理得到对应的处理结果之后,可以将处理结果填充至本地的输出缓冲器中。其中,输出缓冲器与数据处理单元同样通过同步时钟接口进行连接,以便及时将数据处理单元的处理结果填充至输出缓冲器。

s104:对所述输出缓冲器的已用容量进行监测,若所述已用容量达到第二阈值,则通过pciedma将所述处理结果回填至所述主机ddr内的指定区域。

本步骤中,将对输出缓冲器的已用容量进行监测。具体地,可以通过第二填充计数器确定输出缓冲器的已用容量;其中,所述第二填充计数器的数值根据一次从输出缓冲器迁出的数据量和每个时钟周期数据处理单元的填充数据量进行确定。

若输出缓冲器的已用容量达到第二阈值,则可通过pciedma将处理结果回填至主机ddr内的指定区域中。

需要说明的是,上述第一阈值和第二阈值在具体实施过程中可根据实际情况进行灵活设定。本申请实施例中,可将第一阈值和第二阈值均设置为预设调度颗粒度,预设调度颗粒度具体指每次搬迁的数据大小,同样可以根据实际情况进行设定。

通过以上方案可知,本申请提供的一种应用于加速板卡的数据调度方法,所述加速板卡与主机通过pcie总线进行数据传输,所述方法包括:对输入缓冲器的可用容量进行监测,若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割;将分割后的子数据块拷贝至所述输入缓冲器,所述输入缓冲器通过同步时钟接口连接数据处理单元,以便所述数据处理单元依次读取所述输入缓冲器的数据并进行处理;当所述数据处理单元得到处理结果后,将所述处理结果填充至输出缓冲器中,所述数据处理单元与所述输出缓冲器通过同步时钟接口进行连接;对所述输出缓冲器的已用容量进行监测,若所述已用容量达到第二阈值,则通过pciedma将所述处理结果回填至所述主机ddr内的指定区域。由上可知,本申请利用片载的输入缓冲器和输出缓冲器替代了加速板卡的本地ddr缓存,在移除本地ddr之后可以降低加速板卡的系统复杂度和硬件成本,同时打破了板卡上本地ddr的带宽需求瓶颈,可以充分释放pcie的带宽性能。

下面通过一种具体的示例对本申请实施例公开的应用于加速板卡的数据调度方法进行详细的说明。参见图2所示,加速板卡中除了输入缓冲器和输出缓冲器、数据处理单元之外,还包括pcie总线接口各相关模块:物理接口,控制器以及dma,以及输入/输出调度模块。

具体地,输入调度模块可持续监视当前输入缓冲器的可用容量,并通过配置板卡侧pciedma将主机侧ddr内一个大的目标数据块顺序分割成若干颗粒度更细的子数据块,不间断地拷贝至加速板卡上的输入缓冲器中。片上的输入缓冲器可采用类似fifo(firstinputfirstoutput,先入先出)的机制,通过一个同步时钟接口对接数据处理单元,数据处理单元依次读取数据进行处理,其中,输入缓冲器理想的状态是常满。片上的输出缓冲器可采用类似fifo的先入先出机制,通过一个同步时钟接口对接数据处理单元,数据处理单元将结果数据填充至输出缓冲器,其中,输出缓冲器理想的状态是常空。输出调度模块可持续监视当前输出缓冲器的填充情况,在累积到一定大小后,通过配置板卡侧pciedma将该数据块回填回主机侧预先在主机ddr中开辟好的结果空间内。

其中,输入调度模块中可以主要包括调度控制模块和调度触发模块。调度控制模块主要用于在收到调度触发请求后,依据调度颗粒度的设定,计算并准备数据的物理地址,长度等信息,通过配置dma进行数据的搬移操作。具体地,调度控制模块的实现形式可以是通用mcu(microcontrollerunit,微控制单元)上的软件程序,或者是基于硬件电路的fsm(finitestatemachine,有限状态机)。

调度触发模块主要用于实施统计输入/输出缓冲当中的数据填充数量,包括已经触发调度,但还在pcie总线传输链路上的数据,并且将填充数量和设定的搬移颗粒度进行比较,当满足触发条件后,触发调度控制模块进行数据搬移操作。

具体来说,针对输入缓冲器,如图3所示,输入调度触发模块可以主要维护一个填充计数器。在输入缓冲器的出口,即数据处理单元侧,会实时反馈数据在每个时钟周期的消耗数量,从而冲填充计数器当中减去相应数值;而在输入缓冲器入口,每次调度触发操作后,调度控制模块将反馈所调入的数据块的大小,并计入填充计数器值。调度触发模块会不间断的比较空余出来的空间和调度颗粒度设置大小,如果超过颗粒度设置,则产生一个电平/脉冲的触发信号给调度控制模块,进行数据搬移操作。与之类似的,输出缓冲器对应的调度触发模块中同样也维持着一个填充计数器,具体结构可如图4所示。

在上述实施例的基础上,本申请实施例在每次将处理结果回填至主机ddr内的指定区域之后,根据当次数据调度过程中输入缓冲器和/或所述输出缓冲器的实时填充深度,对预设调度颗粒度进行修正,得到更新后调度颗粒度;在对输入缓冲器的可用容量进行监测之前,查询更新后调度颗粒度,以根据更新后调度颗粒度进行下次数据调度。

相应的,上述调度颗粒度更新的过程可以具体通过调度颗粒度更新模块来实现,也即,输入调度模块中除了调度控制模块和调度触发模块之外,还可进一步包括调度颗粒度更新模块。具体地,调度颗粒度更新模块主要是依据输入/输出缓冲器的实时填充深度的动态变化过程,间接地获得当前pcie总线的延时特性,从而通过调整每次数据调度颗粒度大小的方法,以最大化地增加pcie总线带宽的利用率。

本申请实施例,具体引入了经典控制理论的pid(proportionintegrationdifferentiation,比例积分微分)控制方法来实现调度颗粒度的更新控制闭环,以增量式pid控制为例,其离散表达式如下所示:

δu(k)=kp*[e(k)-e(k-1)]+ki*e(k)+kd*[e(k)-2e(k-1)+e(k-2)]

进一步地,上述表达式可改写为:

δu(k)=(kp+ki+kd)*e(k)-(kp+2kd)*e(k-1)+kd*e(k-2)。

由此,可得到如图5所示的电路实现方案。首先,输入的时钟经过一级分频器,再接到串联的三组d触发器中用以采样输入/输出缓冲器当中实时的填充深度相对于设定目标深度的误差值,依次为e(k)、e(k-1)和e(k-2),再分别乘以各自的系数得到输入/输出颗粒度的修正值δu(k),并与颗粒度计算器的初始值,即当前触发模块所使用的调度颗粒度设置进行运算得到新的调度颗粒度。

在调度控制模块完成一次调度操作之后,可读取上述调度颗粒度更新值,并更新到调度触发模块,从而产生新的触发调度行为,最终形成pid闭环控制。当然,另外一种可选的更新策略是绕过调度控制模块,颗粒度计数器值会实时的映射到触发控制模块里面的颗粒度设置,相应的,调度控制模块在收到调度触发后,需要查询当前的调度颗粒度设置,并进行对应的搬移调度。

针对输入缓冲器,其期望的理想填充状态是常满,所以输入缓冲器的填充目标可直接设定为输入缓冲器的大小;而针对输出缓冲器,其期望的理想填充状态是常空,所以输出缓冲器的填充目标可直接设定为0。但是考虑到pcie总线的传输特性,输入缓冲器的填充目标可以设置为:缓冲器的物理大小减去一个基本的调度颗粒度,输出缓冲器的填充目标可以设置为:一个基本的调度颗粒度。

下面对本申请实施例提供的一种应用于加速板卡的数据调度装置进行介绍,下文描述的一种应用于加速板卡的数据调度装置与上文描述的一种数据调度方法可以相互参照。

参见图6所示,本申请实施例提供的一种应用于加速板卡的数据调度装置包括:

容量监测单元201,用于对输入缓冲器的可用容量进行监测,若所述可用容量达到第一阈值,则利用pciedma对主机ddr内的目标数据进行分割;

数据拷贝单元202,用于将分割后的子数据块拷贝至所述输入缓冲器,所述输入缓冲器通过同步时钟接口连接数据处理单元,以便所述数据处理单元依次读取所述输入缓冲器的数据并进行处理;

数据填充单元203,用于当所述数据处理单元得到处理结果后,将所述处理结果填充至输出缓冲器中,所述数据处理单元与所述输出缓冲器通过同步时钟接口进行连接;

数据回填单元204,用于对所述输出缓冲器的已用容量进行监测,若所述已用容量达到第二阈值,则通过pciedma将所述处理结果回填至所述主机ddr内的指定区域。

关于上述单元201至204的具体实施过程可参考前述实施例公开的相应内容,在此不再进行赘述。

在上述实施例的基础上,作为一种优选实施方式,所述容量监测单元可以具体包括:

现存数据确定子单元,用于通过第一填充计数器确定所述输入缓冲器内的现存数据大小;其中,所述第一填充计数器的数值根据一次写入所述输入缓冲器的数据量和每个时钟周期所述数据处理单元的读取数据量进行确定;

可用容量确定子单元,用于确定结合所述输入缓冲器的总容量、处于pcie总线传输链路的待写入数据大小和所述现存数据大小,确定所述输入缓冲器的可用容量。

本申请还提供了一种加速板卡,参见图7所示,本申请实施例提供的一种加速板卡包括:

存储器100,用于存储计算机程序;

处理器200,用于执行所述计算机程序时可以实现上述实施例所提供的步骤。

具体的,存储器100包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机可读指令,该内存储器为非易失性存储介质中的操作系统和计算机可读指令的运行提供环境。处理器200在一些实施例中可以是一中央处理器(centralprocessingunit,cpu)、控制器、微控制器、微处理器或其他数据处理芯片,为加速板卡提供计算和控制能力,执行所述存储器100中保存的计算机程序时,可以实现前述任一实施例公开的应用于加速板卡的数据调度方法。

在上述实施例的基础上,作为优选实施方式,参见图8所示,所述加速板卡还包括:

输入接口300,与处理器200相连,用于获取外部导入的计算机程序、参数和指令,经处理器200控制保存至存储器100中。该输入接口300可以与输入装置相连,接收用户手动输入的参数或指令。该输入装置可以是显示屏上覆盖的触摸层,也可以是终端外壳上设置的按键、轨迹球或触控板,也可以是键盘、触控板或鼠标等。

显示单元400,与处理器200相连,用于显示处理器200处理的数据以及用于显示可视化的用户界面。该显示单元400可以为led显示器、液晶显示器、触控式液晶显示器以及oled(organiclight-emittingdiode,有机发光二极管)触摸器等。

网络端口500,与处理器200相连,用于与外部各终端设备进行通信连接。该通信连接所采用的通信技术可以为有线通信技术或无线通信技术,如移动高清链接技术(mhl)、通用串行总线(usb)、高清多媒体接口(hdmi)、无线保真技术(wifi)、蓝牙通信技术、低功耗蓝牙通信技术、基于ieee802.11s的通信技术等。

图8仅示出了具有组件100-500的加速板卡,本领域技术人员可以理解的是,图8示出的结构并不构成对加速板卡的限定,可以包括比图示更少或者更多的部件,或者组合某些部件,或者不同的部件布置。

本申请还提供了一种计算机可读存储介质,该存储介质可以包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现前述任一实施例公开的应用于加速板卡的数据调度方法。

说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。

还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

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