基于OpenMP并行求和算法分析

合集下载

OpenMP并行程序设计总结(借鉴)

OpenMP并行程序设计总结(借鉴)

OpenMP并行程序设计(一)OpenMP是一个支持共享存储并行设计的库,特别适宜多核CPU上的并行程序设计。

今天在双核CPU 机器上试了一下OpenMP并行程序设计,发现效率方面超出想象,因此写出来分享给大家。

在VC8.0中项目的属性对话框中,左边框里的“配置属性”下的“C/C++”下的“语言”页里,将OpenMP支持改为“是/(OpenMP)”就可以支持OpenMP了。

先看一个简单的使用了OpenMP程序int main(int argc, char* argv[]){#pragma omp parallel forfor (int i = 0; i < 10; i++ ){printf("i = %d/n", i);}return 0;}这个程序执行后打印出以下结果:i = 0i = 5i = 1i = 6i = 2i = 7i = 3i = 8i = 4i = 9可见for 循环语句中的内容被并行执行了。

(每次运行的打印结果可能会有区别)这里要说明一下,#pragma omp parallel for 这条语句是用来指定后面的for循环语句变成并行执行的,当然for循环里的内容必须满足可以并行执行,即每次循环互不相干,后一次循环不依赖于前面的循环。

有关#pragma omp parallel for 这条语句的具体含义及相关OpenMP指令和函数的介绍暂时先放一放,只要知道这条语句会将后面的for循环里的内容变成并行执行就行了。

将for循环里的语句变成并行执行后效率会不会提高呢,我想这是我们最关心的内容了。

下面就写一个简单的测试程序来测试一下:void test(){int a = 0;clock_t t1 = clock();for (int i = 0; i < 100000000; i++){a = i+1;}clock_t t2 = clock();printf("Time = %d/n", t2-t1);}int main(int argc, char* argv[]){clock_t t1 = clock();#pragma omp parallel forfor ( int j = 0; j < 2; j++ ){test();}clock_t t2 = clock();printf("Total time = %d/n", t2-t1);test();return 0;}在test()函数中,执行了1亿次循环,主要是用来执行一个长时间的操作。

一种基于OpenMP的并行混合PVS算法

一种基于OpenMP的并行混合PVS算法
Z o u J i n g ,Ma Hu a ,Xi e Ku n ( 1 . S c h o o l o f I n f o r m a t i o n S c i e n c e& E n g i n e e r i n g , Hu n a n I n t e r n a t i o n a l E c o n o m i c s U n i v e r s i t y , C h a n g s h a 4 1 0 2 0 5 ,C h i n a; 2 . S c h o o l o f I n f o r m a —
邹 竞 , 马 华 , 谢 鲲
( 1 . 湖南 涉外经 济学 院 信 息科 学与 工程 学院 , 长沙 4 1 0 2 0 5 ; 2 . 湖 南 大学 信 息科 学与 工程 学院 , 长沙 4 1 0 0 8 2 )
摘 要 :针对传 统 串行 混合 P V S ( p i r n c i p a l v a i r a t i o n s e a r c h , 主要 变例 搜 索) 算 法的 计 算量 大 、 执 行耗 时长 和 无 法
t i o n S c e i ce& E n n g i n e e r i n g, H u n a n U n i v e r s i t y , C h a n g s h a 4 1 0 0 8 2 ,C h i n a )
Ab s t r a c t :T h e t r a d i t i o n a l h y b i r d P VS a l g o r i t h m f a i l s i n l a r g e a mo u n t o f c lc a u l a t i o n a n d l o n g e x e c u t i o n t i me ,a n d c a n n o t t a k e a d v a n t a g e o f t h e mu l t i ・ c o r e s r e s o u r c e s .T h i s p a p e r p r o p o s e d a p a r a l l e l h y b i r d P VS a l g o it r h m b a s e d o n Op e n MP.r I 1 h i s a l g o it r h m u s e d t h e P VS p l i t t i n g s t r a t e g y.a n d t h r e a d e d t h e s e rc a h f o r t h e b r a n c h s o f e v e r y l e v e l ’ S i f r s t P V n o d e o n g a me — t r e e f r o m b o t t o m t o u p.e x e c u t e d b y p a r ll a e l p r o c e s s i n g o n mu l t i — c o r e s C P U.I t a l s o p r e s e n t e d t h e r a t i o n a l d e s i g n e d o f c it r i c a l s e c t i o n a n d t h r e a d s c h e d u l i n g or f i mp r o v i n g t h e s e a r c h e ic f i e n c y .F i n a l l y。t h i s p a p e r c o n d u c t e d e x p e ime r n t s o n t h e b a s i s o f a r e a l C h i n e s e c h e s s c o mp u t e r g a me s y s t e m. n 1 e r e s u l t s s h o w t h a t t h i s a l g o r i t h m h a s h i g h p r u n i n g e ic f i e n c y a n d s p e e d u p r a t i o .a n d c a n i mp r o v e r e — ma r k a b l y t h e p e r f o r ma n c e o f h y b i r d P V S lg a o i r t h m. Ke y wo r d s:p a r a l l e l c o mp u t i n g ;h y b id r P VS a l g o it r h m;g a me — t r e e ;Op e n MP;P V S p l i t t i n g

基于MPIOpenMP混合模型的并行处理算法设计

基于MPIOpenMP混合模型的并行处理算法设计

基于MPI+OpenMP混合模型的并行处理算法设计林荫21、黑保琴2(1.中国科学院研究生院北京 100190;2.中国科学院光电研究院北京 100190)摘要:随着空间数据量的增大和下行速率的大幅度提高,如何将并行计算技术应用于数据处理系统已经成为了当前研究的重要课题。

本文讨论了基于MPI+OpenMP混合模型的并行程序设计问题,提出了一种并行数据处理软件的设计方案。

关键词:MPI OpenMP 并行数据处理1.引言随着空间科学技术的发展,数据下行速率有了很大程度的提高,数据处理的时效性成为人们关注的焦点。

近年来多核结构和微处理技术发展迅速,集群正逐渐成为主流的并行计算平台,应用于各个领域之中。

其显著特点是性价比高和可扩展性好。

MPI是消息传递接口标准,在集群计算中广为应用,但是在多核处理器构成的集群(以SMP为代表)上仅采用MPI消息传递模型并不能取得理想的性能。

为了结合分布式内存结构和共享式内存结构两者的优势,人们提出了分布式/共享内存层次结构。

OpenMP是共享存储编程的实际工业标准,在SMP集群上应用MPI +OpenMP混合编程模型,可以实现结点内和结点间两级并行,有效地改善系统性能。

2. MPI+OpenMP混合编程模型2.1 分布式共享内存结构并行计算机按照存储方式可以分为分布式内存并行计算机,共享内存并行计算机和分布式共享内存并行计算机3种,如图2.1所示。

a)分布式内存并行计算机 b)共享内存并行计算机 c)分布式共享内存并行计算机图 2.1 按存储方式划分的并行计算机结构分布内存并行计算机由多个具有局部存储模块的相互独立的处理节点通过互联网连接而成,具有很好的可扩展性和性能,但不同节点间的通信要使用消息传递机制,加大了程序设计的难度。

共享内存并行计算机中,各处理单元通过对共享内存的访问来交换信息,协调各处理器的任务。

编程相对简单,但共享内存往往成为性能尤其是扩展性的瓶颈。

分布式共享内存并行计算机结合了以上两种二者的特点,节点间属于分布式内存结构,节点内各处理器间属于共享内存结构,MPI+OpenMP混合模型就是针对这种结构的。

基于OpenMP的并行蚁群算法求解协同空战火力分配

基于OpenMP的并行蚁群算法求解协同空战火力分配

0引言 空战火力分配是研究现代空战中有关火力运用和作战
决策的一个重要课题。空战火力分配问题是指在超视距多 机协同多目标攻击空战环境中,我方空战指挥控制系统根 据敌方多架飞机的威胁权重值,及时有效地将我方机载空 空导弹分配到导弹攻击区内的多个目标,以最大限度地消 除敌方目标的威胁。目前,已经证明空战火力分配问题属 于完全 非 确 定 多 项 式 ( non-deterministic polynomia,NP) 问 题[1],传统的求 解 方 法 通 常 具 有 指 数 阶 的 时 间 复 杂 度,当 我机数目、导弹 数 目 和 目 标 数 目 都 很 大 时,将 发 生 组 合 爆 炸,进而在有限决策时间内难以求得问题最优解,满足不了 空战决策实时性要求。
( 6)
N
∑ xij ≤1( i = 1,2,…,Z) .
( 7)
j =1
其中,pij 为目标 j 的毁伤概率门限。式( 5) 表示在一个 火力分配方案中,如果目标 j 的联合毁伤概率 pj 小于 ptj ,则 认为是无效分配,式( 7) 表示一枚导弹只能攻击一个目标。 该数学模型的意义在于,在满足毁伤概率门限的前提下,将 目标相对我机的威胁、我机导弹对目标的毁伤概率以及导 弹武器资源的消耗 3 个因素综合考虑,通过比较各种导弹 对目标的组合对火力分配目标函数值的贡献来进行导弹的 优化分配,从而达到在获得最大火力分配效能的同时,节省 武器资源,且能保证威胁度大的目标被优先攻击。 2 并行蚁群算法求解火力分配问题
在以往的静态火力分配数学模型中,目标 j 必须被攻
击,且至少分配一枚导弹进行攻击,具体分配数目由指控系
统根据实际情况给出。本文采取优先选择毁伤概率高的导
弹优先攻击价值系数高的目标的“双优分配原则”,针对特

OpenMP在并行计算中的应用

OpenMP在并行计算中的应用

kin=kin+dotr8(nd.vel(1,i),vel(1,j))
enddo
¥omp end parallel do


_呈_荃 叫



叩 _呈



帆蚰

比反而降低。所以为了提高并行加速比,应该尽量优化那
些自身计算量较大的循环,而对循环耗时相当少的循环
就不必进行并行优化。
!¥omp parallel do
支持OpenMP
API的编译器通过命令行参数激
活和编译所有的OpenMP编译指令。
2.1
OpenMP指令格式 OpenMP的指令格式为: 标识符指令名[选项1[【,】选项2.】¨…・】
指令名后的选项可以以任意次序排列,需要时也可
重复。编译指令不能嵌入Fortran语句中,Fortran语句也 不能嵌入编译指令中。 Fortran自由格式文件以【¥OMP作为OpenMP编译 指令的标识符。固定格式文件以!¥OMP、C¥OMP或+ ¥OMP作为OpenMP编译指令的标识符。 在固定格式文件中,标识符必须为一行中的第一列。 自由格式文件中,标识符前面必须有空格或跳格,但不限
下的运动情况。试验中粒子数取为500,物理空间取为3 维,积分步长为10’4s,模式初态取粒子静止,模式向前积 分1 000步。 首先进行串行版本的试验,其结果为:CPU
634.51 s。然后利用PGI TIME=
选项中operator为+、}、一、.AND…OR…EQV.或.NEQV
中的一个,intrinsic—procedure—name为MAX、MIN,、 IAND、IOR、IEOR中的一个。REDUCTION选项的实现过 程为:首先,根据运算符的特点给list中的变量(假定为z) 赋初值,如operator为+时赋x=0,而operator为十时赋 x=1;然后,各进程分别计算各自的#值记为expr或ex. pr—list;最后,对各个线程依次进行如下运算:*=x

OpenMP并行计算

OpenMP并行计算

生成阶段实例
• 输入数据 • K.w:( 42 5 76 24 67 8 42 54) • K.p: (43 5 2 65 73 49 36 96)
• 将K平均分成2部分: • K1.w:(42 5 76 24) K1.p: (43 5 2 65) • K2.w: (67 8 42 54) K2.p: (73 49 36 96)
– PRAM共享存储计算机模型是一种理论模型 – 它对于设计和实现并行算法仍然具有重要的理 论意义
背包问题的并行算法两种基本思路
基于动态规划思想
基于分治思想
成熟
子集和问题
0-1背包问题
成熟
未获关注
基于动态规划思想0-1背包问题的并 行算法性能分析
以上基于动态规划并行算法:在复杂度分析时不仅需要考虑背包物品的规 模,而且还要考虑到背包的容量
搜索算法
• 经过剪块算法,可以保证内存中最多只剩下2l-1个 块对,将块对平均分配到l个处理器内,可以保证 每个处理机最多只包含2个块对。
• 因此在搜索阶段每个处理机对本处理机上的块对 执行单方向的顺序搜索,即串行的二表算法,可 以最终求出问题的解。如设处理器Pi中分配的块 对为(As,Bt),则搜索阶段算法如下图表示:
最优归并流程
最优归并算法复杂度分析:
• 调用log l 次切分算法,其中切分算法时间为 log(m+n) • l个处理机并行归并的时间为(m+n)/l
• 综上:总运行时间为log l * log(m+n)+(m+n)/l, 且并归算法是无存储访问冲突的。
• 值得注意:由于需要递归调用log l次切分算法, 故最优归并算法所需的处理机个数l应该是2的幂 • 该最优归并算法将在并行二表和三表并行算法的 生成阶段起到重要的作用。

基于OpenMP的并行求和算法的研究与分析

基于OpenMP的并行求和算法的研究与分析

基于OpenMP的并行求和算法的研究与分析【摘要】目前几乎所有主流CPU厂商都致力于大力发展多核处理器,增加芯片支持的并行能力,从而提升计算机运算速度。

本文主要探讨近来流行的多核计算技术,介绍一种重要的工业标准OpenMP,以及通过一个基于OpenMP的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。

【关键词】多核处理;并行求和算法;多线程;OpenMP0.引言多核技术始终是近年来全球计算机技术发展的重要内容。

自从英特尔在2006年底发布了全球第一基于OpenMP的并行遗传算法探讨397款主流服务器四核处理器后,英特尔一直致力于推动多核应用生态系统的成熟与发展。

实际上,从2002年推出超线程技术开始,英特尔就开始了向多核技术转型的步伐。

最终,英特尔公司将四个计算“大脑”装入一枚处理器中,随着至强5300的诞生,计算机行业宣告正式进入了多核时代。

多核计算将成为一种广泛普及的计算模式,影响企业和消费者用户的使用模式。

如目前的服务器应用,要求高的吞吐率和在多处理器上的多线程应用;Internet的应用、P2P和普适计算的应用都促使了计算机性能的不断提升。

大型企业的ERP、CRM等复杂应用,科学计算、政府的大型数据库管理系统、数字医疗领域、电信、金融等都需要高性能计算,多核技术可以满足这些应用的需求。

本文主要探讨近来流行的多核计算技术,介绍一种重要的工业标准OpenMP,以及通过一个基于OpenMP的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。

1.OpenMPOpenMP是一种适用于多种硬件平台的共享存储编程的工业应用标准,提供了一个可用的编程模型,具有简单、可移植性和可扩展性,灵活支持多线程和负载平衡的潜在能力,目前支持Fortran语言,c和c++。

OpenMP规范中定义的制导指令、运行库和环境变量,能够在保证程序可移植性的前提下,按照标准将已有的串行程序逐步并行化。

基于OpenMP的并行克隆选择算法

基于OpenMP的并行克隆选择算法

活控 制 程 序 的运 行- 。其 中编译 指 导 语 句 是 9 J
O eMP组成 中最重 要 的部 分 , 是编 写 O eMP pn 也 pn 程序 的关键 。
单一的种群 P被划分为子种群 P , ”P , 。P ,f
种群规模为 :
() 2 其 中, Ⅳ为所使用处理器的数量。子种群的规
第3 卷 第6 3 期
21 年 1 月 0 2 1
武 汉 理 工 大 学 学 报 ・ 息 与 管 理 工 程 版 信
J U N L0 T IF R A IN&M N G M N N IE RN ) O R A FWU (N O M TO A A E E TE GN E IG
Vo _ 3 No 6 l3 . De . 0 1 C 2 1

要: 讨论 了一种基于分布式并行模型 的并行克隆选择算法 , 并在 4核 C U的计算机上进行 了验证 。该并 P
行算法 中, 多个子种群代替 了原来单一 的种群 , 每个子种群 独立 地进 化 , 在完成一次进化后每个子种群中最好
的个体将取代其他种群最坏的个体 。并行算 法不仅克服了能量值较早 收敛 的缺点 , 而且能有效地寻找到全局

1 Ope M P n
1 1 Op n . e MP标 准
O eMP是 一种 针对 共享 内存 的多 线 程 编程 pn 技术 , 由一些 具有 国 际影 响 力 的 大规 模 软 件 和硬
件厂商共同定 义 的标准 。 。它是一种 编译指导 。 语句 , 指导多线程 , 共享 内存并行的应用程序编程
文章编号 :07—14 2 1 )6— 9 0一 4 10 4 X(0 1 0 0 2 o
文献标 志码 : A
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于OpenMP的并行求和算法的研究与分析【摘要】目前几乎所有主流cpu厂商都致力于大力发展多核处理器,增加芯片支持的并行能力,从而提升计算机运算速度。

本文主要探讨近来流行的多核计算技术,介绍一种重要的工业标准openmp,以及通过一个基于openmp的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。

【关键词】多核处理;并行求和算法;多线程;openmp
0.引言
多核技术始终是近年来全球计算机技术发展的重要内容。

自从英特尔在2006年底发布了全球第一基于openmp的并行遗传算法探讨397款主流服务器四核处理器后,英特尔一直致力于推动多核应用生态系统的成熟与发展。

实际上,从2002年推出超线程技术开始,英特尔就开始了向多核技术转型的步伐。

最终,英特尔公司将四个计算“大脑”装入一枚处理器中,随着至强5300的诞生,计算机行业宣告正式进入了多核时代。

多核计算将成为一种广泛普及的计算模式,影响企业和消费者用户的使用模式。

如目前的服务器应用,要求高的吞吐率和在多处理器上的多线程应用;internet的应用、p2p和普适计算的应用都促使了计算机性能的不断提升。

大型企业的erp、crm等复杂应用,科学计算、政府的大型数据库管理系统、数字医疗领域、电信、金融等都需要高性能计算,多核技术可以满足这些应用的需求。

本文主要探讨近来流行的多核计算技术,介绍一种重要的工业
标准openmp,以及通过一个基于openmp的并行求和的简单例子来分析和说明并行计算效率与传统串行计算效率比较的优势。

1.openmp
openmp是一种适用于多种硬件平台的共享存储编程的工业应用标准,提供了一个可用的编程模型,具有简单、可移植性和可扩展性,灵活支持多线程和负载平衡的潜在能力,目前支持fortran语言,c和c++。

openmp规范中定义的制导指令、运行库和环境变量,能够在保证程序可移植性的前提下,按照标准将已有的串行程序逐步并行化。

openmp程序开始于一个单独的主线程。

主线程会一直串行地执行,直到遇见第一个并行域才开始并行执行。

并行域表示该部分程序计算量大,需要多个处理器共同来处理以提高效率和运行速度;并行区间以外的部分表示该部分的程序不适宜或者不能并行执行,只能由一个处理器来执行。

主线程创建一队并行线程,然后,并行域中的代码在不同的线程队中并行执行,当主线程在并行域中执行完后,它们或被同步或被中断,最后只有主线程在执行。

实际上,所有的openmp的并行化,都是通过使用嵌入到c/c++或foaran源代码中的编译制导语句来达到的。

在具体实现时,在并行域开始处添加openmp制导指令#pragma,另外,openmp是独立于平台的,如果编译器不支持openmp,将会自动忽略预处理指令#pragma,程序依然可以按照串行程序代码顺利编译执行。

2.传统求和算法
2.1算法设计
传统的求和算法思路相当简单,先定义一个数组,然后随机生成一系列数据放入数组中,再使用循环将各个数据累加存入最后结果变量中即可。

本文先约定定义的是一个long型的数组a,存入的数据为long 型整数,考虑到数组元素的最多个数与测试机器的字长有关,而笔者所使用的测试环境是字长为32位的win7系统,且此算法要与下面的并行求和算法进行比较,因此本着尽可能选取多数据且不超过long型数据范围(2- 1)的原则,本文将存入数组的数据个数n定为65536。

然后使用rand()函数只随机生成1-100的整数,这样保证最后求和的结果也不会超过long型数据的范围,防止了计算过程中数据溢出情况的发生。

2.2具体实现
(1)随机生成数组数据代码实现:
3.基于openmp的并行求和算法
3.1实验前准备
由于现在电脑cpu一般都有两个核,4核与8核的cpu也逐渐走入了寻常百姓家,传统的单线程编程方式难以发挥多核cpu的强大功能,于是多核编程应运而生。

多核编程可以认为是对多线程编程做了一定程度的抽象,提供一些简单的api,使得用户不必花费太多精力来了解多线程的底层知识,从而提高编程效率。

openmp支持的编程语言包括c语言、c++和fortran,支持openmp的编译器包
括sun studio,intel compiler,microsoft visual studio,gcc。

实验使用的是microsoft visual studio 2008,c++语言,cpu为intel i3 2350 双核四线程。

在microsoft visual studio 2008
上openmp的配置非常简单,总共分2步:
(1)新建一个工程。

(2)建立工程后,点击菜单栏->project->properties,弹出菜单里,点击 configuration
properties->c/c++->language->openmp support,在下拉菜单里选择yes。

3.2算法设计
openmp简单易用,在设计算法时我们不需要添加额外的include 头文件和link库文件,只须在合适的地方添加openmp语句即可,例如在for循环前加一句“#pragma omp parallel for”。

而且这些语句运行在单核机器上,或者编译器没有将openmp设为可用的机器上编译也不会报错,将自动忽略#pragma这行代码,然后按照传统单核串行的方式编译运行。

使用openmp来实现并行求和的算法思路也是非常简单的,即把数组分成多块,每个 cpu 核心负责一块的求和,最后把每块的和加起来即可。

但考虑到当多个线程并行执行时,有可能多个线程同时对某变量进行了读写操作,从而导致不可预知的结果,即和的计算不准确的问题,实验使用了openmp 提供的一个工具,归约(reduction),也就是在#pragma omp parallel for 后面加上了 reduction(+:sum),它可以告诉编译
器:下面的for循环你要分成多个线程跑,但每个线程都要保存变量sum的拷贝,循环结束后,所有线程把自己的sum累加起来作为最后的输出。

3.3具体实现
并行求和计算代码实现:
4.算法效率的比较与分析
4.1比较实现
首先,为了保证测试比较的准确性,每一次比较我们都是使用同一个数组,同一组随机生成的数据测。

使用openmp函数库里面的omp_get_wtime()函数来获取当前时间,通过运行前后两个时间值之差来计算算法运行时间。

考虑到单次执行时间远远小于1秒,时间太短,不利于分析,所以在两个求和的算法的代码前加上一个次数为5000的循环。

最后输出求和结果和运行时间。

代码如下:
4.2比较结果与分析
表4.1为两个算法运行5000次的时间累积的时间值。

由表格中的测试结果数据看,平均起来并行求和相对于串行只用了其57% 的时间,效率是有所提高。

但是,由于本实验使用的cpu为双核四线程处理器,即伪四核。

想来如果四核并行求和的话,耗时应是串行的 25% 左右,而这个结果与期望值相差太大。

于是,笔者又将该程序放置安装有货真价实的四核处理器i5 2450上,进行实验,测试结果如表4.2。

测试结果数据表明:并行求和算法用时约为串行的29%。

29% 与
最初预期的 25% 相当接近,考虑到cpu被其他程序共享占用的情况,该结果已经符合之前的期望值,但也从一定程度上说明了使用openmp的归约工具进行并行求和其算法的效率确实要比串行的要高,但是在双核四线程处理器下的效率却不能达到真正四线程的效果。

至此,实验的结束。

5.结束语
本文使用基于openmp工具实现了并行求和算法,并将之与传统的串行求和算法进行了对比和分析,计算效率优势明显。

在这个以多核处理器为主流的时代,openmp将成为程序员必不可少的工具。

随着应用需求的扩大和技术的不断进步,多核技术必将展示出其强大的性能优势。

多核处理器是处理器发展的必然趋势,无论是移动与嵌入式应用、桌面应用还是服务器应用,都将采用多核的架构,因此多核技术应用前景广阔。

参考文献:
[1] 张引琼,戴小鹏. 独立学院java语言教学改革与实践研究[j]. 电脑知识与技术, vol.8,no.8,march 2012:1886~1887.
[2] 骆挺,徐婷婷,孙霞. java课程在民办院校实践教学的思考[j]. 福建电脑, 2012年第3期:43~44.。

相关文档
最新文档