【计算机系统结构实验】实验5 多核编程(OpenMP编程)

5.1 实验目的

加深对多核处理器架构的理解;

掌握使用OpenMP进行多线程编程的基本方法;

学习Windows和OpenEuler环境下多核编程的过程和time命令;

5.2 实验平台

  1. 需要多核处理器的计算机和微软编程工具Visual Studio 2012。
  2. Taishan服务器,已经安装Openeuler操作系统,安装gcc编译器,学生用PC实验机和相关账号访问。

5.3 实验内容

1. Windows环境下的多核编程

1)Visual Studio环境中,新建一个空项目,在项目属性中打开OpenMP支持即可(如图所示)。

2)添加项目中的cpp源文件,代码如下:

#include <iostream>
#include <time.h>
using namespace std;
void test()
{int a = 0;for (int i=0;i<100000000;i++)a++;}int main()
{clock_t t1 = clock();for (int i=0;i<8;i++)test();clock_t t2 = clock();cout<<"time: "<<t2-t1<<endl;getchar();}

 

查看记录一下运行时间(这是完全串行执行的时间)。

3)然后在for 循环前面增加一行:#pragma omp parallel for

即代码如下:

#include <iostream>
#include <time.h>
using namespace std;
void test(){int a = 0;for (int i=0;i<100000000;i++)a++;}int main(){clock_t t1 = clock();#pragma omp parallel forfor (int i=0;i<8;i++)test();clock_t t2 = clock();cout<<"time: "<<t2-t1<<endl;getchar();}

 

再查看记录一下运行时间(这是把for循环部分变成多线程并行执行的时间。线程数目就是你电脑CPU的默认线程数目)。分析一下程序性能提升了多少。

执行时间从1305减小至234,多线程并行比完全串行减少了82%。

2. Openeuler环境下的多核编程

1)在实验机器上,使用学生账号通过SSH方式远程连接Taishan服务器 (用户名:stud001——stud140,密码:1)

2)使用lscpu命令,了解Taishan服务器CPU信息,包括CPU(s): 、Thread(s) per core、Core(s) per socket、Socket(s)

 3)使用vim编辑器,创建程序threads.c,并使用gcc编译该程序

 4)运行threads程序,查看并记录运行结果

 5)使用time命令查看real时间(墙上时间(wall clock time)

 6)在threads.c的基础上进行修改,加入多线程指令,了解OMP用法及默认线程数。建立threadsOMP.c程序,使用gcc -fopenmp命令编译后,运行并查看程序结果。观察程序运行时间的变化,并分析原因。

可以看到,96个线程的程序运行时间并不比完全串行执行的时间少,原因可能是clock()测量所有线程的累积时间,上下文切换影响到了多线程的执行速度。

7)使用time命令运行threadsOMP程序,查看墙上时间,比较与之前程序的差异。

    可以看到,96个线程的程序运行时间比完全串行执行的时间多约0.05。但是,96个线程的程序运行的real时间比完全串行执行的real时间少了约87%,user用户CPU时间不相上下,sys系统CPU时间比完全串行执行的时间多了线程切换时间。可见,多个线程可明显降低real执行时间,但是由于上下文切换等原因,程序运行时间反而比完全串行执行的时间长。

8)修改程序使用不同线程数(变量nt)运行程序观察程序结果及墙上时间的变化。列表记录nt为1、2、4、6、8、9、10、32、96时的运行时间

线程数(nt=)

程序结果Time

Real(s)

User(s)

Sys(s)

1

2.537147

2.485

2.560

0.009

2

2.560795

1.244

2.554

0.008

4

2.580562

0.672

2.582

0.000

6

2.549261

0.624

2.545

0.008

8

2.541675

0.314

2.290

0.268

9

2.535507

0.314

2.552

0.004

10

2.541194

0.314

2.325

0.231

32

2.537887

0.314

2.537

0.008

96

2.534621

0.314

2.549

0.008

可以看到,1个线程的程序结果Time与32个线程的程序结果Time差不多,从线程数为2开始,线程数越多,程序结果Time越小;从线程数为1到线程数为8,程序运行的real时间大幅减少,而从线程数为8往后,线程数的增加不会对程序运行的real时间产生较大影响;线程数的变化不会对程序运行的user用户CPU时间和sys系统CPU时间产生较大影响。

-------------------------------------------------------------------------------------------------------

最后一点碎碎念:如果各位有发现本文有哪处有误或理解不当的地方,敬请指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293465.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS 开发 - MASShortcut

文章目录 关于 MASShortcut项目结构 快速使用源码学习检测是否有热键冲突处理 Event macOS 开发交流 秋秋群&#xff1a;644096295&#xff0c;V : ez-code 关于 MASShortcut MASShortcut 是一款快捷键管理工具&#xff0c;替代和兼容 ShortcutRecorder github : https://git…

【万能技巧】IP知识速通与小技巧~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构 三、IP实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP3.3 使用IPIDEA进行爬虫实操 前言 各位友友&#xff0c;大家好&#xff0c;马上就到2024年了&#xff0c;…

一款外置MOS开关降压型 LED 恒流控制器应用方案

一、基本概述 TX6121 是一款高效率、高精度的降压型大功率 LED 恒流驱动控制器芯片。芯片采用固定关断时间的峰值电流控制方式&#xff0c;关断时间可通过外部电容进行调节&#xff0c;工作频率可根据用户要求而改变。 通过调节外置的电流采样电阻&#xff0c;能控制高亮度 LE…

引领汽车营销新趋势,3DCAT实时云渲染助力汽车三维可视化

当前&#xff0c;汽车产业发展正从电动化的上半场&#xff0c;向智能化的下半场迈进。除了车机技术体验的智能化之外&#xff0c;观车体验的智能化也不容忽视。 这是因为&#xff0c;随着数字化、智能化、个性化的趋势&#xff0c;消费者对汽车的需求和期待也越来越高&#xf…

【华为鸿蒙系统学习】- HarmonyOS4.0之App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

Python教你如何让代码摆脱死循环的困扰!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在编写Python代码时&#xff0c;无限循环是一个常见的问题&#xff0c;可能导致程序陷入死循环&#xff0c;使得代码无法正常执行。这篇博客将介绍一些方法&#xff0c;帮助大家防止和处理无限循环&#xff0c;确…

蓝桥杯2019年10月青少组Python程序设计省赛真题

1:有n个人围成一个圈,按顺序排好号然后从第一个人开始报数(从1到3报数),报到3的人退出圈子,然后继续从1到3报数,直到最后留下一个人游戏结束,问最后留下的是原来第几号输人描迹:输人一个正整数n 输出描迹:输出最后留下的是原来的第几号 [样例输人] [样例输出] 2: 3、 […

「C/C++ 01」 深拷贝和浅拷贝

目录 一、概念 1. 浅拷贝 2. 深拷贝 3. 深浅拷贝问题 4. 总结 二、在C的类中实现深拷贝 1. 拷贝构造函数 中实现深拷贝 a. 自己开辟一个新空间&#xff0c;然后将内容拷贝到新空间 b. 借助构造函数来实现深拷贝 2. operator 中实现深拷贝 a. 自己开辟一个新空间&#xff0c;…

Vue 的两种实现:VSCode 中配置 vue 模板快捷方式的过程

1、创建配置文件&#xff1a; 其一、打开 VSCode &#xff0c;CtrlShiftP, 打开搜索框&#xff1a; 其二、输入&#xff1a;user, 并点击进去 Snippets:Configure User Snippets 其三、输入 vue3js 并回车&#xff1a; 其四、打开项目&#xff0c;发现配置文件 vue3js.code-sn…

提示“由于找不到mfc140u.dll,无法继续执行代码”如何解决?

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到某个动态链接库文件&#xff0c;比如mfc140u.dll。这个问题可能会导致某些应用程序无法正常运行或打开。 一、关于找不到mfc140u.dll文件造成会的问题 mfc140u.dll是Visual C中的一个…

Shell三剑客:awk(格式化输出)

一、格式符 %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g 自动选择合适的表示法 % % 显示%自身 # [.#] 第一个数…

python脚本传参

sys.argvargparse 第一种&#xff1a;argparse 简单使用&#xff1a; import argparse # 创建一个参数解析实例 parser argparse.ArgumentParser(descriptionParameters) # 添加参数解析 parser.add_argument(--training_epoch, typeint, default3000) parser.add_argument(…