首页 > 其他分享 >OpenMP实验

OpenMP实验

时间:2023-06-10 20:23:57浏览次数:71  
标签:Matrix int 矩阵 len 实验 线程 OpenMP 运行

OpenMP实验

矩阵乘法的OpenMP实现及性能分析

1)运行并测试矩阵相乘程序

测试结果:

image-20230508190254681

并行加速比表格:

线程数 1 2 4 6 8 10 12 14 16
运行时间(预期) 0.088 0.044 0.022 0.015 0.011 0.008 0.007 0.006 0.0055
运行时间(实际) 0.088 0.046 0.026 0.023 0.028 0.042 0.045 0.046 0.05
加速比 1 1.91 3.38 3.83 3.14 2.10 1.96 1.91 1.76

2)上述的并行加速效果如何?为什么?请尽可能优化上述程序,重做一个并行加速比表格

上述并行的加速效果在线程数达到6时达到最佳,之后则逐渐变差。

推测原因可能是:

  • OpenMP的parallel region结束时,线程之间需要同步:即主线程需要等待所有其他线程完成工作之后才能继续。

程序优化:在网络上查找到优化的方法

  1. openmp的for循环中不应当包含有rand。这里我们没有使用rand

  2. 应当先由编译器对程序进行优化。在VS下设置步骤为:首先把解决方案配置由debug调整为release(debug默认不优化),然后点击配置,把优化等级改为优选速度(O2)image-20230515110041697

    再次运行程序:image-20230515110231428

可以看到程序的运行速度大大加快,已经快了一个数量级。但是可以看到单核的性能甚至比除了4核以外的多核性能都要好,该原因尚不清楚。

  1. 发现clock计时函数的一些问题。clock()为各个核心计算用时之和(一般约为并行线程个数与omp_get_wtime()乘积)。它的问题在于如果只是简单的线性执行的程序,那么使用clock() 就可以计算出程序的执行时间,但是其实这个时间是CPU的时间。如果你用clock()计算并行程序执行时间,发现它会把所有CPU的执行都叠加起来。因为我们使用的并行程序,因此不应该使用clock(),而应当使用openMp提供的计时函数omp_get_wtime()。

​ 再次运行程序:image-20230515111436405

发现并没有什么区别,甚至时间更长了。看到有说法说Linux下有区别,VS上两个都一样,遂作罢。

重新计算并行加速比

线程数 1 2 4 6 8 10 12 14 16
运行时间(预期) 0.005 0.0025 0.00125 0.0008 0.0006 0.0005 0.0004 0.0003 0.0003
运行时间(实际) 0.005 0.009 0.006 0.005 0.006 0.008 0.006 0.007 0.006
加速比 1 0.56 0.83 1 0.83 0.625 0.83 0.71 0.83

3)请自行编写一个OpenMP程序,用多线程并行计算两个n阶方阵相乘(一次),n从200以200步速增加到1000,记录下不同n时不同线程数的程序运行时间,分析并行效果。

定义一个结构体Matrix代表矩阵,因此就可分别设定不同规模的矩阵相乘。至于并行计算部分代码则使用实验指导书的。下面是自定义结构体相关函数:

struct Matrix//矩阵结构体
{
	int len;
	int** p;
	Matrix(int len);
	Matrix();
	void setRand();
	void setLen(int len);
};
void comput(Matrix& A, Matrix& B, Matrix& C) { //两个矩阵相乘
	int r, c;
	for (r = 0; r < C.len; r++)
		for (c = 0; c < C.len; c++) {
			for (int i = 0; i < C.len; i++)
				C.p[r][c] += A.p[r][i] * B.p[i][c];
		}
}

运行结果如下图(采用编译器优化):image-20230515112128939

详细列出不同矩阵规模不同线程数下的运行时间,可以看出各个线程数下,随着矩阵规模的增大,运行时间逐渐变长:

做出其并行加速比表格(采用编译器优化):

线程数 1 2 4 6 8 10 12 14 16
运行时间(预期) 2.75 1.375 0.69 0.46 0.34 0.27 0.23 0.20 0.17
运行时间(实际) 2.75 2.27 1.62 1.57 1.73 1.64 1.64 1.67 1.61
加速比 1 1.21 1.70 1.75 1.59 1.68 1.68 1.65 1.71

可以看到仍然是在线程数为6时加速比最高,但是当线程数超过12时,运行时间同样较为理想。

标签:Matrix,int,矩阵,len,实验,线程,OpenMP,运行
From: https://www.cnblogs.com/czy-blogs/p/17471874.html

相关文章

  • 编译原理:词法分析实验
    实验二词法分析实验目的根据PL/0语言的文法规范,编写PL/0语言的词法分析程序。通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的法。掌......
  • 实验七
     task4#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN5#defineM80intmain(){inti,k=0;charch;FILE*fp;fp=fopen("data4.txt","r");if(fp==NULL){printf("......
  • 实验六 turtle绘图与python库应用编程体验
    task1_1实验源码:fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • 202308-啊对对队 实验七 综合软件项目案例
    项目内容班级博客链接2023春软件工程2020级计算机科学与技术本次作业要求链接实验七综合软件项目案例团队名称啊对对队团队课程学习目标1.练习用例图、类图、顺序图、状态图等UML建模技术在软件开发过程中的用途;2.掌握软件项目的数据库逻辑结构设计方法;3.......
  • 实验7
    实验任务1程序源码#include<stdio.h>#include<stdlib.h>#defineN7#defineM80typedefstruct{charname[M];charauthor[M];}Book;intmain(){Bookx[N]={{"《雕塑家》","斯科特.麦克劳德"},{"《灯塔》&qu......
  • 202309-发际线与你作队 实验七 综合软件项目案例
    项目内容课程班级博客链接2020卓越工程师班这个作业要求链接实验七综合软件项目案例团队名称发际线与你们作队我的课程学习目标完成综合软件项目案例,对相关知识进行再次复习这个作业在哪些方面帮助我实现学习目标(1)练习用例图、类图、顺序图、状态图等......
  • 实验七
    实验任务4程序代码:#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;inti=0;charch;fp=fopen("D:\\private\\learning\\data\\data4.txt","r");if(fp==NULL){printf("failtoop......
  • 实验7
    实验任务1task1_1源代码#include<stdio.h>#defineN7#defineM80typedefstruct{charname[M];charauthor[M];}Book;intmain(){Bookx[N]={{"《雕塑家》","斯科特.麦克劳德"},{"《灯塔》","克里斯多夫.夏布特"......
  • 实验7
    task4.c#include<stdio.h>intmain(){inti,k=0;charch;FILE*fp;fp=fopen("data4.txt","r");;if(fp==NULL){printf("failtoopenfile\n");return1;}ch=fgetc(fp......
  • 实验7
    实验任务7task4代码:#include<stdio.h>intmain(){charch;intcount=0;FILE*fp;fp=fopen("data4.txt","r");if(fp==NULL){printf("failtoopenfile\n");return1;}......