异构计算中的并行加速方法及系统与流程

文档序号:12463648阅读:264来源:国知局
异构计算中的并行加速方法及系统与流程

本发明涉及并行计算领域,具体涉及一种异构计算中的并行加速方法及系统。



背景技术:

GPU(Graphic Processing Unit,图形处理器),其主要用于进行各种并行计算,如绘制计算机图形所需的运算,包括顶点设置、光影、像素操作等。GPU中,绝大部分的晶体管都用于实现计算执行,只有很少的晶体管用于进行逻辑控制、缓存等,从而使得GPU具有很强的计算能力,非常适合处理逻辑简单但运算量巨大的计算任务,如深度学习任务中普遍使用GPU器件计算每层神经网络模型参数。为了应对越来越大的训练数据或越来越复杂的计算任务,需要越来越多的GPU协同工作,才能在较短的时间内完成计算任务。因此,GPU加速迫切需要,各GPU之间协同工作时,通信时长及通信带宽是影响GPU加速的主要因素。

现有的GPU加速方法一般采用主从式加速方法,服务器中GPU的拓扑结构包含一个主节点及多个从节点,如图1所示。各GPU先接收待传输的数据,再根据主从式加速方法的拓扑结构对各GPU包含数据进行更新,具体更新时,由于主节点的带宽要求,每次仅能同时与少量从节点通信,如仅能与2个从节点通信,从节点先依次将自己的数据传输到主节点上,当所有从节点的数据传输结束后,主节点对从节点所有数据进行汇总,然后再将汇总后的数据依次发给各从节点。通信结束后,各从节点得到自己及其它所有从节点的数据,各GPU数据更新结束。

如图1中,假设有8个从节点,主节点每次仅能与2个从节点通信,则各GPU数据更新过程如下:第一次通信从节点1、从节点2将数据传输到主节点,第二次通信从节点3、从节点4将数据传输到主节点,第三次通信从节点5、从节点6将数据传输到主节点,第四次通信从节点7、从节点8将数据传输到主节点;所有从节点将数据传输到主节点后,主节点对从节点数据汇总,分别传输给各从节点;第五次通信主节点将汇总后的数据传给从节点1、从节点2,第六次通信主节点将汇总后的数据传给从节点3、从节点4,第七次通信主节点将汇总后的数据传给从节点5、从节点6,第八次通信主节点将汇总后的数据传给从节点7、从节点8。

该方法中每个从节点之间不能直接通信,需要每个从节点先与主节点通信,当所有从节点与主节点通信结束后,再由主节点将得到的从节点的数据进行汇总后,依次传输给每个从节点,这个过程对主节点的带宽要求较高。主节点的带宽越高,同时与主节点通信的从节点越多,但实际应用中,由于硬件的限制,主节点的带宽往往仅能允许同时与少量从节点通信;如果从节点较多,则各GPU完成一次数据更新的时间越长;如果主节点的带宽不变,随着从节点规模的增大,各GPU数据更新的时间会呈线性增加,从而严重影响了GPU的加速效率。如图1中,假设有8个从节点时,各GPU完成一次数据更新,共需要8个通信时长。



技术实现要素:

本发明提供一种异构计算中的并行加速方法及系统,以在提高GPU并行计算能力的同时,降低各GPU节点的带宽需求。

为此,本发明提供如下技术方案:

一种异构计算中的并行加速方法,包括:

预先根据GPU的个数确定GPU之间数据传输的拓扑结构;

所述拓扑结构中的各GPU获取当前任务,并对所述当前任务中的数据进行计算,得到对应当前任务的计算结果;

各GPU将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU,以使各GPU进行数据更新;

各GPU得到所述拓扑结构中的所有其它GPU的计算结果后,开始执行下一任务。

优选地,所述GPU的个数为2的指数次方。

优选地,所述根据GPU的个数确定GPU之间数据传输拓扑结构包括:

如果GPU的总数为2,则所述拓扑结构为包含两个节点的一条边,每个节点为一个GPU;

如果GPU的总数为4,则所述拓扑结构为四边形结构,所述四边形中每个节点为一个GPU;

如果GPU的总数为8,则所述拓扑结构为立方体结构,每个立方体的节点为一个GPU;

如果GPU的总数是8的n倍,n为大于或等于2的偶数,则所述拓扑结构为n个立方体结构,每个立方体的节点为一个GPU。

优选地,所述方法还包括:

如果所述GPU的个数不是2的指数次方,则通过增加或删除GPU,使GPU的总数为2的指数次方。

优选地,所述各GPU将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU包括:

如果所述拓扑结构为包含两个节点的一条边,则两个节点分别将各自得到的对应当前任务的计算结果发送给对方;

如果所述拓扑结构为四边形结构,则预先设定四边形中任意两个相邻节点为固定节点;在进行数据分享时,所述固定节点先将自己对应当前任务的计算结果发送给其相邻节点,然后两固定节点之间、两固定节点的相邻节点之间进行通信,将各自对应当前任务的计算结果以及得到的各自相邻节点的计算结果一起发送给对方;

如果所述拓扑结构为一个立方体结构,则预先设定立方体中的任意两个相对面为固定面;在进行数据分享时,所述固定面中各节点先按照所述四边形结构中的节点通信方式进行通信,得到同一面上所有其它节点的计算结果,然后两个相对固定面之间对应的节点进行通信,将各自对应当前任务的计算结果以及得到的同一面上所有其它节点的计算结果一起发送给对方;

如果所述拓扑结构为多个立方体结构,则预先将所述多个立方体两两组成立方体对;在进行数据分享时,每个立方体对中的两个立方体中的节点各自先按照所述立方体结构中的节点通信方式进行通信,得到同一立方体中所有其它节点的计算结果,然后每个立方体对中的两个立方体之间对应节点进行通信,得到该立方体对中所有其它节点的计算结果;最后不同立方体对之间相对应的节点进行通信,将各自对应当前任务的计算结果以及得到的其它立方体对中所有其它节点的计算结果一起发送给对方。

一种异构计算中的并行加速系统,包括多个执行并行运算的GPU、设置模块;

所述设置模块用于预先根据GPU的个数确定GPU之间数据传输的拓扑结构;

所述GPU包括:控制单元、计算单元、存储单元;

所述控制单元,用于获取待处理任务,并将所述待处理任务保存在所述存储单元中;

所述计算单元,用于从所述存储单元中获取当前任务,对当前任务中的数据进行计算,得到对应当前任务的计算结果,并将所述计算结果存储到所述存储单元中;

所述控制单元,还用于从所述存储单元中获取对应当前任务的计算结果,并将该计算结果分享给所述拓扑结构中的所有其它GPU,以使各GPU进行数据更新,并在得到所述拓扑结构中的所有其它GPU的计算结果后,触发所述计算单元开始执行下一任务。

优选地,所述GPU的个数为2的指数次方。

优选地,所述设置模块具体用于:

在GPU的总数为2时,设置所述拓扑结构为包含两个节点的一条边,每个节点为一个GPU;

在GPU的总数为4时,设置所述拓扑结构为四边形结构,所述四边形中每个节点为一个GPU;

在GPU的总数为8时,设置所述拓扑结构为立方体结构,每个立方体的节点为一个GPU;

在GPU的总数是8的n倍,n为大于或等于2的偶数,设置所述拓扑结构为n个立方体结构,每个立方体的节点为一个GPU。

优选地,所述设置模块还用于在所述GPU的个数不是2的指数次方时,增加或删除GPU,使GPU的总数为2的指数次方。

优选地,所述拓扑结构中的GPU设置在一个或多个服务器中。

本发明实施例提供的异构计算中的并行加速方法及系统,预先根据GPU的个数确定GPU之间数据传输的拓扑结构;所述拓扑结构中的各GPU获取当前任务,并对所述当前任务中的数据进行计算,得到对应当前任务的计算结果;各GPU将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU;各GPU得到所述拓扑结构中的所有其它GPU的计算结果后,开始执行下一任务。由于多个GPU同时并行处理数据从而大大提高了数据的处理速度。数据并行处理过程中,各GPU在每批数据处理结束后与拓扑结构中其它GPU之间相互通信,使每个GPU都能获取到其它GPU的数据信息,然后再继续处理下一批数据,降低各GPU节点的带宽需求。

附图说明

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

图1是现有技术中主从式多GPU加速的拓扑结构示意图;

图2是本发明实施例异构计算中的并行加速方法的流程图;

图3是本发明实施例中拓扑结构为包含两个节点的一条边的示意图;

图4是本发明实施例中拓扑结构为四边形结构的示意图;

图5是本发明实施例中拓扑结构为一个立方体结构的示意图;

图6是本发明实施例中拓扑结构为两个立方体结构的示意图;

图7是本发明实施例中GPU各单元的工作流程示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明实施例的方案,下面结合附图和实施方式对本发明实施例作进一步的详细说明。

如图2所示,是本发明实施例异构计算中的并行加速方法的流程图,包括以下步骤:

步骤201,预先根据GPU的个数确定GPU之间数据传输拓扑结构。

所述GPU可以存在一个服务器中,也可以存在多个服务器中,GPU的个数为2的指数次方,具体个数可以根据实际应用需求预先确定,对此本发明实施例不做限定。

本发明实施例中,所述GPU之间数据传输拓扑结构主要针对GPU的总数为2的指数次方的情况,如2的3次方共8个GPU,2的4次方共16个GPU等,如果GPU的总数不为2的指数次方,则需要增加或删除相应的GPU。

具体拓扑结构确定过程如下所述:

步1)判断GPU的总数是否大于等于8;如果是,执行步4);否则,执行步2);

步2)判断GPU的总数是否为4;如果是,则GPU之间数据传输的拓扑结构为四边形,所述四边形中每个节点为一个GPU;否则,执行步3);

步3)判断GPU的总数是否为2;如果是,则GPU之间数据传输的拓扑结构为包含两个节点的一条边,每个节点为一个GPU;否则,执行步6);

步4)判断GPU的总数是否为2的指数次方,所述指数大于等于3,如果是,执行步5),否则,执行步6);

步5)计算GPU的总数除以8,得到第一计算值,并根据所述第一计算值,确定各GPU之间的拓扑结构;

具体计算时,直接使用GPU总数除以8即可得到具体倍数,如2倍;如果GPU总数为8的1倍,则服务器中各GPU之间的拓扑结构为立方体结构,每个立方体的节点为一个GPU;如果GPU总数为8的多倍,则各GPU之间的拓扑结构为多个立方体结构,每个立方体上的节点表示一个GPU,所述立方体的个数与所述倍数相等;如GPU总数为16个,即为8的2倍,则各GPU之间的拓扑结构为2个立方体,每个立方体上的节点表示一个GPU,共16个节点;

步6)增加或删除相应GPU,使GPU的总数满足2的指数次方。

步骤202,所述拓扑结构中的各GPU获取当前任务,并对所述当前任务中的数据进行计算,得到对应当前任务的计算结果。

在实际应用中,各GPU的任务可以由服务器中的CPU实时分配,也可以由CPU预先将任务分配到内存中,由CPU将内存地址传给GPU,由GPU到相应内存地址中读取。

需要说明的是,GPU中数据的读取及计算由单线程,也可以由两个并行的线程来完成,对此本发明实施例不做限定。

为了进一步提高系统整体计算效率,在进行系统配置时,可以尽量使各GPU的计算能力及存储能力保持一致,并保持各GPU的负载均衡,即分配给各GPU的任务的运算量大致相同。

步骤203,各GPU将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU,以使各GPU进行数据更新。

各GPU可根据确定的拓扑结构将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU,需要说明的是,不同GPU之间的通信是双向的,即相互通信的两个GPU可以同时将自己的数据传送给对方,这样仅需要一次通信,通信的两个GPU就都可以得到对方节点的数据。GPU的拓扑结构保证了各GPU之间完成一次数据更新所需通信时长与GPU数量呈对数增长,每次数据更新结束后需要的通信时长为log2N,其中N为GPU总数。

下面结合前面介绍的各种不同拓扑结构,详细说明各拓扑结构中GPU进行数据更新的过程。

如图3所示,是本发明实施例中拓扑结构为包含两个节点的一条边的示意图。

在该拓扑结构中,GPU1和GPU2直接进行通信,即可完成两个GPU之间的数据传送。GPU1在收到GPU2传送的数据后,GPU1的数据更新完成,继续执行下一任务;GPU2在收到GPU1传送的数据后,GPU2的数据更新完成,继续处理下一任务。

如图4所示,是本发明实施例中拓扑结构为四边形结构的示意图。

在该拓扑结构中,需要预先设定四边形中任意两个相邻节点为固定节点,四边形中另两个节点为这两个固定节点的相邻节点。各GPU进行数据更新时,四边形中的固定节点分别与各自的相邻节点进行通信,以将自己得到的计算结果传送给相邻节点,数据传送完成后,每个固定节点都得到各自相邻节点的数据;最后,固定节点之间、固定节点的相邻节点之间进行通信,通信结束后,各节点都得到了四边形中所有其它节点的数据,数据更新结束。在这种拓扑结构中,完成一次数据更新共需要两个通信时长,即log24=2。

例如图4中,预先确定GPU1和GPU3为固定节点,则GPU2为GPU1的相邻节点,GPU4为GPU3的相邻节点。GPU1与GPU2、GPU3与GPU4之间可以同时进行通信,通信结束后,各节点都得到自己及相邻节点的数据;最后GPU1与GPU3、GPU2与GPU4之间可以同时进行通信,通信结束后,各节点都得到四边形中所有节点的数据,拓扑结构中各GPU数据更新结束。

如图5所示,是本发明实施例中拓扑结构为一个立方体结构的示意图。

在该拓扑结构中,需要预先将立方体中任意两个相对面作为固定面,则该固定面为前面图4所述的四边形结构。各GPU进行数据更新时,两个固定面中的各GPU按照四边形结构中各GPU的数据更新方法进行通信,通信结束后,相对两个平面上各节点分别得到同一四边形中所有节点的数据;最后所述相对两个平面之间相对应的节点可以同时进行通信,这样立方体中各节点都得到立方体中所有其它节点的数据,拓扑结构中各GPU数据更新结束。在这种拓扑结构中,完成一次数据更新共需要3个通信时长,即log28=3。

例如图5中,为方便起见,将GPU双向通信的线简化成了没有箭头的线来表示。预先将立方体上下两个面作为固定面,上下两个面中的各节点分别按照四边形拓扑中各GPU的数据更新方法进行通信,即在立方体上下两个面中分别确定四个固定节点,如确定GPU1、GPU3、GPU5、GPU7为固定节点,则GPU2、GPU4、GPU6、GPU8分别为相应固定节点的相邻节点,在上下两个面上,固定节点先与其相邻节点同时进行通信,即GPU1与GPU2、GPU3与GPU4、GPU5与GPU6、GPU7与GPU8之间同时进行通信,通信结束后,各节点分别得到其相邻节点的数据;然后上下两个面上,固定节点之间及固定节点的相邻节点之间同时进行通信,即GPU1与GPU3、GPU5与GPU7、GPU2与GPU4、GPU6与GPU8之间同时进行通信,通信结束后,上下两个平面上的节点分别得到同一四边形中所有其它节点的数据;最后上下两个平面之间的对应节点同时进行通信,即GPU1与GPU5、GPU2与GPU6、GPU3与GPU7、GPU4与GPU8之间同时进行通信,通信结束后,立方体内各节点得到所有其它节点的数据,拓扑结构中各GPU数据更新结束。

如图6所示,是本发明实施例中拓扑结构为两个立方体结构的示意图。

在该拓扑结构中,GPU进行数据更新时,各立方体内节点先进行通信,具体方法图5中通信方法相同,各立方体内节点通信可以同时进行,立方体内节点通信结束后,每个立方体内的节点得到该立方体内所有其它节点的数据;然后立方体之间对应节点进行通信,通信结束后,立方体内各节点得到该拓扑结构中所有其它节点的数据,GPU数据更新结束。

例如图6中,GPU数据更新时,先分别完成各立方体内节点之间的通信,需要3次通信时长;通信结束后,两个立方体之间相对应的节点通信;仅需要一次通信时长即可完成所有节点的通信,通信结束后,各节点都得到自己及拓扑结构中其它节点的数据,GPU数据更新结束。16个节点的拓扑结构完成各GPU之间数据更新时,需要4个通信时长,即log216=4。

需要说明的是,在有多个立方体的拓扑结构中,需要预先设定立方体对,由于GPU的总数为2的指数次方,因此所述立方体对的个数为N/2,其中N为拓扑结构中立方体的总数,不同立方体对内的立方体不同。在进行数据更新时,各立方体对中的节点先按照图6中的通信方式进行通信,通信结束后,每个立方体对中的各节点得到该立方体对内的所有其它节点的数据,然后,不同立方体对之间相对应的节点进行通信,通信结束后,各节点都得到该拓扑结构中所有其它节点的数据,GPU数据更新结束。

另外,需要说明的是,在实际应用中,也可以不限定立方体的个数,比如有3个立方体,在这种情况下,在进行数据更新时,组成立方体对的各立方体中的节点按照上述通信方式进行通信,通信结束后,各立方体对中的各节点都得到各立方体对中所有其它节点的数据,然后剩余的未成对立方体中的各节点还需要分别与所有立方体对中的各立方体中的相应节点进行通信,以使所有立方体对中的各立方体中的相应节点得到该未成对立方体中的各节点的数据。

步骤204,各GPU得到所述拓扑结构中的所有其它GPU针对当前任务的计算结果后,开始执行下一任务。

需要说明的是,上述各拓扑结构中的各GPU可以位于同一服务器中,也可以位于不同的服务器中,比如,图5所示立方体结构中的8个GPU可以分设于两个服务器中。同一服务器的GPU之间的通信可以采用内部协议,不同服务器中的GPU之间的通信可以采用外部协议。另外,所述拓扑结构中的各GPU并行独立工作,在该GPU得到所述拓扑结构中的所有其它GPU针对当前任务的计算结果后,即可开始执行下一任务,而不用关心其它GPU是否可以开始执行下一任务,因此不仅提高了数据处理速度,而且大大降低了通信带宽需求。

本发明实施例提供的异构计算中的并行加速方法,预先根据GPU的个数确定GPU之间数据传输的拓扑结构;所述拓扑结构中的各GPU获取当前任务,并对所述当前任务中的数据进行计算,得到对应当前任务的计算结果;各GPU将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU;各GPU得到所述拓扑结构中的所有其它GPU的计算结果后,开始执行下一任务。由于多个GPU同时并行处理数据从而大大提高了数据的处理速度。数据并行处理过程中,各GPU在每批数据处理结束后与拓扑结构中其它GPU之间相互通信,使每个GPU都能获取到其它GPU的数据信息,然后再继续处理下一批数据,降低各GPU节点的带宽需求。

相应地,本发明实施例还提供一种异构计算中的并行加速系统,该系统包括多个执行并行运算的GPU、设置模块,其中,所述设置模块用于预先根据GPU的个数确定GPU之间数据传输的拓扑结构。每个GPU均包括:控制单元、计算单元、存储单元。

如图7所示,是本发明实施例中GPU各单元的工作流程示意图。

其中,控制单元获取待处理任务,并将所述待处理任务保存在存储单元中;计算单元从所述存储单元中获取当前任务,对当前任务中的数据进行计算,得到对应当前任务的计算结果,并将所述计算结果存储到存储单元中;控制单元从所述存储单元中获取对应当前任务的计算结果,并将该计算结果分享给所述拓扑结构中的所有其它GPU(图7中仅示出了两个GPU的情况),以使各GPU进行数据更新,并在得到所述拓扑结构中的所有其它GPU的计算结果后,触发计算单元开始执行下一任务。计算单元执行下一任务的过程与上述相同,依此类推,直至所述待处理任务全部处理完毕。

需要说明的是,上述待处理任务可以由CPU分配给各GPU,比如将对应各GPU的待处理任务存储到不同的内存中,各GPU的控制单元从相应内存中获取自己的待处理任务。

另外需要说明的是,在实际应用中,所述拓扑结构中的多个GPU可以分布于同一服务器中,也可以分布于不同的服务器中,对此本发明不做限定。分布于同一服务器中的GPU之间的数据传输可以采用内部协议,分布于不同服务器中的GPU之间的数据传输可以采用外部协议。

为了更经济地平衡处理速度与带宽需求的冲突,在实际应用中,可以优选地使拓扑结构中GPU的个数为2的指数次方。如果不满足该条件,可以通过设置模块增加或删除相应的GPU,使GPU的总数为2的指数次方。

相应地,在设置模块确定GPU之间数据传输的拓扑结构时,可以针对GPU数量的不同,设置相应的拓扑结构,比如:在GPU的总数为2时,设置所述拓扑结构为包含两个节点的一条边,每个节点为一个GPU;在GPU的总数为4时,设置所述拓扑结构为四边形结构,所述四边形中每个节点为一个GPU;在GPU的总数为8时,设置所述拓扑结构为立方体结构,每个立方体的节点为一个GPU;在GPU的总数是8的n倍,n为整数,并且n>1时,设置所述拓扑结构为n个立方体结构,每个立方体的节点为一个GPU。

针对上述各种拓扑结构,其中的GPU进行数据传输的方法已在前面有详细说明,在此不再赘述。需要说明的是,在所述拓扑结构为四边形结构的情况下,所述设置模块还需要预先设定四边形中任意两个相邻节点为固定节点;在所述拓扑结构为一个立方体结构的情况下,所述设置模块还需要预先设定立方体中的任意两个相对面为固定面;在所述拓扑结构为多个立方体结构的情况下,所述设置模块还需要预先将所述多个立方体两两组成立方体对。

当然,在所述拓扑结构中,每个节点上的GPU都对应有一个唯一的ID,不同节点间进行通信时,需要将自己的ID以及传送的数据对应的GPU的ID,一并传送给对方节点。这样,每个节点上的GPU收到数据后,可以通过相应的ID得知已经收到该拓扑结构中哪些GPU上的数据,未收到哪些GPU的数据。

当然,也可以分别为每个GPU设置相应标志位,当接收到相应GPU的数据后,更改该GPU的标志位,以表示当前GPU已经接收相应标志位对应的GPU所发送的数据;所述更改GPU标志位如将GPU标志位将0改为1。当前GPU通过查找每个GPU对应标志位,即可知道接收了哪些GPU的数据,未接收哪些GPU的数据。

本发明实施例提供的异构计算中的并行加速系统,预先根据GPU的个数确定GPU之间数据传输的拓扑结构;所述拓扑结构中的各GPU获取当前任务,并对所述当前任务中的数据进行计算,得到对应当前任务的计算结果;各GPU将自己得到的对应当前任务的计算结果分享给所述拓扑结构中的所有其它GPU;各GPU得到所述拓扑结构中的所有其它GPU的计算结果后,开始执行下一任务。由于多个GPU同时并行处理数据从而大大提高了数据的处理速度。数据并行处理过程中,各GPU在每批数据处理结束后与拓扑结构中其它GPU之间相互通信,使每个GPU都能获取到其它GPU的数据信息,然后再继续处理下一批数据,降低各GPU节点的带宽需求。

另外,本发明实施例提供的GPU之间数据传输的拓扑结构保证了不同节点之间完成一次数据更新需要的通信时长与GPU的数量呈对数关系,并且没有主次节点之分,各GPU节点的带宽需求平等,对各GPU的带宽要求较低,因此,本发明实施例的方法及系统可以在GPU通信带宽较低、通信时长较少的情况下完成各GPU的数据更新,大大提高了GPU的加速效率。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。

以上对本发明实施例进行了详细介绍,本文中应用了具体实施方式对本发明进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及系统;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

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