计算机并行算法的应用报告,湖南大学并行计算课程报告

《湖南大学并行计算课程报告》由会员分享,可在线阅读,更多相关《湖南大学并行计算课程报告(7页珍藏版)》请在人人文库网上搜索。

1、并行系统的调度设计问题我们组选取了五篇关于并行系统调度的相关论文,并进行了总结,完成了ppt的讲解和报告的制作。五篇论文的题目如下: solving the parallel task scheduling problem by means of a genetic approach 通过遗传手段方法解决并行任务调度问题scheduling parallel tasks approximation algorithms 调度并行任务的近似算法scheduling algorithms and support tools for parallel systems 调度算法和支持工具并行系统pra。

2、ctical multiprocessor scheduling algorithms for efficient parallel processing 实用的多处理机调度算法高效的并行处理A new DAG based Dynamic Task Scheduling Algorithm (DYTAS) for Multiprocessor Systems 一种新的基于DAG的动态任务调度算法(DYTAS)的多处理器系统本次报告主要包括以下四个部分:1. 分布式并行操作系统概述2. 分布式并行操作系统调度的算法设计3. 系统性能分析4. 报告总结1.分布式并行操作系统概述1.1 分布式操作系。

3、统的定义分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。其中分布式操作系统负责管理分布式处理系统资源和控制分布式程序运行。它和集中式操作系统的区别在于资源管理、进程通信和系统结构等方面。一个分布式计算机系统是一些独立的计算机的集合,但是对这个系统的用户来说,系统就象一台计算机一样。这个定义有两方面的含义,第一,从硬件角度来讲,每台计算机都是自主的;第二,从软件角度来讲,用户将整个系统看作是一。

4、台计算机。1.2 分布式操作系统的优点分布式计算机系统的特点在于系统中具有多台计算机且所有的计算机都有相等的地位,由于有这个特点,所以与传统的集中式系统相比,分布式计算机系统具备许多优越的性能:经济性:多个计算机能提供比大型机更好的性能价格比。速度:分布式计算机系统能提供比大型机更强大的计算能力。固有的分布性:有一些应用包含了物理上分散的机器。可靠性:当某台机器崩溃时,整个系统仍能正常工作。可扩展性:处理能力可按需增加。1.3 设计分布式操作系统需要注意的问题(1)透明性所谓透明性就是让用户觉得一群机器和一台普通的单处理器系统是一样的。可以在两种层次上达到透明性。最容易的作法就是对用户隐藏分布。

5、性;在更低的一个层次,也可以让系统对程序透明,即系统调用的接口被设计成看不出有多个处理器存在。(2)灵活性大多数分布式系统采用微内核结构,微内核具有很高的灵活性,它一般只提供4种最小的服务:进程问通信机制、某些内存管理工作、有限的低级进程管理和调度、低级的输入,输出。大部分操作系统的服务通过用户级的服务器来实现。(3)可靠性建立分布式系统的目的之一是提高系统的可靠性。它的基本思想是,如果有一台机器坏了,其他机器能够接替它进行工作。高可靠性的分布式系统必须有高可用性和高安全性,另外还应该有容错功能,即一个节点出了故障,修复以后应该能够恢复到原有的正常状态。(4)性能性能问题是任何时候都需要考虑的。

6、问题,一个分布式系统的性能在某些情况下可能比单一的计算机性能略差,这是因为分布式系统的性能和系统中的通信紧密相关。如果通信质量很差,则系统性能相应会很差。在任务调度的同时必须要考虑通信开销,这样才能保证系统的性能。2分布式操作系统调度算法的设计根据分布式系统的定义,分布式系统由多个处理机组成,这些处理机的组织形式可能是工作站集合、一个公共的处理机池或者是某种组合的形式。但无论是哪种形式,都要有一种算法来决定在哪台处理机上运行哪个进程,这就是分布式并行操作系统的调度。2.1 分布式并行调度算法分析上面我们讨论了分布式调度算法的设计问题,这里简要分析几种常见的调度算法。(1)图论确定性算法一类广泛。

7、研究的算法是基于这样的一些系统,构成它的进程知道它所要求的CPU和内存要求,并且知道系统中每对进程之间要求的平均通信量。如果系统的CPU数量小于进程数目,则要求将多个进程指派到同一个CPU上。整个算法的思想是使这种指派能够使网络的通信量最小化。整个系统可以表示为一张带权图,每个节点表示一个进程,每条边表示两个进程之间的通信量。从数学的角度来讲,整个问题就变成了如何根据特定的限制将图划分为k个不相连的子图。对于每种满足限制的解决方案,子图内部的边意味着机器内部的通信,可以忽略。从一个子图连向另一个子图的边表示网络通信。算法的目标就是在满足所有的限制下,找到一种划分方式使网络通信量最小。显而易见,。

8、我们是在寻找紧耦合的聚集。但是这些聚集之间很少相互作分布式并行操作系统中调度的研究和实现(2)集中式算法图论算法应用非常有限,因为它需要事先了解完整的信息。这里讨论一种不需要事前了解任何信息的启发性算法。算法中有一个协调者,它保存着一张使用情况表,每个工作站在表中都有一个条目,初值为0。当有重要的事情发生时,将给协调者发消息以更新使用情况表。算法将根据使用情况表决定处理机的分配。这些决定发生在调度事件发生时,即有进程请求处理机、处理机进入空闲状态或者是发生了时钟中断时。这个算法所以是集中式的,是因为它所考虑的是使每台工作站的用户公平地享用系统的计算能力,而不是试图使处理机的利用率最大化。(3)。

9、层次式算法集中式的算法,不能很好地适应大型系统。中央节点很快会成为系统的瓶颈,更不用说是某个节点失效了。这些问题可以用层次式算法来解决。层次式算法基本保持了集中式算法的简单性,并且能够很好地适应大型系统。提出一个监视处理机集合的方法,就是将所有的处理机以一种与网络物理结构无关的方式组织成一个逻辑分层结构。对每组k个工作,分配给管理者一个任务,即跟踪各个工作者谁在忙,谁正空闲。如果系统很大,将会有众多的管理者,所以有的机器要变为管理的管理者。这种层次可以无限扩展下去。如果一个管理者停止了正常的工作,一个方案是选择一个它的直接下属成为临时管理者,取代它的位置。这个选择可以由它的下属共同作出,也可以。

10、由它的同级作出,还可以由它的上级作出。为了避免单个管理者在层次的最上层,可以截去最上层,而在最上层形成一个委员会,拥有最高权利。如果委员会中的一个成员无法工作,其他成员会在下一层中选出一名成员取代其位置。(4)发送者发起分布式启发性算法一个典型的算法是Eager等人在1986年提出的,在他们研究的“最有效代价”的算法中,当创建进程时,创建进程的机器将对一个随机选择的机器发送询问,询问那台机器的负载是否低于某个阚值。如果是,将发送进程,否则,将选择另一台机器并发送询问。这个过程不会一致持续下去,如果在N次询问内还没有找到合适的机器,算法将停止,新进程将在创建它分布式并行操作系统中调度的研究和实现。

11、然而,在负载十分重的情况下,所有的机器都会不停地毫无意义地向其他机器发送询问,想找到一台愿意接受更多工作的机器。在这种情况下,几乎没有机器会被减轻负载,但却引起系统相当可观的额外开销。(5)接收者发起分布式启发性算法根据这个算法,当一个进程结束时,系统将检查自己是否有足够的工作可以做,如果没有,将随机向一台机器申请工作。如果那台机器没有要给予的工作,系统将继续询问第二、第三台机器。如果连续N次询问都没有申请到工作,系统将暂时停止申请,开始处理系统队列中一个等待的进程,当这个进程结束后,再开始下一轮申请。如果系统无事可做,则将进入空闲状态,一定的时间后,它从新开始申请。这个算法的好处就是它不会在。

12、系统非常繁忙的时候给系统增加额外的负载,当然,在系统几乎没有事情可做的时候,会拼命向别的机器申请工作,会造成相当大的询问负载。然而,在系统欠载时使系统开销增大总比在系统过载时这样做要好得多。(6)投标算法这种算法试图将计算机系统变成小型的经济社会。由买卖双方和需求关系确定的价格组成。算法的核心参与者是进程,为了完成工作,进程必须购买CPU时间,而CPU则拍卖它的处理机周期给出价最高的买主。每个处理机在一个公共可读文件中公布它们的近似价格。这个价格并不是确定的,而是为了表示所提供服务的大概价格。根据处理机速度、内存容量、浮点运算能力以及其他一些特性,不同的处理机有不同的价格。所提供的服务的指示,。

13、如预期的响应时间也可以同时公布。当一个进程要启动一个子进程时,它将查询现在有谁在提供它所需要的服务,然后确定一个它可以支付得起的处理机集。通过计算,它将从这个处理机集中选出一个最好的。根据应用程序的不同,最好的可以指最便宜的、最快的或最高性能价格比的。然后它将向第一选中的处理机发出一个出价,所出的价格可能会高于或低于已公布的价格。处理机收集向它们发出的所有出价,然后作出决定,可能是选择出价最高的。然后通知选中的未选中的进程,并开始执行被选中的进程。公共文件中此处理机的价格将被更新,以反映处理机的最新价格。3.性能分析一个系统的性能可以用很多指标来体现,对于分布式并行调度子系统来说,最重要的指标。

14、是响应时间和负载均衡,以下我们就对这两个方面对分布式并行调度子系统来进行分析。(1)响应时间响应时间指的是客户从发起调度到获得一个可用的主机IP地址的时间。响应时间的长短可以衡量分布式并行调度的优劣,时间越短越好。(2)负载均衡负载均衡指的是提供服务的主机不能始终集中于某一台主机,而是随机分布在各个主机上。4.总结随着计算机技术的广泛应用,对分布式并行操作系统的需求越来越大,这也是当前国内外操作系统的发展趋势。任务调度是操作系统中一个非常重要的子系统,针对传统的集中式调度子系统的缺点,人们开发了分布式并行调度子系统。本文论述了分布式并行调度的技术,分析了现有的若干调度算法以及调度算法性能指标。设计一个分布式并行操作系统,可以有两途径。一是设计一个全新的系统。这样,由于针对性强,可以获得优秀的性能。但是,设计周期长,而难以继承现有的成功软件。第二种途径是通过对集中式操作系统进行扩充改造,它的优点是:集中式操作系统中的许多部分可以直接继承,研制周期短,而且原来的用户程序可以不加修改地在新系统中运行。

1. 设计目的、意义(功能描述) 蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。本次大作业主要是对蒙特·卡罗方法进行并行处理,通过OpenMP、MPI、.NET、Java、Win32API等一系列并行技术和并行机制对该算法进行并行处理,从而也进一步熟悉了蒙特·卡罗方法的串行算法和并行算法,实现了用蒙特·卡罗方法计算出半径为1单位的球体的体积,体会到了并行技术在实际生活中的应用。 2. 方案分析(解决方案) 蒙特·卡罗方法(Monte Carlo method)是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。球的体积可以估算为:位于点模型内随机点个数与全体随机点个数的比值乘以包围盒的体积算的。 3. 设计分析 3.1 串行算法设计 假定球体用B表示,半径r=1单位,B1是包含B的参考立方体(在本例中是边长为2的正方体),在B1中产生N个均匀分布的伪随机点。对每个随机点检测其是否在B内,假设位于B内的随机点个数为N(in)(<=N),应用蒙特卡洛算法,则B的体积为 V=V1(N(in)/N) 其中V1是B1的体积。如果产生足够多的随机点,理论上可以获得任意逼近精度。 算法描述如下: BEGIN N=_MAX; FOR I=0;I<_MAX;I++ X=RANDOM(); Y=RANDOM(); Z=RANDOM(); IF (X*X+Y*Y+Z*Z)<=1 COUNT++; END IF; END FOR; BULK=V1*(COUNT/_MAX); END; 本算法主要是在参考立方体的选取上和定义的_MAX的值对结果影响较大,所以应该选择合适的数。 3.2 并行算法设计 对FOR循环进行划分使用两个处理器完成计算。例如对一个长为n的序列,首先划分得到两个长为n/2的序列,将其交给两个处理器分别处理;而后进一步划分得到四个长为n/4的序列,再分别交给四个处理器处理;如此递归下去最终得到结果。当然这是理想的划分情况,如果划分步骤不能达到平均分配的目的,那么结果的效率会相对较差。 伪代码如下: BEGIN N=_MAX; FOR1 I=0;I<_MAX/2;I++ X1=RANDOM(); Y1=RANDOM(); Z1=RANDOM(); IF (X1*X1+Y1*Y1+Z1*Z1)<=1 COUNT1++; END IF; END FOR1; FOR2 I=_MAX/2+1;I<_MAX;I++ X2=RANDOM(); Y2=RANDOM(); Z2=RANDOM(); IF (X2*X2+Y2*Y2+Z2*Z2)<=1 COUNT2++; END IF; END FOR2; BULK=V1*((COUNT1+ COUNT2)/_MAX); END; 3.3 理论加速比分析 实验中大量数据所产生的加速比比小量数据所产生的加速比要体现得更明显,并且数据生成的并行加速比随着处理器核的增加而增加。设处理器个数为p,数据量为n,由于正常情况下该快速排序算法的复杂度为O(nlogn),并行处理的时间复杂度为O(klogk),其中k=n/p,所以并行算法的时间复杂度为O((n/p)log(n/p)),理论加速比为nlogn/((n/p)log(n/p))=p+logp. 4. 功能模块实现与最终结果分析 4.1 基于OpenMP的并行算法实现 4.1.1 主要功能模块与实现方法 利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导语句控制产生并行执行代码区段; (4)将数据存放到tianqing_count; (5)各线程调用算法得出结果; 并行算法的部分代码如下: #pragma omp parallel for private(tianqing_x,tianqing_y,tianqing_z) reduction(+:tianqing_count2) for (tianqing_i = 0; tianqing_i<tianqing_max; tianqing_i++) { tianqing_x = rand(); tianqing_x = tianqing_x / 32767; tianqing_y = rand(); tianqing_y = tianqing_y / 32767; tianqing_z = rand(); tianqing_z = tianqing_z / 32767; if ((tianqing_x*tianqing_x + tianqing_y*tianqing_y + tianqing_z*tianqing_z) work1.pSumto(b, 0, MAXN - 1)); Thread newthread1 = new Thread(thread1); 创建Work类的对象work2; ThreadStart thread2 = new ThreadStart(() => work2.pSumto(c, 0, MAXN - 1)); Thread newthread2 = new Thread(thread2); stopwatch.Start(); 启动线程1和线程2; 等待进程结束; stopwatch.Stop(); 得到结果; 4.5.2 实验加速比分析 实验中创建了两个线程,通过多次测试,得出实验结果:由上面的理论加速比分析可知,当线程数为2时,理论加速比为2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,实验加速比达不到理论值3.实验加速比在2.6~2.7左右。 4.6 并行计算技术在实际系统中的应用 4.6.1 主要功能模块与实现方法 该飞机订票系统主要实现了对机票的一些基本信息进行存储和管理的功能。在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 实验加速比分析 实验中创建了两个线程,通过多次测试,得出实验结果:当数据量比较大时,加速比理论在1.9左右。数据量较大时体现出来的加速比更准确。由上面的理论加速比分析可知,当线程数为2时,理论加速比为2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,实验加速比达不到理论值3.实验加速比在2.2~2.4左右。 5. 设计体会 虽然没有按时完成作业,但这份报告花了我好几天的时间,从开始的搭建并行计算平台到最后的程序运行成功可以说是对我的一个锻炼。每一次的遇到问题与每一次的解决问题都是一个成长。每一次遇到问题和解决问题都是一种锻炼,一种尝试,从我们上并行计算课我懂得了很多电脑硬件和软件的知识,这些可能对于我们这个专业以后都是没有机会接触的,所以我觉得选择了并行计算与多核多线程技术这门课是非常正确的。对OpenMP、MPI、WIN32API、Java、.NET的并行技术有了一定的了解。在搭建MPI并行程序这块,学习的知识尤为增加,这些都是在不断的摸索、学习中学会的。 这次的大作业虽然是对以前实验的整合,但它加深了我对并行计算的印象,也使我对并行计算知识的理解更加深刻,也使我认识到了自己很多不足之处。学习并行计算的历程不会因为完成本次大作业而停止,我们是为了用知识武装大脑而学习,通过学习充实自己的生活,要努力学习,争取以后能够完成规模更大的程序。
1. 设计目的、意义(功能描述) 蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。本次大作业主要是对蒙特·卡罗方法进行并行处理,通过OpenMP、MPI、.NET、Java、Win32API等一系列并行技术和并行机制对该算法进行并行处理,从而也进一步熟悉了蒙特·卡罗方法的串行算法和并行算法,实现了用蒙特·卡罗方法计算出半径为1单位的球体的体积,体会到了并行技术在实际生活中的应用。 2. 方案分析(解决方案) 蒙特·卡罗方法(Monte Carlo method)是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。球的体积可以估算为:位于点模型内随机点个数与全体随机点个数的比值乘以包围盒的体积算的。 3. 设计分析 3.1 串行算法设计 假定球体用B表示,半径r=1单位,B1是包含B的参考立方体(在本例中是边长为2的正方体),在B1中产生N个均匀分布的伪随机点。对每个随机点检测其是否在B内,假设位于B内的随机点个数为N(in)(<=N),应用蒙特卡洛算法,则B的体积为 V=V1(N(in)/N) 其中V1是B1的体积。如果产生足够多的随机点,理论上可以获得任意逼近精度。 算法描述如下: BEGIN N=_MAX; FOR I=0;I<_MAX;I++ X=RANDOM(); Y=RANDOM(); Z=RANDOM(); IF (X*X+Y*Y+Z*Z)<=1 COUNT++; END IF; END FOR; BULK=V1*(COUNT/_MAX); END; 本算法主要是在参考立方体的选取上和定义的_MAX的值对结果影响较大,所以应该选择合适的数。 3.2 并行算法设计 对FOR循环进行划分使用两个处理器完成计算。例如对一个长为n的序列,首先划分得到两个长为n/2的序列,将其交给两个处理器分别处理;而后进一步划分得到四个长为n/4的序列,再分别交给四个处理器处理;如此递归下去最终得到结果。当然这是理想的划分情况,如果划分步骤不能达到平均分配的目的,那么结果的效率会相对较差。 伪代码如下: BEGIN N=_MAX; FOR1 I=0;I<_MAX/2;I++ X1=RANDOM(); Y1=RANDOM(); Z1=RANDOM(); IF (X1*X1+Y1*Y1+Z1*Z1)<=1 COUNT1++; END IF; END FOR1; FOR2 I=_MAX/2+1;I<_MAX;I++ X2=RANDOM(); Y2=RANDOM(); Z2=RANDOM(); IF (X2*X2+Y2*Y2+Z2*Z2)<=1 COUNT2++; END IF; END FOR2; BULK=V1*((COUNT1+ COUNT2)/_MAX); END; 3.3 理论加速比分析 实验中大量数据所产生的加速比比小量数据所产生的加速比要体现得更明显,并且数据生成的并行加速比随着处理器核的增加而增加。设处理器个数为p,数据量为n,由于正常情况下该快速排序算法的复杂度为O(nlogn),并行处理的时间复杂度为O(klogk),其中k=n/p,所以并行算法的时间复杂度为O((n/p)log(n/p)),理论加速比为nlogn/((n/p)log(n/p))=p+logp. 4. 功能模块实现与最终结果分析 4.1 基于OpenMP的并行算法实现 4.1.1 主要功能模块与实现方法 利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导语句控制产生并行执行代码区段; (4)将数据存放到tianqing_count; (5)各线程调用算法得出结果; 并行算法的部分代码如下: #pragma omp parallel for private(tianqing_x,tianqing_y,tianqing_z) reduction(+:tianqing_count2) for (tianqing_i = 0; tianqing_i<tianqing_max; tianqing_i++) { tianqing_x = rand(); tianqing_x = tianqing_x / 32767; tianqing_y = rand(); tianqing_y = tianqing_y / 32767; tianqing_z = rand(); tianqing_z = tianqing_z / 32767; if ((tianqing_x*tianqing_x + tianqing_y*tianqing_y + tianqing_z*tianqing_z) work1.pSumto(b, 0, MAXN - 1)); Thread newthread1 = new Thread(thread1); 创建Work类的对象work2; ThreadStart thread2 = new ThreadStart(() => work2.pSumto(c, 0, MAXN - 1)); Thread newthread2 = new Thread(thread2); stopwatch.Start(); 启动线程1和线程2; 等待进程结束; stopwatch.Stop(); 得到结果; 4.5.2 实验加速比分析 实验中创建了两个线程,通过多次测试,得出实验结果:由上面的理论加速比分析可知,当线程数为2时,理论加速比为2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,实验加速比达不到理论值3.实验加速比在2.6~2.7左右。 4.6 并行计算技术在实际系统中的应用 4.6.1 主要功能模块与实现方法 该飞机订票系统主要实现了对机票的一些基本信息进行存储和管理的功能。在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 实验加速比分析 实验中创建了两个线程,通过多次测试,得出实验结果:当数据量比较大时,加速比理论在1.9左右。数据量较大时体现出来的加速比更准确。由上面的理论加速比分析可知,当线程数为2时,理论加速比为2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,实验加速比达不到理论值3.实验加速比在2.2~2.4左右。 5. 设计体会 虽然没有按时完成作业,但这份报告花了我好几天的时间,从开始的搭建并行计算平台到最后的程序运行成功可以说是对我的一个锻炼。每一次的遇到问题与每一次的解决问题都是一个成长。每一次遇到问题和解决问题都是一种锻炼,一种尝试,从我们上并行计算课我懂得了很多电脑硬件和软件的知识,这些可能对于我们这个专业以后都是没有机会接触的,所以我觉得选择了并行计算与多核多线程技术这门课是非常正确的。对OpenMP、MPI、WIN32API、Java、.NET的并行技术有了一定的了解。在搭建MPI并行程序这块,学习的知识尤为增加,这些都是在不断的摸索、学习中学会的。 这次的大作业虽然是对以前实验的整合,但它加深了我对并行计算的印象,也使我对并行计算知识的理解更加深刻,也使我认识到了自己很多不足之处。学习并行计算的历程不会因为完成本次大作业而停止,我们是为了用知识武装大脑而学习,通过学习充实自己的生活,要努力学习,争取以后能够完成规模更大的程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值