并行程序设计整理(一)
为什么要并行计算
关于并行程序,首先思考它的目的,具体来说:
- 为什么我们要不断提高性能? 因为计算能力的提升是很多邻域能够进步的核心。
- 为什么我们要建立并行系统? 因为对于单处理器而言,其性能的提升实际是提高了处理器上晶体管的密度,但受限于散热问题等,密度无法一直提升。如果考虑并行化,即生产多个相对简单的完整处理器放在一个芯片上,即多核处理器,就能解决密度问题。
- 为什么我们要写并行程序? 编写并行程序是为了充分发挥多核处理器的优势,然而将串行程序改写成并行程序并不顺利。
关于并行程序和串行程序,举一个例子,假设要计算nnn个数的值,并求它们的和。对于这个问题,串行代码解法如下:
sum = 0;
for (i = 0; i < n; i++) {x = Compute_next_value(...); // 求得x的值sum += x;
}
现假设计算机有ppp个核,且p<<np << np<<n,那么每个核只需处理约np\dfrac{n}{p}pn个数的求值及加和,此时代码如下:
my_sum = 0;
my_first_i = ...;
my_last_i = ...;
for (my_i = my_first_i; my_i < my_last_i; my_i++) {my_x = Compute_next_value(...);my_sum += my_x;
}
上面代码中的my_
开头的变量代表了每个核的私有变量。
当每个核计算得到自己的my_sum
后,这些核把这个结果发送给核master,由master这个核来计算总和sum
:
if (IsMasterCore) {sum = my_x;for each core than myself {receive value from core;sum += value;}
} else {send my_x to the master;
}
当然,让master完成最终的求和并不是最优解,在核数足够多的情况下,可以采取如下策略:让0号核加上1号核的值,2号核加上3号核的值,以此类推,即偶数号核加上其后一号的核对应的值;然后让0号核加上2号核的值,4号核加上6号核的值……
虽然最优解听上去很完美,但是却难以作为一套方案通过编写并行程序来实现。因此才会有上面提到的,改写不顺利,但不能因为不顺利就浪费掉多处理器的能力。
如何编写并行程序
这个问题取决于如何在内核间划分工作的想法。主流的划分方法有:任务并行(task-parallelism) 和 数据并行(data-parallelism)。顾名思义:
- 任务并行:不同的核分配到的任务不同,每个核各司其职,最终完成整个任务。
- 数据并行:每个核处理的任务相似,但是处理的数据则不同。
在上面提到的求值并求和的例子中,master和其余核就是任务并行的一个实例,而除了master以外的这些核在做求值和加法运算的过程就是一个数据并行的实例。
编写并行程序过程中需要协调的问题:
- 通信(communication)
- 负载均衡(load balancing)
- 同步(synchronization)
编写显式并行(explicit parallel)程序
这里学习三种不同的C扩展:
- Message-Passing Interface (MPI)
- POSIX threads (Pthreads)
- OpenMP
在学习的过程中,将重点关注两种主要类型的并行系统:共享内存系统 (shared-memory system)和分布式内存系统 (distributed-memory system)。
在共享内存系统中,核心可以共享对计算机内存的访问;原则上,每个核都可以读写每个内存位置。(Pthreads, OpenMP)
在分布式内存系统中,每个核都有自己的私有内存,核必须通过通过网络发送消息之类的方式显式通信。(MPI)
上图中,图(a)是共享内存系统,图(b)是分布式内存系统。
并发、并行和分布式
在并发计算中,一个程序是指在任何时刻都可以同时进行多个任务的程序。
在并行计算中,一个程序是指多个任务紧密合作来解决一个问题的程序。
在分布式计算中,一个程序可能需要与其他程序合作来解决一个问题。
// 以上内容整理自《Introduction to Parallel Programming》一书
并行程序设计整理(一)相关推荐
- 并行程序设计整理(二)
并行硬件和并行软件 背景 并行硬件和软件是从传统的串行硬件和软件发展而来的. 冯·诺依曼结构 (The von Neumann architecture) 经典冯·诺伊曼体系结构由主存储器 (main ...
- 并行程序设计报告(MPI并行计算π,实现mandelbrot集)
代码的github地址 一.熟悉MPI并行程序设计环境 1.硬件 电脑:HP暗夜精灵 内存:4G 处理器:ntel® Core™ i5-6300HQ CPU @ 2.30GHz × 4 显卡:NVID ...
- 基于mpi的奇偶排序_并行程序设计(第2版)pdf
并行程序设计(第2版) 内容简介 本书系统介绍并行程序设计原理及应用.除介绍常用的一些算法范例,包括分治.流水.同步计算.主从及工作池,还介绍了一些常用的经典数值和非数值算法,如排序.矩阵相乘.线性方 ...
- 实战matlab之并行程序设计.pdf,实战Matlab之并行程序设计_IT教程网
资源名称:实战Matlab之并行程序设计 内容简介: <实战Matlab之并行程序设计>通过阅读和学习,读者可以掌握基于多种平台(多核.多处理器.集群和GPU等),利用多项技术(Matla ...
- Nvidia CUDA初级教程2 并行程序设计概述
Nvidia CUDA初级教程2 并行程序设计概述 视频:https://www.bilibili.com/video/BV1kx411m7Fk?p=3 讲师:周斌 本节内容: 为什么需要? 怎么做? ...
- linux线程并不真正并行,多核时代:并行程序设计探讨(3)——Windows和Linux对决(多进程多线程)...
并行程序设计探讨(3)--Windows和Linux对决(多进程多线程) 前面的博文经过分析总结,最后得出两种并行技术:多进程多线程.多机协作.对于多进程和多线程来说,最有代表性且最常见的的莫过于Wi ...
- OpenMP 并行程序设计入门
OpenMP 是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 0. 一段使用 OpenMP 的并行程序 #include <stdio.h> #inclu ...
- 并行程序设计导论_C程序设计导论
并行程序设计导论 基本术语 (Basic Terminology) Before we start the technicalities of our topic, let us understand ...
- 奥鹏20春季1903C语言,奥鹏20春学期《并行程序设计》在线作业
1,n个数求和的串行程序,通过一个循环将每个数累加到全局变量sum中,其多线程版本简单将循环范围改变为每 个线程负载的范围,存在的问题是____. A 负载不均 B 通信开销大 C CPU空闲等待严重 ...
- NVIDIA CUDA初级教程(P2-P3)CPU体系架构概述、并行程序设计概述
文章目录 1.CPU体系架构概述 2.并行程序设计概述 1.CPU体系架构概述 现代CPU架构 CPU的定义 (1)执行指令.处理数据的器件:完成基本的逻辑和算术指令 (2)内存接口.外部设备接口 ( ...
最新文章
- UICollectionView的基本使用(1)
- OpenGL(glut)模拟太阳系:太阳,地球,月球,火星
- socket套接字选项
- 多媒体个人计算机能处理什么,多媒体计算机可以处理的信息类型有哪些
- 基于完成端口的文件传输设计
- 从蚂蚁金服实践入手,带你深入了解 Service Mesh
- 运算符重载——拷贝构造函数与赋值运算符的区别、如何实现赋值运算符的深拷贝
- php手册中点击下载的功能,PHP实现文件下载功能
- 操作系统期末考试重点知识
- PS 制作ICO图标和图片背景透明化
- 超简单Python实现微信机器人自动回复
- Stata连享会:分享一大堆资料
- 全屋Wi-Fi:一个谁也解决不好的痛点?
- 【前端】你真的理解JavaScript中的变量和数据类型吗
- SQL2008使用with求余额表,流水账方式
- VS2019源码,通过基址+偏移修改软件内阳光数值(植物大战僵尸单机版)
- 盘点那些免费视频网址到底有多爽
- 如何做好客户维护与服务器,如何做好客户维护关系与管理
- Java JNI初体验
- python 全排列 递归中的两种实现
热门文章
- 谈谈 MVX 中的 Controller
- c语言的虚拟变量,含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解...
- 陈强教授 计量经济学及机器学习等数据集、程序等相关资源
- 解决IE访问Oracel OEM证书错误
- 你一定要上网,看到这段文字,做一…
- 我为什么从外包公司离职了?
- 《多媒体在初中数学中的运用研究》课题研究方案
- HTML meta 标签
- 计算机英语四六级考试时间,2019年12月英语四六级考试时间
- 个人java课设的心得体会收获_java课程设计心得体会