现在的多核cpu,就是SMP对称多多核处理器架构构么

多核CPU开多少线程效率最高?
双核的CPU是否意味着两个线程可以同时运行,还是说一时间只能运行一个,等待其调度。那在多核CPU的计算机上,一个程序应该开多少线程效率最高呢
按投票排序
这个问题相当复杂。多核 CPU 的每个核都有独立的运算器,但是其它部件(比如 on-die cache)是独立的还是共享,依具体的 CPU 而不同。有些 CPU 每个核有两个运算器,所以可以实现超线程技术(用一个核模拟两个虚拟核),而超线程技术的效率又取决于每个核的部件冗余程度。另外,在所有 SMP 构架中,所有核共享内存总线。开多少线程效率最高,和线程的任务利用何种部件,以及这些部件的独立/共享状态相关。对于重度读写拷贝内存的线程,不管 CPU 有多少核,开两三个线程就可能效率下降。对于仅仅使用运算器的任务,则要把超线程的逻辑核都用满才算高效率。而中间的状态可以以此类推。
不邀自答。1. 多核心意味着有两个或两个以上的独立实体中央处理单元,两个单元可以各自独立地运行不同指令,是真正的并行。2. 但凡写过程序就应该知道任务背景不同,多线程的效果也不同,如果有IO、网络的等待,两个核心你开两个线程,那线程一旦阻塞了,这个核心就闲置了。3. 超线程,就是如果两个线程在同一时间的指令使用的流水线单元(像分支预测器)不一样, 则一个核可以同时处理。但理想情况总是较少的,所以比起真正的两个核心还是差得远。万一发生资源互抢的情形时,整体性能反而会下降。4. IOCP示例往往开CPU数量*2+2或者CPU数量*2个线程,可能有像第2点所说的避免闲置的作用,不过如果线程是计算密集的,开得线程多了,反而会把资源浪费在上下文切换上。总之:在单核心下,为了实现伪多任务,要把一堆时间片分给不同任务,所以多线程除了有IO、网络等的等待,在实质很难提高效率;在多核心下,多线程一般都可以提高效率的,但具体设计多少个线程还是得看具体情况;至于超线程,目前效果并不好,建议编写程序时参考Intel系统编程指南,还有这篇文章:,据说在网络服务器上效果还是有的。现在搞异步、协程的比较多,题主也不妨看下。
谢邀。如果你确实想深入了解这个话题,建议深度阅读一下相关材料。比如WIKI上的CPU的架构,多线程,多核等等。一定要准确了解相关概念。你问了一个很大的问题,也是没有确切数字答案的问题。多线程设计是并行程序设计的一个重要构成。举个简单的例子。体育场内的长跑比赛中,参赛选手在各自的赛道起跑,但跑起来了以后都会去争抢内道。内道作为一种稀缺资源,可以给跑在上面的选手带来种种优势,但如果争抢的人太多,就会出现碰撞和摩擦,对所有人都有影响。同时,如果我们希望所有运动员跑过的总里程越长越好,那似乎运动员应该尽可能的多,可人越多,带来的摩擦和争抢也会越多。夸张一点的说,如果5个人抢内道还行,那么100个人抢内道就肯定一片混乱了,最后谁也跑步好,或者不得不前后挨着排成一列,搞不好还有人要受伤。每一个线程就相当于一个运动员,而处理器就是一个非常复杂的体育场。能够开多少线程,首先取决于程序对多线程的支持。由于算法的问题,有的程序只能支持有限的线程数或者2的n次方个线程,多余这个数量就会出现错误。希望更多的线程,并行性更好的线程,往往需要在算法和实现上进行改性。其次,每个CPU都有不同的结构。比如是否支持超线程,L2 Cache是否共享,NUMA region是怎样的等等。在一些特殊的x86处理器上,这样的区别还会要求程序员专门设计程序。比如Xeon Phi中每一个核都有两个pipeline,有一套专门的512bit的向量处理单元,执行自己的向量指令集,这就需要程序的实现更加有针对性。在同样的架构上,每一个线程的workload是否balance,需要什么样的资源,对memory的读写有没有冲突,critical region多不多,原子操作多不多都会影响到他们之前是否能够很好的并行。一般而言,线程间的冲突何互斥越少越好。此外,多线程不仅局限于CPU。除了上面提到的Xeon Phi,还有GPU、APU等,涉及到的编程语言也有OpenCL、CUDA、OpenACC、OpenMP等等等等。这里面牵扯到线程数量的因素非常多。
可以同时运行,现在的cpu都是物理多核心的,每个核心有自己的高速缓存。开多少线程取决于程序自己,如果你这个程序就是一个for(int i = 0; i
说到效率,那假设前提计算资源相比程序是瓶颈一方,如果线程之间都并行,相互之间没有关系,当然是跟CPU等数量最好(超线程不谈),什么Cache不中之类根本不需要考虑,否则硬件体系结构肯定就不过关。那下一步就是操作系统调度的问题,成熟的操作系统在应对这种最简单的情形也肯定不会让CPU闲在那里。如果超过了CPU数量,显然需要多余的调度代码来执行,而总的计算能力不会增加,那么比不过相等的情形。复杂一点是线程之间有同步/竞争关系,那么考虑到cache不中的等情形,就很难说能提高多少,但绝大多数需要足够运算能力的情形下,也基本可以认为等同是最佳的。除非故意把代码分割成粒度极小的执行单元,但想到调度也可能早已成为性能瓶颈了,这种故意劣化cpu性能的代码也很难在真实世界中上演。实际上,在目前主流程序设计语言中,因为缺少较好的协程同步机制,而对于异步代码大多数情况有觉得用多线程写起来更加容易,即要不很难做到任务并行划分,要不就开大量线程,很少人会想到要做到恰好等同cpu数量。同时极度消耗计算资源的时候也是很少的,所以大多数情形下这也不是一个问题,搞并行高性能计算才需要关心一下。
已有帐号?
无法登录?
社交帐号登录多核处理器设计的九大关键问题_单片机_中国百科网
多核处理器设计的九大关键问题
    cmp和smt一样,致力于发掘计算的粗粒度并行性。cmp可以看做是随着大规模集成电路技术的发展,在芯片容量足够大时,就可以将大规模并行处理机结构中的smp(对称多处理机)或dsm(分布共享处理机)节点集成到同一芯片内,各个处理器并行执行不同的线程或进程。在基于smp结构的单芯片多处理机中,处理器之间通过片外cache或者是片外的共享存储器来进行通信。而基于dsm结构的单芯片多处理器中,处理器间通过连接分布式存储器的片内高速交叉开关网络进行通信。由于smp和dsm已经是非常成熟的技术了,cmp结构设计比较容易,只是后端设计和芯片制造工艺的要求较高而已。正因为这样,cmp成为了最先被应用于商用cpu的“未来”高性能处理器结构。虽然多核能利用集成度提高带来的诸多好处,让芯片的性能成倍地增加,但很明显的是原来系统级的一些问题便引入到了处理器内部。1 核结构研究: 同构还是异构cmp的构成分成同构和异构两类,同构是指内部核的结构是相同的,而异构是指内部的核结构是不同的。为此,面对不同的应用研究核结构的实现对未来微处理器的性能至关重要。核本身的结构,关系到整个芯片的面积、功耗和性能。怎样继承和发展传统处理器的成果,直接影响多核的性能和实现周期。同时,根据amdahl定理,程序的加速比决定于串行部分的性能,所以,从理论上来看似乎异构微处理器的结构具有更好的性能。核所用的指令系统对系统的实现也是很重要的,采用多核之间采用相同的指令系统还是不同的指令系统,能否运行操作系统等,也将是研究的内容之一。2 程序c多核处理器设计的首要问题是选择程序执行模型。程序执行模型的适用性决定多核处理器能否以最低的代价提供最高的性能。程序执行模型是编译器设计人员与系统实现人员之间的接口。编译器设计人员决定如何将一种高级语言程序按一种程序执行模型转换成一种目标机器语言程序; 系统实现人员则决定该程序执行模型在具体目标机器上的有效实现。当目标机器是多核体系结构时,产生的问题是: 多核体系结构如何支持重要的程序执行模型?是否有其他的程序执行模型更适于多核的体系结构?这些程序执行模型能多大程度上满足应用的需要并为用户所接受?3 cache设计: 多级cache设计与一致性问题处理器和主存间的速度差距对cmp来说是个突出的矛盾,因此必须使用多级cache来缓解。目前有共享一级cache的cmp、共享二级cache的cmp以及共享主存的cmp。通常,cmp采用共享二级cache的cmp结构,即每个处理器核心拥有私有的一级cache,且所有处理器核心共享二级cache。cache自身的体系结构设计也直接关系到系统整体性能。但是在cmp结构中,共享cache或独有cache孰优孰劣、需不需要在一块芯片上建立多级cache,以及建立几级cache等等,由于对整个芯片的尺寸、功耗、布局、性能以及运行效率等都有很大的影响,因而这些都是需要认真研究和探讨的问题。另一方面,多级cache又引发一致性问题。采用何种cache一致性模型和机制都将对cmp整体性能产生重要影响。在传统多处理器系统结构中广泛采用的cache一致性模型有: 顺序一致性模型、弱一致性模型、释放一致性模型等。与之相关的cache一致性机制主要有总线的侦听协议和基于目录的目录协议。目前的cmp系统大多采用基于总线的侦听协议。4 核间通信技术cmp处理器的各cpu核心执行的程序之间有时需要进行数据共享与同步,因此其硬件结构必须支持核间通信。高效的通信机制是cmp处理器高性能的重要保障,目前比较主流的片上高效通信机制有两种,一种是基于总线共享的cache结构,一种是基于片上的互连结构。总线共享cache结构是指每个cpu内核拥有共享的二级或三级cache,用于保存比较常用的数据,并通过连接核心的总线进行通信。这种系统的优点是结构简单,通信速度高,缺点是基于总线的结构可扩展性较差。基于片上互连的结构是指每个cpu核心具有独立的处理单元和cache,各个cpu核心通过交叉开关或片上网络等方式连接在一起。各个cpu核心间通过消息通信。这种结构的优点是可扩展性好,数据带宽有保证; 缺点是硬件结构复杂,且软件改动较大。也许这两者的竞争结果不是互相取代而是互相合作,例如在全局范围采用片上网络而局部采用总线方式,来达到性能与复杂性的平衡。5 总线设计传统微处理器中,cache不命中或访存事件都会对cpu的执行效率产生负面影响,而总线接口单元(biu)的工作效率会决定此影响的程度。当多个cpu核心同时要求访问内存或多个cpu核心内私有cache同时出现cache不命中事件时,biu对这多个访问请求的仲裁机制以及对外存储访问的转换机制的效率决定了cmp系统的整体性能。因此寻找高效的多端口总线接口单元(biu)结构,将多核心对主存的单字访问转为更为高效的猝发(burst)访问; 同时寻找对cmp处理器整体效率最佳的一次burst访问字的数量模型以及高效多端口biu访问的仲裁机制将是cmp处理器研究的重要内容。6 操作系统设计: 任务调度、中断处理、同步互斥对于多核cpu,优化操作系统任务调度算法是保证效率的关键。一般任务调度算法有全局队列调度和局部队列调度。前者是指操作系统维护一个全局的任务等待队列,当系统中有一个cpu核心空闲时,操作系统就从全局任务等待队列中选取就绪任务开始在此核心上执行。这种方法的优点是cpu核心利用率较高。后者是指操作系统为每个cpu内核维护一个局部的任务等待队列,当系统中有一个cpu内核空闲时,便从该核心的任务等待队列中选取恰当的任务执行,这种方法的优点是任务基本上无需在多个cpu核心间切换,有利于提高cpu核心局部cache命中率。目前多数多核cpu操作系统采用的是基于全局队列的任务调度算法。多核的中断处理和单核有很大不同。多核的各处理器之间需要通过中断方式进行通信,所以多个处理器之间的本地中断控制器和负责仲裁各核之间中断分配的全局中断控制器也需要封装在芯片内部。另外,多核cpu是一个多任务系统。由于不同任务会竞争共享资源,因此需要系统提供同步与互斥机制。而传统的用于单核的解决机制并不能满足多核,需要利用硬件提供的“读-修改-写”的原子操作或其他同步互斥机制来保证。7 低功耗设计半导体工艺的迅速发展使微处理器的集成度越来越高,同时处理器表面温度也变得越来越高并呈指数级增长,每三年处理器的功耗密度就能翻一番。目前,低功耗和热优化设计已经成为微处理器研究中的核心问题。cmp的多核心结构决定了其相关的功耗研究是一个至关重要的课题。低功耗设计是一个多层次问题,需要同时在操作系统级、算法级、结构级、电路级等多个层次上进行研究。每个层次的低功耗设计方法实现的效果不同――抽象层次越高,功耗和温度降低的效果越明显。8 存储器墙为了使芯片内核充分地工作,最起码的要求是芯片能提供与芯片性能相匹配的存储器带宽,虽然内部cache的容量能解决一些问题,但随着性能的进一步提高,必须有其他一些手段来提高存储器接口的带宽,如增加单个管脚带宽的ddr、ddr2、qdr、xdr等。同样,系统也必须有能提供高带宽的存储器。所以,芯片对封装的要求也越来越高,虽然封装的管脚数每年以20%的数目提升,但还不能完全解决问题,而且还带来了成本提高的问题,为此,怎样提供一个高带宽,低延迟的接口带宽,是必须解决的一个重要问题。9 可靠性及安全性设计随着技术革新的发展,处理器的应用渗透到现代社会的各个层面,但是在安全性方面却存在着很大的隐患。一方面,处理器结构自身的可靠性低下,由于超微细化与时钟设计的高速化、低电源电压化,设计上的安全系数越来越难以保证,故障的发生率逐渐走高。另一方面,来自第三方的恶意攻击越来越多,手段越来越先进,已成为具有普遍性的社会问题。现在,可靠性与安全性的提高在计算机体系结构研究领域备受注目。今后,cmp这类处理器芯片内有多个进程同时执行的结构将成为主流,再加上硬件复杂性、设计时的失误增加,使得处理器芯片内部也未必是安全的,因此,安全与可靠性设计任重而道远。
Copyright by ;All rights reserved.通过对嵌入式多核处理器硬件结构的分析,从对称多处理角度对串行快速排序算法进行并行化优化
本文通过对嵌入式多核处理器硬件结构的分析,从对称多处理角度对串行快速排序算法进行并行化优化,取得了很好的效果。
以ARM 双核处理器(OMAP4430)作为测试平台,从任务并行和缓存优
时间: 22:32 来源:物联网在线 作者:Ioter 点击:次
& 本文通过对多核处理器硬件结构的分析,从对称多处理角度对串行快速排序算法进行并行化优化,取得了很好的效果。
& & 以 双核处理器(OMAP4430)作为测试平台,从任务并行和缓存优化实现并行优化,从性能测试的结果看,任务并行具有良好的加速比,但负载均衡性差,并行 线程数目不应超过物理处理器核的数目,过多的并行线程竞争处理器资源,造成性能下降。缓存优化具有良好的负载均衡性,但需要后续进行归并操作,造成性能有 所下降。
& & 总之,在嵌入式多核处理器上进行并行化优化,一方面要充分发掘嵌人式多核处理器的并行性能,提高程序的并行性;另一方面也要考虑程序算法的负载均衡性,确保在不同应用环境中程序性能一致。
嵌入式多核处理器已经在嵌入式设备领域得到广泛运用,但嵌人式系统软件开发技术还停留在传统单核模式,并没有充分发挥多核处理器的性能。程序并行化 优化目前在PC平台上有一定运用,但在嵌入式平台上还很少,另外,嵌入式多核处理器与PC平台多核处理器有很大不同,因此不能直接将PC平台的并行化优化 方法应用到嵌人式平台。本文分别从任务并行和缓存优化两方面进行并行化优化的研究,探索在嵌人式多核处理器上对程序进行并行化优化的方法。
& & 1 嵌入式多核处理器结构
& & 嵌人式多核处理器的结构包括同构(SymmetrIC)和异构(Asymmetric)两种。同构是指内部核的结构是相同的,这种结构目前广泛应用在PC多核处理器;而异构是指内部核的结构是不同的,这种结构常常在嵌入式领域使用,常见的是通用嵌入式处理器+DSP核。本文探究的嵌入式多核处理器采用同构结构,实现同一段代码在不同处理器上的并行执行。
& & 图1 ARM SMP处理器结构
& & 在目前嵌入式领域中,使用最为广泛的为ARM 处理器,因此以ARM 双核处理器OMAP4430作为研究对象。ARM 对称多处理(Symmetric Multi&Processing,SMP)结构如图1所示,根据程序的局部性原理,每一个处理器都具有私有的内存(LOCal Memory),常见的是一级缓存(L1Cache)。然而,多个处理器之间又涉及到相互通信问题,因此在常见的ARM 处理器中使用二级缓存(L2 Cache)来解决这一问题。基于对称多处理器结构,所有的处理器(通常为2的倍数)在硬件结构上都是相同的,在使用系统资源上也是平等的。更重要的是, 由于所有的处理器都有权利去访问相同的内存空间,在共享内存区域中,任何一个进程或者线程都可以运行在任意一个处理器之上,这样就使得程序的并行化成为可 能。2在嵌入式多核平台上进行并行化优化,需要考虑以下问题:
& & ① 并行化程序的性能取决于程序中串行化部分,程序性能不会随着并行线程数目的提升而不断提升;
& & ② 嵌入式多核处理器相对于PC处理器而言,其总线速度较慢,并且缓存(Cache)更小,会造成大量数据在内存(Memory)和缓存(Cache)问不断拷贝,因此在进行并行化优化的过程中,应考虑缓存友好性(Cache friendly);
& & ③ 程序并行化执行线程数目应当小于或等于物理处理器的数目,线程过多会造成线程间抢占处理器资源,致使并行化性能下降。
& & 2 OpenMP并行化优化
& & 2.1 0penMP工作原理简介
& & OpenMP是一个基于共享内存模式的跨平台多线程并行的编程接口。主线程生成一系列的子线程,并将任务映射到子线程进行执行,这些子线程并行执行,由运 行时环境将线程分配给不同的物理处理器。默认情况下,各个线程独立执行并行区域的代码。可以使用work-sharingconstructs来划分任 务,使每个线程执行其分配部分的代码。通过这种方式,使用OpenMP可以实现任务并行和数据并行。
& & 图2 任务并行模型
& & 任务并行模式创建一系列独立的线程,每一个线程运行一个任务,线程之间相互独立,如图2所示。OpenMP使用编译原语session directive和task directive来实现任务分配,每个线程可以独立运行不同的代码区域,同时支持任务的嵌套和递归。一旦创建任务,该任务就可能会在线程池(其大小等于 物理线程数目)中空闲的线程上执行。
& & 数据并行也就是数据级并行,对任务中处理的数据进行分块并行执行,如图3所示。C语言中的for循环最适合使用数据并行。
& & 图3 数据并行模型
& & 2.2 快速排序算法原理
& & 快速排序算法是一种递归分治算法,算法中最为关键的就是确定哨兵元素(pivot data)。数据序列中小于哨兵的数据将会放在哨兵元素的左侧,序列中大于哨兵的数据将会被放在哨兵元素的右侧。当完成数据扫描后,哨兵元素分成的左右两 个部分就会调用快速排序算法递归进行。
& & 快速排序算法中涉及算法的递归调用,会产生大量任务,并且这些任务相互独立,非常适合OpenMP的任务并行模式;另外,就一次快速排序搜索算法而言,哨 兵元素对于左右子区间数据容量大小具有决定性作用,考虑到嵌入式平台的缓存(Cache)空间较小,需要对哨兵元素筛选算法进行优化,尽量使得划分出来的 左右子区间更均衡,满足负载均衡的要求。
& & 2.3 任务并行化优化
& & 通过对快速排序算法的分析,快速排序是一个递归调用算法,算法的执行过程中会产生大量重复函数调用,并且函数的执行相互独立。对于快速排序的一次扫描运算 而言,算法首先确定哨兵元素(pivot),并对数据序列进行一次调整,然后对哨兵元素的左右区间再次进行递归调用算法。
& & 如下所示,对任务并行化优化针对每次扫描调整后的左右子区间,将每个子区间的运算抽象为一个任务,并通过OpenMP中的任务并行化原语#pragma omp task实现任务的并行化执行,从而实现了快速排序的任务并行化优化。
& & 任务空间中的数据大小取决于哨兵元素,因此,算法选取的划分算法(Partition Algorithm)应尽量将数据序列的划分均衡化,本文使用简单划分算法和三元中值法(Median-of-Three Method)进行测试。
& & 2.4 缓存优化
& & 缓存优化(Cache friendly)的目标是减少数据在内存和缓存之间的拷贝。对于220个整型数据而言,数据大小为4 MB,本文的测试平台()MAP4430的二级缓存为1 MB,需要将数据划分为4个部分。
& & 如下所示,算法将4部分数据分为4个快速排序任务,4部分任务并行执行,完成后每部分数据序列排序完成,需要将4部分数据进行合并形成完成数据序列,因此在并行任务结束后,需要对数据进行归并排序。
& & 3 并行化性能分析
& & 3.1 实验环境介绍
& & 本文采用(Texas Instruments)的OMAP4430嵌入式开发平台。OMAP443O为嵌入式多核处理器,拥有对称多处理双核ARM 处理器(Dual&core ARM &A、一级缓存32 KB、二级缓存1 MB,嵌入式操作系统采用Ubuntul2.O4内核,编译器为arm&linux&gnueabihf&gCC,使用GNU gprof获取算法执行时间。
& & 3.2 性能测试
& & 如下式所示,采用计算加速比的方式来分析并行优化的性能,加速比数值越大表示算法的并行程度越高,最低为1。性能测试采用4个算法版本,包括串行版本、并行2线程、并行4线程和缓存优化版,从不同角度来分析性能。
& & 如图4所示,从折线图可以看出,3种并行化优化算法相对于串行版本,算法的并行性能都有较大提升,如表1所列,其并行加速比分别为1.30、1.29和 1.21。对任务并行优化方案而言,分别使用2线程和4线程版本进行测试,从加速比的分析结果看来,2线程版本较4线程版本略好。理论上并行线程的数目越 多性能越好,但本文采用OMAP443O只有两个对称多处理核心,即使算法拥有4个并行线程,但实际执行的线程只有2个,同时4个线程在获取2个物理处理 器时存在竞争关系,因而造成性能较之2线程版本有所下降。
& & 图4 算法执行时间
& & 评价并行算法优劣还需考虑算法的负载均衡性,如表1、表2所列,缓存优化方案标准差远远小于任务并行化方案。究其原因,对于任务并行化方案而言,不同的测 试数据以及划分算法(partition)对区间的划分有重要影响,从而造成任务执行时间变化范围很大;对于缓存优化方案而言,其实质是数据并行,其每一 个任务都是根据缓存大小进行划分,因此每一个任务处理的数据规模基本一致,每一个任务执行的时间更确定,但由于并行任务执行完成后,需要对数据进行归并, 造成一定的性能下降。
(责任编辑:ioter)
本文链接:
http://www./IC/tech/23.html
声明:物联网在线转载作品均尽可能注明出处,该作品所有人的一切权利均不因本站转载而转移。作者如不同意转载,即请予以删除或改正。转载的作品可能在标题或内容上或许有所改动。
TopeWay Business Media
Copyright (C) 2011 . 本网站所有内容均受版权保护。
未经版权所有人明确的书面许可,不得以任何方式或媒体翻印或转载本网站的部分或全部内容。SMP和NUMA是两种现在最常用的多处理器系统架构.
SMP和NUMA是两种现在最常用的多处理器系统架构.
SMP = Symmetric Multiprocessing , 对称多处理器. 顾名思义, 在SMP中所有的处理器都是对等的,
它们通过总线连接共享同一块物理内存. 我们日常看到的多核PC, 笔记本, 平板, 手机等都是SMP架构的.
图 1 SMP结构
SMP的好处是简单, 易于理解(个人见解), 所以被普遍的应用在中小型计算领域. 他的缺点会随着规模的扩大暴露出来.
因为内存和总线是共享的(实际上除了CPU外, 其它资源都是共享的), 所以这些共享资源就会成为性能瓶颈.
SMP系统都不会很大.
NUMA = Non-Uniform Memory Access. 非均匀访问存储模型. NUMA适用于CPU更多的更大型系统.
它实事求是的将CPU和内存分成许多Node. 在Node内的内存访问速度很快, 而Node之间的内存可以访问但速度慢.
操作系统和应用程序以及程序员都可以知道和控制程序访问的内存.
这样程序员通过使用一些奇技淫巧就能将整个系统的运算性能都压榨出来.
图 2 NUMA结构
上图就是一个由两个Node组成的NUMA系统的示意图.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 非对称多核处理器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信