openMP实验总结报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“openmp编程实验总结”。
openMP实验报告
openMP实验报告
目录
openMP实验报告..................................................1 OpenMP简介..................................................1 实验一.......................................................2 实验二.......................................................3 实验三.......................................................5 实验四.......................................................6 实验五.......................................................9 实验六......................................................10 实验七......................................................11 实验八......................................................13 实验总结....................................................15
在学习了MPI之后,我们又继续学习了有关openMP的并行运算,通过老师的细致讲解,我们对openMP有了一个初步的了解:
OpenMP简介
OpenMP是一种用于共享内存并行系统的多线程程序设计的库(Compiler Directive),特别适合于多核CPU上的并行程序开发设计。它支持的语言包括:C语言、C++、Fortran;不过,用以上这些语言进行程序开发时,并非需要特别关注的地方,因为现如今的大多数编译器已经支持了OpenMP,例如:Sun Compiler,GNU Compiler、Intel Compiler、Visual Studio等等。程序员在编程时,只需要在特定的源代码片段的前面加入OpenMP专用的#pargmaomp预编译指令,就可以“通知”编译器将该段程序自动进行并行化处理,并且在必要的时候加入线程同步及通信机制。当编译器选择忽略#pargmaomp预处理指令时,或者编译器不支持OpenMP时,程序又退化为一般的通用串行程序,此时,代码依然可以正常运作,只是不能利用多线程和多核 2
openMP实验报告
CPU来加速程序的执行而已。
OpenMP使得程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,它是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,然而,在OpenMP中,OpenMP库从程序员手中接管了部分这两方面的工作,从而使得程序员可以更加专注于具体的算法本身,而非如何编程使得代码在CPU负载平衡和线程粒度方面做出平衡。但是,作为高层抽象,OpenMP并不适合需要复杂的线程间同步和互斥的场合。OpenMP的另一个缺点是不能在非共享内存系统(如计算机集群)上使用。在这样的系统上,MPI使用较多。
实验步骤:通过编写了一些程序,验证了关于openMP的一些简单的性质。
实验一
代码:
#include “omp.h” #include #include
int main(intargc, char *argv[]){
int id, numb;omp_set_num_threads(3);#pragma omp parallel private(id, numb){ id = omp_get_thread_num();numb = omp_get_num_threads();printf(“I am thread %d out of %d n”, id, numb);} system(“pause”);return 0;}
openMP实验报告
实验结果:
可以看到,因为三个进程同步执行,所以输出顺序是乱序的,就是表示运行优先级相同。当把进程数改成10的时候,得到下面的结果:
与上面的到的结论(并行并行运算)相同。
实验二
代码:
openMP实验报告
#include “omp.h” #include #include
int main(int argc, char *argv[]){ int id;omp_set_num_threads(2);#pragma omp parallel { printf(“what will you see?n”);
#pragma omp for
for(int i = 1;i
{
printf(“ i = %d of %dn”, i,omp_get_thread_num());
printf(“How many answers?n”);
} }
system(“pause”);return 0;}
实验运行结果: 5
openMP实验报告
可以看到,在设置进程为2的情况之下,运算(计算规模)被等可能的分配给各个进程。实验三
代码:
#include #include #include int main(){ #pragma omp parallel sections //声明该并行区域分为若干个section,section之间的运行顺序为并行的关系
{ #pragma omp section
for(int i = 0;i
{
std::cout
} #pragma omp section
for(int j = 0;j
{
std::cout
openMP实验报告
} } } system(“pause”);return 0;运行结果:
结果分析:语句”#pragma omp parallel sections”声明该并行区域分为若干个section,section之间的运行顺序为并行的关系.实验四
代码:
#include
#include #include int main(){ #pragma omp parallel {
for(int i = 0;i
{
std::cout
openMP实验报告
} #pragma omp barrier
for(int j = 0;j
{
std::cout
} } system(“pause”);return 0;} 运行结果:
openMP实验报告
结果分析: 在语句 #pragma omp barrier 的作用下,只有当上面所有的进程计算工作全部完成之后,才会继续barrier之后的工作。
openMP实验报告
实验五
代码: #include #include #include #include
using namespace std;
int main(){ int sum = 0;cout
{
sum += i;
sum += i * 2;
} } cout
openMP实验报告
结果分析: CRITICAL指令指定一块同一时间只能被一条线程执行的代码区域 各个线程还是并行执行for里面的语句,但当你们执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。
实验六
代码:
#include #include #include #include
usingnamespace std;#define NUM_THREADS 2 staticlong num_steps = 100000;
int main(){ int i, id;double x, pi, sum = 0.0;11
openMP实验报告
double step = 1.0 /(double)num_steps;omp_set_num_threads(NUM_THREADS);#pragma omp parallel private(x, i, id)reduction(+:sum){
id = omp_get_thread_num();
for(i = id + 1;i
{
x =(istart);
fflush(stdout);
}
MPI_Finalize();}
实验结果:
实验结果分析:
MPI与openMP的主要区别在于:OpenMP:线程级(并行粒度);共享存储;隐式(数据分配方式),可扩展性差,MPI:进程级;分布式存储;显式;可扩展性好。
在这里,我们将MPI作为一个消息传递机制,在计算机集群之间传递不同进程计算的结果的值,在集群中的单台计算机上使用openMP进行多线程编程,即通过MPI的分布式有点综合openMP的共享内存计算方式来共同结合,从而提 15
openMP实验报告
高运算效率。由实验结果我们可以得知,如果仅仅是使用MPI或者仅仅使用opnMP的情况下,都只能部分程度上达到并行计算的效果,而两者进行综合的话,就可以尽最大可能的发挥计算机集群的运算威力。
实验总结
这次实验,是我们在之前学习过的MPI的基础之上,通过对openMP的学习,进一步了解了关于计算机多核多进程计算的概念。实验过程中,遇到各种各样的问题,老师耐心的予以一一解答。关于MPI与openMP,具体来说,在OpenMp并行编程中,主要针对细粒度的循环级并行,主要是在循环中将每次循环分配给各个线程执行,主要应用在一台独立的计算机上;在MPI并行编程中,采用粗粒度级别的并行,主要针对分布式计算机进行的,它将任务分配给集群中的所有电脑,来达到并行计算;OpenMp+MPI混合编程,多台机器间采用MPI分布式内存并行且每台机器上只分配一个MPI进程,而各台机器又利用OpenMP进行多线程共享内存并行。
感觉这些实验能够是我们对于计算机的高性能计算的一些方式有了一个初步的了解,眼下大数据集中爆发的时代,这种高性能计算的人门式教育更加显得有必要。