并行处理

并行化程序设计的四步走

本小妞迷上赌 提交于 2020-01-04 05:04:19
多核计算平台的普及化使得并行(Parallel)或者并发(Concurrent)程序设计(这里不妨称它们为并行化程序设计)成为一种编程技术主流。其实并行计算的软件技术早已存在了几十年,然而其原来主要服务于高性能计算一类的应用,所以并行化编程一直也都为阳春白雪的光环笼罩。现在谈到多核编程,讨论较多的是各种软件或者并行编程模型的使用;对于初学者而言却仍可能难以循其径而入。 其实,并行化的程序设计是有章可循的。按照开发流程的顺序,可以把并行化程序设计分为以下四个阶段: 1. 可行算法(解决方案)的描述与分析 2. 工作分解(Decomposition)——依赖性和同步与通信开销分析 3. 选择编程(实现)模型 4. 性能检查及优化 在设计的初始阶段,开发者应当针对要解决的问题先找到一个可行的解决方案或者算法。比如,排序问题的解决方案有气泡排序,快速排序,二叉树排序等已知可行的方法可以作为并行化的基础算法。而在进行具体的并行化设计之前,有一个很重要的分析(或者评估)要做,那就是并行化的必要性分析;即,应该估计一下目标问题的计算量。如果需要解决的问题计算量并不是很大,比如只需要对30个整数进行排序,即使采用传统串行程序也不会占用太多时间,那么就可能没有为之设计并行化程序的必要,因为并行化也是要付出其它计算的代价的。另外,基础算法的选择也很有讲究。有些算法本身就不具备太多的并行性

并行编程要素

≡放荡痞女 提交于 2020-01-04 05:03:48
基础要素 任务/数据划分 多个控制流并行,划分带来的负载均衡和通信开销也对程序的性能有决定性的作用 并发访问控制 多个控制流需要访问不同或者相同的资源,如何协调这些资源变得非常重要 并行化和面向对象 并行需要去除数据和控制的依赖关系,而面向对象把大问题解决成小问题,然后通过对象之间的通信来解决小问题,进而解决大问题。 面向对象鼓励隐藏对象拥有的数据,而并行化需要分析作用在数据上的操作的依赖关系。 对并行设计来说,合适的方法是:过程化的设计方法加上以数据为中心。并行化的本质是以数据为中心的,显式的传递数据对于并行更为合适。通过过程化的设计方法设计程序流程,以数据为中心进行并行化已经是流行的设计方式。 实践中,需要寻找数据热点并优化数据热点。 计算规模一定时,如果程序中存在不能并行的部分,那程序是很难实现完全线性加速的。 并发访问控制 并行程序需要协调对某个控制资源的访问。 基于消息传递并发访问控制,数据的交流通过传递消息进行,各个控制流拥有自己的存储器内容。 基于共享存储的并发访问控制,各个控制流访问共享的数据,访问之间有可能冲突,比如读后写、写后写、写后读,通常是采用互斥的方式来保证。 常见的并发访问控制流是文件 通常有两种做法: 只有一个文件,一个控制流读取文件并分发消息给其他控制流。 把一个文件分割成多个子文件,每个控制流读取一个子文件。 前一种做法比较简单,但数据分发是串行的

TPL并行编程1——概括

我的未来我决定 提交于 2020-01-04 05:03:24
并行编程看似简单,但是其实要设计一个较完美的解决方案是很复杂的。可能由于神秘的错误,程序并不能如预期那样运行。从今天起,我打算每星期更新一次关于并行编程方面的文章。 在Net4.0中引入了一种新的编程模型,极大简化了并行编程的难度和工作。后台使用了高效的登山算法等保证效率。此外,NET4.0中还包含调试和分析的工具,方便我们更好的掌握并行编程。 1:任务(Task) 任务是协同工作的一系列顺序操作,他们共同完成一个更大的操作。我们在构建并行程序时,要确定任务的粒度,这有助于硬件的有效利用。如果选择太小,任务管理的开销占主要,如果太粗,可能会失去并行的机会,因为原本可以使用的内核却被闲置。在一般情况下,我们确定任务时应尽可能的大,但他们之间应该相互独立,并且保证有足够多的任务使内核都忙碌。在调试任务时,可能还需要用到探讨法。要把问题分解为任务,对算法、应用程序的结构要有很好的了解。 2:数据的可扩展共享 不同任务之间通常需要数据共享。问题是,当一个程序并行运行时,程序的不同部分可能会互相竞争对同一内存位置的数据进行更新。这种行为对整个程序来说是灾难性的。解决办法包括同步线程技术。 在特定情况下通过阻塞并发线程的执行来实现并发线程的同步,比如:锁、原子级别的"比较并交换"、信号灯等。对于数据共享,第一反应可能是添加锁或者其它机制,但是降低了程序的并发性能。除了影响性能外

并发与并行

旧巷老猫 提交于 2020-01-04 04:51:29
  并发行和并行性的区别可以用馒头做比喻。前者相当于一个人同时吃三个馒头和三个人同时吃一个馒头。(今天听一个学长说的,感觉挺形象的!)   并发性(Concurrence):指两个或两个以上的事件或活动在同一时间间隔内发生。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。   并行性(parallelism)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。   区别:一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。   前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。   两者的联系:   并行的事件或活动一定是并发的,但反之并发的事件或活动未必是并行的。并行性是并发性的特例,而并发性是并行性的扩展。 来源: https://www.cnblogs.com/DarrenX-X/p/3355408.html

并发和并行的区别

[亡魂溺海] 提交于 2020-01-04 04:51:20
并发行和并行性的区别可以用馒头做比喻。前者相当于一个人同时吃三个馒头和三个人同时吃一个馒头。(今天听一个学长说的,感觉挺形象的!) 并发性(Concurrence):指两个或两个以上的事件或活动在同一时间间隔内发生。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。 并行性(parallelism)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。 区别:一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。\ 两者的联系: 并行的事件或活动一定是并发的,但反之并发的事件或活动未必是并行的。并行性是并发性的特例,而并发性是并行性的扩展。 来源:http://blog.chinaunix.net/uid-27007072-id-3233727.html 来源: https://www.cnblogs.com/keepsimple/archive/2013/05/10/3070720.html

线程,进程,多进程,多线程。并发,并行的区别与关系

半世苍凉 提交于 2020-01-04 04:49:49
一:线程与进程 1.概念 线程:是程序执行流的最小单元,是系统独立调度和分配 CPU(独立运行)的基本单位。 进程:是资源分配的基本单位。一个进程包括多个线程。 进程 ≥ 线程 2.区别: 1.线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。 2.每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。 3.不论是大小,开销线程要更“轻量级” 4.一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量) 二 .多线程与多进程 多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。。。 多进程:同时执行多个程序。如,同事运行 YY,QQ,以及各种浏览器。 三 .并发与并行 并发当有多个线程在操作时 ,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。 并行:当系统有一个以上 CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。 以下为详细的概念的讲解 并发: 并发,在 操作系统 中

并发与并行(concurrency vs parallesim)

青春壹個敷衍的年華 提交于 2020-01-04 04:46:08
最近对计算机中并发(concurrency)和并行(parallesim)这两个词的区别很迷惑,将搜索到的相关内容整理如下。 http://www.vaikan.com/docs/Concurrency-is-not-Parallelism/#slide-7 定义: 并发 Concurrency 将相互独立的执行过程综合到一起的编程技术。 并行 Parallelism 同时执行(通常是相关的)计算任务的编程技术。 并发 vs. 并行 并发是指同时处理很多事情。 而并行是指同时能完成很多事情。 两者不同,但相关。 一个重点是组合,一个重点是执行。 并发提供了一种方式让我们能够设计一种方案将问题(非必须的)并行的解决。 并发是一种将一个程序分解成小片段独立执行的程序设计方法。 通信是指各个独立的执行任务间的合作。 这是Go语言采用的模式,包括Erlang等其它语言都是基于这种SCP模式: C. A. R. Hoare: Communicating Sequential Processes (CACM 1978) 第二种: https://laike9m.com/blog/huan-zai-yi-huo-bing-fa-he-bing-xing,61/ “并发”指的是程序的结构,“并行”指的是程序运行时的状态 即使不看详细解释,也请记住这句话。下面来具体说说: 并行(parallesim

转一篇关于并发和并行概念的好文,附带大神评论

亡梦爱人 提交于 2020-01-04 04:45:47
转自:https://laike9m.com/blog/huan-zai-yi-huo-bing-fa-he-bing-xing,61/ 还在疑惑并发和并行? OK,如果你还在为并发(concurrency)和并行(parallesim)这两个词的区别而感到困扰,那么这篇文章就是写给你看的。搞这种词语辨析到底有什么意义?其实没什么意义,但是有太多人在混用错用这两个词(比如遇到的某门课的老师)。不论中文圈还是英文圈,即使已经有数不清的文章在讨论并行vs并发,却极少有能讲清楚的。让一个讲不清楚的人来解释,比不解释更可怕。比如我随便找了个网上的解释: 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生. 并发性(concurrency),又称共行性,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。 并行(parallelism)是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。 来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。 看了之后,你懂了么?不懂,更晕了。写出这类解释的人,自己也是一知半解,却又把自己脑子里模糊的影像拿出来写成文章,让读者阅毕反而更加疑惑。当然也有可能他确实懂了,但是写出这种文字也不能算负责。至于本文,请相信,一定是准确的,我也尽量做到讲解清晰。 OK,下面进入正题,

进程,线程和协程 并行与并发

喜欢而已 提交于 2020-01-04 04:45:13
一、进程 进程的出现是为了更好的利用CPU资源使到并发成为可能。 假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。聪明的老大们就在想若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行。注意关键字切换,自然是切换,那么这就涉及到了状态的保存,状态的恢复,加上任务A与任务B所需要的系统资源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B等等。登登登,进程就被发明出来了。通过进程来分配系统资源,标识任务。如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,切换称之为上下文切换。进程是系统资源分配的最小单位,进程占用的资源有: 地址空间 全局变量 文件描述符 各种硬件资源 相比线程和协程,进程是比较重量级的,它需要的资源很多。进程之间不共享内存变量,所以进程间的通信方式也多种多样: TCP REDIS等数据库 管道,文件等 二、线程 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使得进程内并发成为可能。假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容

c++11并行、并发与多线程编程

我怕爱的太早我们不能终老 提交于 2020-01-04 04:43:50
  首先,我们先理解并发和并行的区别。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。 并发的关键是你有处理多个任务的能力,不一定要同时。 并行的关键是你有同时处理多个任务的能力。 所以我认为它们最关键的点就是:是否是『同时』。   如上所示,并发可以理解为在同一时间段内发生,而并行是指两个事件的发生是处于平行状态的,即同时发生的。   我们知道JavaScript是不支持多线程的,而python、php、java等是支持多线程的,同样,c++也是支持多线程编程的。   在c++11中,有下面的头文件是用来支持多线程编程的: <atomic>: 该头文件声明了两个类,即std::atomic以及st::atomic_flag。 <thread>: 该头文件主要声明了std::thread类。 <mutex>: 中文是互斥量的意思。该头文件中主要声明了与互斥量(mutex)相关的类,比如std::lock_gruad以及std::unique_lock等,以及其他的类型和函数。 <condition_variable>: 该头文件声明了与条件变量相关的类,包括std::condition