Parallel Programing

caiyi 2021/6/17

第一章

1.为什么要构建并行系统?

电路晶体管密度过大会使处理器能耗增加,散热的问题使通过继续增快集成电路密度提高处理器性能不再现实,因此集成电路商决定构建多核处理器。

2.为什么要编写并行程序?

之前的串行程序适合之前的传统处理器,为了充分发掘多核处理器的性能,必须对常见串行结构进行并行化以提高性能。

3.如何编写并行程序?

基本思想是把任务分配给各个核,主要有两种方法:任务并行和数据并行。

任务并行指的是把各个的任务分配给不同的核

数据并行指的是将待处理的数据分配给各个核进行处理。

任务并行很可能每个核执行的任务不一样,数据并行分配给每个核的往往是相同的任务。

在并行计算中,需要注意协调过程,包括通信、负载平衡、同步

通信:在不同核把计算结果发送给其他核
负载平衡:每个核的计算的工作量应该大致相等
同步:同步每个核的运算时间

例子1:求累加的n项和
假设把数据分为n组分别累加,有一个接收数据累加和的变量x。正常情况下需要等变量的初始化在往其传数据。
如果变量还没初始化但其他的部分和已经送我来,会导致数据丢失等等。(没有同步的情况)
解决方案:写一个函数给他们一个同步函数(提出要求),让其他的核等,等x初始化后,在传数据(同步)

4.怎么做?

利用消息传递接口(MPI)、POSIX线程和OpenMP来编写基本的并行程序

MPI和Pthread是C语言的扩展库,可以在C程序中使用扩展的类型定义、函数、宏,而OpenMP包含了一个扩展库以及对C编译器的部分修改

共享内存系统:各个核能够共享访问计算机的内存,可以通过检测和更新共享内存中的数据来协调各个核

分布式内存系统:每个核拥有自己的私有内存,核之间的通信是显式的必须使用类似在网络中发消息的机制

Pthreads和OpenMP是共享内存系统,MPI是分布式内存系统

5. 并发、并行、分布式

并发(concurrent):一个程序的多个任务在同一时间段内可以同时执行

并行(parallel):一个程序通过多个任务协同工作去解决一个问题

分布式(distributed):一个程序需要与其他程序协作解决一个问题

并行程序和分布式程序都是并发的

6. 为什么实现并行程序很难

  • Amdahl’s Law 必须并行化大部分计算
  • 数据局部性
  • 通讯与同步
  • 负载不平衡

第二章 并行硬件和并行软件

1.冯诺依曼结构

经典的冯诺依曼结构包括主存、中央处理单元(CPU)以及主存之间的互连结构(总线)

CPU分为控制单元和算术逻辑单元ALU

主存和CPU之间的分离叫做冯诺依曼瓶颈,互连结构限制了指令和数据访问的速率

2.改进冯诺依曼结构

3. 并行硬件

能够通过修改源代码而开发并行性或者必须修改源代码来开发并行性,叫并行硬件。

4. 性能计算

Some definitions:
Token : A group of inputs processed to produce a group of outputs
Latency : Time for one token to pass from start to end
Throughput : The number of tokens that can be produced per unit time

5. 并行算法

竞争:当执行结果取决于两个或多个事件的时间时,存在竞争条件

数据依赖:对必须保留以保持正确性的一对内存操作的排序

同步:用于对线程之间的控制进行排序或对并行代码中的数据访问进行排序

原子性:一组操作是原子的,如果它们同时执行或都不执行。 因此,无法查看部分执行的结果

互斥:最多有一个线程可以随时执行代码

互斥锁的方法有锁争用和粒度差的缺点

如何增加并行粒度:每个线程使用它自己的私有变量,并独立于其他内核执行此代码块。

任务并行性:将解决问题的各种任务划分到内核之间。
数据并行:在核心之间划分用于解决问题的数据,每个核心对其数据的一部分执行类似的操作

总结:如何导出顺序算法的并行版本

  1. Computation Partitioning 计算分区
  2. Preserving Dependences using Synchronization 使用同步保留依赖关系
  3. Reduction Computations减少计算
  4. Overheads费用

四个步骤设计一个并行程序:

  1. 将问题的解决方案划分成多个任务
  2. 在任务间识别出需要的通信信道
  3. 将任务聚合成复合任务
  4. 在核上分配复合任务

6. 数据依赖

定义:如果两个内存访问可能引用相同的内存位置并且其中一个引用是写操作,则它们涉及数据依赖

数据依赖是对必须保留以保持正确性的一对内存操作的排序
数据依赖可以在两个不同的程序语句之间,也可以在同一程序语句的两个不同的动态执行之间

7. 习题解答

第四章 Pthreads

1.介绍

共享内存编程(线程)

​ 启动单个进程和 fork 线程

​ 线程执行工作

​ 线程通过共享内存进行通信

​ 线程通过同步(也通过共享内存)进行协调

分布式内存编程(进程)

​ 在多个系统上启动多个进程

​ 流程执行工作

​ 进程通过消息传递进行通信

​ 进程通过消息传递或同步(生成消息)进行协调

动态线程

有一个主线程,并且在任何给定时刻都有一个(可能是空的)工作线程集合。

主线程通常等待工作请求,当一个新的请求到达时,它会fork一个工作线程,该线程执行请求,当该线程完成工作时,它终止并加入主线程。

这种范例有效地利用了系统资源,因为线程所需要的资源只在线程实际运行时才会被使用

静态线程

在主线程进行任何必要的设置之后会fork出所有的线程,这些线程一直运行直到所有的工作完成。在线程加入主线程后,主线程可能会做一些清理(例如,释放内存),这样被fork出来的线程也会终止。

在资源使用方面效率较低,如果一个线程是空闲的,它的资源都不能被释放。

优点是,它更接近于最广泛使用的分布式内存编程范例

线程安全

如果一个函数或库在被多个同时执行的线程调用时能够“正确”操作,那么它就是线程安全的。

由于多个线程通过共享内存进行通信和协调,因此线程安全代码会使用适当的同步来修改共享内存的状态。

2.Pthread

POSIX: Portable Operating System Interface for UNIX,是UNIX的可移植操作系统接口

PThreads: POSIX线程接口。系统调用来创建和同步线程

PThreads支持创建并行性、同步,但不支持显式通信,因为共享内存是隐式的

并行程序设计导论 概念总结相关推荐

  1. 并行程序设计导论_C程序设计导论

    并行程序设计导论 基本术语 (Basic Terminology) Before we start the technicalities of our topic, let us understand ...

  2. MPI矩阵向量乘法代码《并行程序设计导论》

    本文所写内容是根据<并行程序设计导论>第三章中的矩阵向量乘法代码总结而来的完整代码. 完整代码如下Mat_vect_mult.c #include<stdio.h> #incl ...

  3. 并行程序设计导论pdf电子书_并行程序设计导论学习笔记——OpenMP(1)

    使用OpenMP需要在编译器上打开OpenMP开关,并包含omp.h文件.我使用的是在Windows下的Visual Studio 2015,只需在工程选项中打开OpenMP支持就可以了.按照书上的说 ...

  4. 并行程序设计导论期末复习

    任务并行.数据并行的应用 任务并行 将待解决问题所需要执行的各个任务分配到各个核上执行. 数据并行 将待解决问题所需要处理的数据分配给各个核,每个核在分配到的数据集上执行大致相似的操作. 冯诺依曼体系 ...

  5. openmp 互斥锁 mysql_openMP 函数总结(并行程序设计导论)

    本篇文章只是记录api的用法和回顾,方便记忆 openMP openMP提供"基于指令"的共享内存API.这就意味着在c和c++中,有一些特殊的预处理指令pragma.在系统中加入 ...

  6. 计算机python程序设计导论,程序设计导论:Python计算与应用开发实践(原书第2版)...

    程序设计导论:Python计算与应用开发实践(原书第2版) 语音 编辑 锁定 讨论 上传视频 <程序设计导论:Python计算与应用开发实践(原书第2版)>是2018年机械工业出版社出版的 ...

  7. 实战matlab之并行程序设计.pdf,实战Matlab之并行程序设计_IT教程网

    资源名称:实战Matlab之并行程序设计 内容简介: <实战Matlab之并行程序设计>通过阅读和学习,读者可以掌握基于多种平台(多核.多处理器.集群和GPU等),利用多项技术(Matla ...

  8. Nvidia CUDA初级教程2 并行程序设计概述

    Nvidia CUDA初级教程2 并行程序设计概述 视频:https://www.bilibili.com/video/BV1kx411m7Fk?p=3 讲师:周斌 本节内容: 为什么需要? 怎么做? ...

  9. linux线程并不真正并行,多核时代:并行程序设计探讨(3)——Windows和Linux对决(多进程多线程)...

    并行程序设计探讨(3)--Windows和Linux对决(多进程多线程) 前面的博文经过分析总结,最后得出两种并行技术:多进程多线程.多机协作.对于多进程和多线程来说,最有代表性且最常见的的莫过于Wi ...

  10. python交互式程序设计导论答案-《程序员编程语言经典合集(计算机科学丛书5册套装)》epub+mobi+azw3...

    分册简介  · · · · · · Java编程思想(第4版): <Java编程思想(第4版)>面向初学者与专业人员,覆盖了所有基础知识,同时论述了高级特性,赢得了全球程序员的广泛赞誉.即 ...

最新文章

  1. C#中汉字数字、汉字拼音的转换
  2. Soap UI 负载测试
  3. knight tour java_The Knight’s tour problem
  4. Electron中实现菜单、子菜单、以及自带操作事件
  5. Java动态代理之InvocationHandler最简单的入门教程
  6. 基于事件驱动架构构建微服务第8部分:在应用程序上实现事件溯源
  7. servlets_jQuery Ajax – Servlets集成:构建完整的应用程序
  8. eclipse juno_放弃Eclipse Juno
  9. linux实现自动远程备份(scp+ssh)
  10. 单例模式应用场景_面试:请你谈谈单例模式的优缺点,注意事项,使用场景
  11. php分页显示数据表格显示,php+layui数据表格实现数据分页渲染代码
  12. 微信小程序入门 ——增删改查+页面跳转+传值取值+布局样式
  13. SDUT OJ 数据结构实验之串一:KMP简单应用 浅谈对看毛片算法的理解
  14. cmd代码表白_520你还不敢表白吗?
  15. 华为内部经典项目管理体系
  16. 如何将桌面上的qlv格式转换成mp4视频
  17. 如何采用一套程序代码,实现系统的“千人千面”
  18. win10以太网未识别的网络解决方法
  19. 【私藏好用】将bmap地图,Quik等五款软件打包送你端午节礼物
  20. compat-wireles的理解

热门文章

  1. 在智联上投了一个月的简历,很多都有意向,但是却没有通知我去
  2. 好玩的Canvas射箭小游戏
  3. (总结1)多机器人系统动态任务分配
  4. [前端案例]百行代码实现炫酷时钟
  5. JAVA 超详细 将文件夹目录打包为 ZIP 压缩包并下载
  6. python定义变量不赋值_python定义变量
  7. html属于页面的底部标签是,HTML5中footer标签的用法你知道吗?,HTML5中的footer标签是什么意思?...
  8. 腾讯互娱2021年游戏客户端开发工程师暑期实习生面试经历
  9. bugku-逆向-5、Timer
  10. 云计算 三种模式 各种云的区别