基于openMP的并行计算实验

合集下载

华科并行实验报告

华科并行实验报告

一、实验模块计算机科学与技术二、实验标题并行计算实验三、实验目的1. 了解并行计算的基本概念和原理;2. 掌握并行编程的基本方法;3. 通过实验加深对并行计算的理解。

四、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 并行计算平台:OpenMP五、实验步骤1. 准备实验环境首先,在计算机上安装OpenMP库,并配置环境变量。

2. 编写并行计算程序编写一个简单的并行计算程序,实现以下功能:(1)计算斐波那契数列的第n项;(2)计算素数的个数;(3)计算矩阵乘法。

以下为斐波那契数列的并行计算程序示例:```cpp#include <omp.h>#include <iostream>using namespace std;int main() {int n = 30;int fib[31] = {0};fib[0] = 0;fib[1] = 1;#pragma omp parallel forfor (int i = 2; i <= n; i++) {fib[i] = fib[i - 1] + fib[i - 2];}cout << "斐波那契数列的第" << n << "项为:" << fib[n] << endl; return 0;}```3. 编译程序使用g++编译器编译程序,并添加OpenMP库支持。

```bashg++ -fopenmp -o fib fib.cpp```4. 运行程序在命令行中运行编译后的程序,观察结果。

5. 分析结果通过对比串行计算和并行计算的结果,分析并行计算的优势。

六、实验过程1. 准备实验环境,安装OpenMP库并配置环境变量;2. 编写并行计算程序,实现斐波那契数列的并行计算;3. 编译程序,并添加OpenMP库支持;4. 运行程序,观察结果;5. 分析结果,对比串行计算和并行计算的性能。

基于多核的OpenMp并行程序设计

基于多核的OpenMp并行程序设计
【技术研发 】 l 联鞭
基 于 多核 的O p enMp并 行 程 序 设 计
彭 曦 顾炳根 李展 涛 (桂林理工大学 信 息科 学与工程 学院 广西 桂林 541004)
摘 要 : 介绍 多核计算 的出现和 一种面 向共享存储 器的 多处理器 多线程并行 编程语 言OpenMp,然后再 以一个 实例来说 " ̄OpenMp在多核 下如何进 行并行程 序设 计,通过计算 加速 比说 明使用OpenMp编程后程序 执行效率得 到显著提 高
OpenMP是 一种 面 向共 享存 储器 的多处 理器 多 线程 并行 编程 语 言 ,线 程 间通 过共 享变 量传 递数 据结 果 。OpenMP标 准形 成 于1997年 ,它 是一 种API, 用于 编 写可 移植 的 多线 程应 用 程序 。OpenMP程 序 设计 模 型提 供 了一 组 与平 台无 关 的编 译指 令 、指 导命 令 、 函数 调用 和环 境变 量 ,可 以显 式地 指 导编 译器 如何 以及何 时利 用 应用 程 序 中的 并行 性 。OpenMP通 过对 原有 的 串行 代 码 插 入 一 些 指 导 性 的注 释 ,并 进 行必 要 的修 改 ,可 以 快 速 的 实现 并 行 编 程 ,而 这些 注释 的解 析 由编译 器所 完成 。 目前 ,C,c++,Fortran语 言都 支 持OpenMp,所 有OpenMp的并 行化 都 是通 过使用 嵌 入到c,c++或 Fortran源 代 码 中 的编 译制 导语 句来 达到 的 。
Structured—block
OpenMP的所有 编 译指 导 语句 以#pragma omp开 始 ,其 中directive部分 就 包 含 Openllel for、
section、 sections、 single、 master、 critical、 flush、 ordered,

基于OpenMP的短波射线追踪并行计算

基于OpenMP的短波射线追踪并行计算

第 1 期
21 0 2年 2月
中 雹; f唧宪宪 I 国 翻譬 学1 &
Jun lo AE T o r a fC I
V0 . . 17 No 1
F b. 2 1 e 02
工 程 与 应 用
石 l 、 l 石 、 l 、
基 于 Op n e MP的短 波射 线 追踪 并行 计 算
摘 要 : 在基 于分布 共 享存 储 结构 的 高性能计 算机 上 , 究 三维短 波射 线追踪 的并行 化计 算。通 过 研
对 三 维射 线 追踪 串行 程序 的分 析 , 出 了程序在 并行计 算 时需要考 虑 的 因素 , 给 最后采 用 O eMP的 pn
并行 计 算技 术 , 短 波射 线追踪 算 法进 行 了仿 真计 算 。仿 真 结果表 明运 行速 度 得 到 了大 幅度 的提 对
王俊 江 , 利 军。 柳 文 , 许 , 焦培 南
(. 1 中国 电波传播研 究所 , 东青 岛 267 ; 山 60 1 2 电波环境 特 性及模 化技 术 国家重点验 室 , 东青 岛 267 ; . 山 60 1
3 新 乡学 院 , 南新 乡 4 3 0 ) . 河 5 0 3
t e h y r c l o t h n t e HF Ra ta e ag r hm s smu ae sn e MP.Th i lto e u t n iae t a h a l i i i lt d u i g Op n e smu ain r s lsi d c t h tt e r i - n n pe d i mpr v d e o mo l i g s e si o e n r usy,wh c ho h fe t i ft e p o o e t o i h s wst e efc i t o h r p s d me h d. vy Ke r s:HF r y r c pa allc mpu e;Op n y wo d a ta x n nvr t,H nnX ni g 50 3 C i ) .Xn i gU i sy ea ix n 3 0 , hn a ei a 4 a

在fortran下进行openmp并行计算编程

在fortran下进行openmp并行计算编程

在fortran下进⾏openmp并⾏计算编程最近写⽔动⼒的程序,体系太⼤,必须⽤并⾏才能算的动,⽆奈只好找了并⾏编程的资料学习了。

我想我没有必要在博客⾥开⼀个什么并⾏编程的教程之类,因为⽹上到处都是,我就随⼿记点重要的笔记吧。

这⾥主要是openmp的~1 临界与归约在涉及到openmp的并⾏时,最需要注意的就是被并⾏的区域中的公共变量,对于需要reduce的变量,尤其要注意,⽐如这段代码:program mainimplicit noneinclude 'omp_lib.h'integer N,M,ireal(kind=8) tN=20000t=0.0!$OMP PARALLEL DOdo i=1,Nt=t+float(i);M=OMP_get_num_threads()enddowrite(*, "('t = ', F20.5, ' running on ', I3, ' threads.')") t,Mpausestopend串⾏代码可以很容易的得到正确结果:t = 200010000.00000 running on 1 threads.不幸的是,如果是并⾏的话,可能每次都得到⼀个不同的结果:t = 54821260.00000 running on 8 threads.t = 54430262.00000 running on 8 threads.....原因很简单,假设do被并⾏了两个线程,A1,A2,则每个线程都可以t,在其中⼀个线程访问t的时候,另⼀个线程修改了t,导致t的某些值“丢了”。

解决⽅法有两种,第⼀种就是“临界”,就是锁定t:!$OMP PARALLEL DOdo i = 1, N!$OMP CRITICALt = t+float(i)!$OMP END CRITICALM = OMP_get_num_threads()enddo这样每个时刻只有⼀个线程能访问这个变量。

并行计算实验报告

并行计算实验报告

分析 :这样的加速比 , 是符合预测 , 很好的 . 附 :(实验 源码 ) 1 pi.cpp #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <ctime> #include <cassert>
#include <climits> #include <iostream> #include <iomanip> #include <string> #include <vector> #include <set> #include <map> #include <queue> #include <deque> #include <bitset> #include <algorithm> #include <omp.h> #define MST(a, b) memset(a, b, sizeof(a)) #define REP(i, a) for (int i = 0; i < int(a); i++) #define REPP(i, a, b) for (int i = int(a); i <= int(b); i++) #define NUM_THREADS 4 using namespace std; const int N = 1e6; double sum[N]; int main() { ios :: sync_with_stdio(0); clock_t st, ed; double pi = 0, x; //串行 st = clock(); double step = 1.0 / N; REP(i, N) { x = (i + 0.5) * step; pi += 4.0 / (1.0 + x * x); } pi /= N; ed = clock(); cout << fixed << setprecision(10) << "Pi: " << pi << endl; cout << fixed << setprecision(10) << "串行用时: " << 1.0 * (ed - st) / CLOCKS_PER_SEC << endl; //并行域并行化 pi = 0; omp_set_num_threads(NUM_THREADS); st = clock(); int i; #pragma omp parallel private(i) { double x; int id; id = omp_get_thread_num();

并行实验报告

并行实验报告

实验名称:并行处理技术在图像识别中的应用实验目的:1. 了解并行处理技术的基本原理和应用场景。

2. 掌握并行计算环境搭建和编程技巧。

3. 分析并行处理技术在图像识别任务中的性能提升。

实验时间:2023年10月15日-2023年10月25日实验设备:1. 主机:****************************,16GB RAM2. 显卡:NVIDIA GeForce RTX 2080 Ti3. 操作系统:Windows 10 Professional4. 并行计算软件:OpenMP,MPI实验内容:本实验主要分为三个部分:1. 并行计算环境搭建2. 图像识别任务并行化3. 性能分析和比较一、并行计算环境搭建1. 安装OpenMP和MPI库:首先在主机上安装OpenMP和MPI库,以便在编程过程中调用并行计算功能。

2. 编写并行程序框架:使用C++编写一个并行程序框架,包括并行计算函数和主函数。

3. 编译程序:使用g++编译器编译程序,并添加OpenMP和MPI库的相关编译选项。

二、图像识别任务并行化1. 数据预处理:将原始图像数据转换为适合并行处理的格式,例如将图像分割成多个子图像。

2. 图像识别算法:选择一个图像识别算法,如SVM(支持向量机)或CNN(卷积神经网络),并将其并行化。

3. 并行计算实现:使用OpenMP或MPI库将图像识别算法的各个步骤并行化,例如将图像分割、特征提取、分类等步骤分配给不同的线程或进程。

三、性能分析和比较1. 实验数据:使用一组标准图像数据集进行实验,例如MNIST手写数字识别数据集。

2. 性能指标:比较串行和并行处理在图像识别任务中的运行时间、准确率等性能指标。

3. 结果分析:分析并行处理在图像识别任务中的性能提升,并探讨影响性能的因素。

实验结果:1. 并行处理在图像识别任务中显著提升了运行时间,尤其是在大规模数据集上。

2. 并行处理对准确率的影响较小,甚至略有提升。

基于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

基于 MPI + OpenMP 混合编程的水声探测系统效能并行计算方法

基于 MPI + OpenMP 混合编程的水声探测系统效能并行计算方法

F a n Pe i q i n Da Li a ng l o n g Li Yu y a n g Zh o u Ya n x i a
( N a v y S u b m a r i n e A c a d e m y, Q i n g d a o 2 6 6 0 7 1 , S h a n d o n g, C h i n a)
特点 , 可以将上述两种 编程模 型相结合 , 实 现 MP I +O p e n M P的
0 引 言
水声探测 系统 探测效能反映 的是 水声探测装备 、 海洋环境 、
混合编程模型 。
混合编程模 型可以充分利 用两 种编程 模式 的优 点 : M P I 可 以解决多处理器 间的粗 粒度通信 , 而O p e n MP提供 轻量级线 程 ,
时效性 的要求。
关键词
中图分类号
声纳 探测效 能 机群 并行计算
T P 3 1 1 文献标识码 A D O I : 1 0 . 3 9 6 9 / j . i s s n . 1 0 0 0 - 3 8 6 x . 2 0 1 3 . 1 2 . 0 3 0
P ARALLEL CoM P UTI NG T ECHNoLoG Y FoR E FF I CI ENCY oF UNDERW ATER ACoUS TI C DETECTI o N S YS TEM BAS ED oN HYBRI D MP I+OPE NM P PRo GRAM M I NG
k i n d o f e ic f i e n c y c o mp u t a t i o n mo d e l ,a n d s t u d y t h e p a r ll a e l c o mp u t i n g me t h o d f o r u n d e r w a t e r a c o u s t i c d e t e c t i o n s y s t e m e f f i c i e n c y w h i c h i s b a s e d o n h y b r i d MP I+ P o e n MP p r o g r a mmi n g i n c o mb i n a t i o n w i t h t h e h i g h p e r f o r ma n c e c o mp u t i n g p l a t f o r m. C o mp u t a t i o n r e s u l t s h o ws t h a t t h e p a r ll a e l i s e d p r o ra g m c a n b e t t e r me e t t h e r e q u i r e me n t i n r e a l — t i me p r o p e t r y b y t h e c o mp u t a t i o n o f u n d e wa r t e r a c o u s t i c d e t e c i t o n s y s t e m e ic f i e n c y . Ke y wo r d s S o n a r D e t e c t i o n e f f i c i e n c y C l u s t e r P a r Ml e l c o mp u t i n g
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于o p e n M P的并行计算实验文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]并行计算实验报告课程:并行计算姓名:郑波学号44班级:计算机科学与技术13-2班日期:2015年12月7日实验一:OpenMP基本使用一、实验目的1、熟悉OpenMP编程。

2、比较串行算法与并行算法在执行时间上的差别;3、考察线程数目使用不同对并行算法执行时间的影响;4、考察运算规模N对串、并行算法执行时间上的影响。

二、实验内容1、使用OpenMP进行两个矩阵A和B的加法,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响三、实验步骤1、整个程序的设计流程①全局变量设置三个宏定义过的size×size的二维数组啊a,b,c。

②初始化a数组为全1,b数组为全2③通过omp_set_num_threads()库函数设置线程数④调用openMP库函数omp_get_wtime()获取当前时间start#pragma omp parallel for开始做并行区部分…结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间⑤再次调用时间函数更新strat串行做一边矩阵相加更新end,end-start即为串行耗时代码如下:#include<iostream>#include<>#define size 10000using namespace std;int a[size][size],b[size][size],c[size][size];int main(){for(int i=0;i!=size;++i) //initial the matrixfor(int j=0;j!=size;++j){a[i][j]=1;b[i][j]=2;}double start=omp_get_wtime();omp_set_num_threads(4);#pragma omp parallel forfor(int i=0;i<size;++i)for(int j=0;j<size;++j)c[i][j]=a[i][j]+b[i][j];double end=omp_get_wtime();cout<<"并行运行时间:"<<end-start<<endl;start=omp_get_wtime();for(int i=0;i<size;++i)for(int j=0;j<size;++j)c[i][j]=a[i][j]+b[i][j];end=omp_get_wtime();cout<<"串行运行时间:"<<end-start<<endl;system("pause");}2、问题规模对串、并行程序时间的影响(A、B矩阵的大小为N*M)(1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:(2)可以发现,当矩阵规模较小时,串行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。

并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了3、线程数目对并行程序的影响(这里假设问题规模为:N*M=10000*10000)(1)在使用OpenMP进行并行执行矩阵加法时,我们可以自由设置进行并行计算的并行线程数目。

(2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下表格的时间消耗(3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。

但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。

四、心得体会通过本次实验,了解了openMP库函数,掌握了openMP最基本的多线程程序编写。

通过分析比较串并行运行时间,体会了不同规模下串并行的使用效果。

实验二:使用OpenMP实现圆周率计算的并行算法一、实验目的1、考察问题规模N对圆周率计算精确度的影响;2、考察线程数目对圆周率计算执行时间的影响;3、比较串、并行算法在执行时间上的差别。

二、实验内容1、使用OpenMP和近似计算公式计算圆周率π的大小,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响三、实验步骤1、整个程序的设计流程①全局变量设置宏size,用来描述计算范围②利用如下公式准备计算圆周率π的近似值③通过omp_set_num_threads()库函数设置线程数④调用openMP库函数omp_get_wtime()获取当前时间start#pragma ompparallel for reduction(+:sum)开始做并行区部分注意:其中sum是共享的,因为是个连续和的问题,采用reduction之后,每个线程根据reduction(+: sum)的声明算出自己的sum,然后再将每个线程的sum加起来。

避免各个线程共享sum资源时出现问题…结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间⑤再次调用时间函数更新strat串行做一边矩阵相加更新end,end-start即为串行耗时代码如下:#include<iostream>#include<>#define sizeusingnamespace std;int main(){double sum=0,start,end;omp_set_num_threads(4);start=omp_get_wtime();#pragma ompparallel for reduction(+:sum)for(int i=0;i<size;++i){sum+=4/(1+(+i)/size)*(+i)/size))*1/size;}end=omp_get_wtime();cout<<"并行时间:"<<end-start<<endl;sum=0;start=omp_get_wtime();for(int i=0;i<size;++i){sum+=4/(1+(+i)/size)*(+i)/size))*1/size;}end=omp_get_wtime();cout<<"串行时间:"<<end-start<<endl;(20);cout<<"π:"<<sum<<endl;system("pause");}2、问题规模对串、并行程序时间的影响(N的大小影响时间)(1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:(2)可以发现,当规模较小时,串行算法仍然要比并行算法运行的快,当规模到达一定程度的时候,并行运行的速度较串行有了提升。

并行算法对各个CPU的调度也占用一定的时间,当问题规模很小的时候,这个调度时间占了很大的比重,而在规模较大的时候,这个调度时间就显得微乎其微了3、线程数目对并行程序的影响(这里假设问题规模为:N=100000)(1)在使用OpenMP进行并行执行运算时,我们可以自由设置进行并行计算的并行线程数目。

(2)在并行区域中,通过函数int omp_set_num_threads(int)设置并行区域中要创建的线程数,分别设置为2、4、8、16,得到如下表格的时间消耗(3)观察发现,在问题规模不变的前提下,随着线程数目的增加,问题解决的时间也在相应的减少。

但是,问题消耗的时间并不会随着线程数目的增加而不断的减少,原因可能是因为,随着线程数目的增减,线程的额外准备时间开销也将扩大。

四、心得体会通过本次实验,进一步深入了openMP的编程,对openMP各线程共享资源、各自拥有自己的资源有了初步认识。

再一次体会到了并行计算给大规模计算带来的便利性。

实验三:使用OpenMP求最大值一、实验目的1、掌握求最大值的并行算法2、比较串行算法与并行算法在执行时间上的差别;3、考察线程数目使用不同对并行算法执行时间的影响;二、实验内容1、使用OpenMP求一个乱序数列的最大值,并分析串行、并行时间的差别以及问题规模对程序运行时间的影响三、实验步骤1、整个程序的设计流程本程序实现了平衡树算法,但由于处理器数目有限,并行结果反而不如串行,不过当处理器足够多时(理想情况为数组长度的一半)时,并行会有大的提升。

这里只讲一下平衡树算法思路。

①全局变量设置num×size的二维数组,最后一维用来保存数列其中:num=log(size-1)/log(2)+1;表示平衡树的高度②初始化最后一维数组③通过omp_set_num_threads()库函数设置线程数④调用openMP库函数omp_get_wtime()获取当前时间start#pragma omp parallel for开始做并行区部分…结束后再次调用omp_get_wtime()获取时间end,end-start即为并行消耗时间⑤算法核心部分:算法先处理最后一层平衡树(假设个数为n),两个数据一组比较,取大的,生成新的一层平衡树(个数为n/2或者(n+1)/2),放在二维数组的上一维。

迭代处理每一层,最后使得新的一层个数为1,这个值就是最大值,即a[1][1];并行处理每一层平衡树代码如下:#include<iostream>#include<>#include<>const int size=10000;using namespace std;int a[size+1][size+1];int main(){int num=log(size-1)/log(2)+1;for(size_t i=1;i<=size;++i){ //初始化a[num][i]=i;}int m=0;double start=omp_get_wtime();for(size_t i=1;i<=size;++i) //串行if(a[num][i]>=m)m=a[num][i];double end=omp_get_wtime();cout<<"串行:"<<end-start<<endl;int amax=size;omp_set_num_threads(4);start=omp_get_wtime();for(int k=num-1;k>=0;k--){#pragma omp parallel forfor(int j=1;j<=(amax-1)/2+1;j++){if(2*j>amax)a[k][j]=a[k+1][amax];elsea[k][j]=a[k+1][2*j-1]>a[k+1][2*j]a[k+1][2*j-1]:a[k+1][2*j];}}end=omp_get_wtime();cout<<"并行:"<<end-start<<endl;system("pause");}2、问题规模对串、并行程序时间的影响(数列长度为N)(1)通过不断增加问题规模,观察串行和并行程序的执行时间,得到如下表格的时间消耗数据:(2)可以发现,并行总是比串行慢。

相关文档
最新文档