C#并行编程

一.基于任务的程序设计

  1. 共享内存多核OS和分布式内存OS

共享内存多核OS-一个微处理器由多个内核组成,且每个内核共享一段私有内存;

分布式内存OS-- 由多个微处理器组成,每个微处理器可以有自己的私有内存,微处理器可以位于不同的计算机上,每个计算机可以有不同的通信信道

消息传递接口(MPI):运行在分布式内存计算机系统上的并行应用程序所使用的最流行的通信协议;

  1. 并行程序设计和多核程序设计

并行程序是指同一时刻运行多条指令,编写的代码能够充分利用底层硬件提供的并行执行能力;多核程序设计能够充分利用多个执行内核并行运行多个指令;

  1. 硬件线程和软件线程

物理内核(physical core)--真正独立的处理单元,多个物理内核使多条指令能够同时并行的运行。

每一个物理内核可提供多个硬件线程(亦称逻辑内核或逻辑处理器);

对称多线程(simultaneous multithreading,SMT):使用超线程计技术(HT)使微处理器在每个物理内核上提供多份架构状态,从而获得了 物理内核数X架构状态数 个硬件线程;

软件线程:每一个软件线程与其父进程分享一个私有的唯一的内存空间,但每一个软件线程有自己的栈、寄存器和私有局部存储区域;可以将硬件线程比作泳道,软件线程比作游泳者;

负载均衡:将软件线程的任务分发在多个硬件线程的操作,通过负载均衡,工作负载可以公平地分配在硬件线程之间。实现负载均衡取决于应用程序的并行程度、工作负载、软件线程数、可用的硬件线程以及负载均衡策略;

  1. Amdahl法则

预测多处理器系统的最大理论性能提升(加速比)

公式:最大加速比=1/((1-P)+(p/N))

P指能够完成并行运行的代码比例

N指可用的计算单元数(处理器或物理内核数)

  1. Gustafson法则

通过问题的大小来测量在固定时间内的可以执行的工作量;

总工作量(单元数)=S+(N*P);

S表示一次顺序执行完成的工作单元数;

P表示每一部分能够完全并行执行的工作单元数;

N表示可用的执行单元数(处理器数或物理内核数)

  1. 重量级并发模型和轻量级并发模型

重量级并发模型(多线程编程模型):编写复杂的多线程代码;将算法分解为多个线程、协调各个代码单元、在代码单元之间共享信息以及收集运算结果等任务;并且多线程模型过于复杂,难以应对多核革命;由于框架层次缺乏对多线程范围的支持,多线程需要做大量处理,这会导致代码复杂难以理解;

轻量级并发模型:减少了在不同逻辑内核上创建和执行代码所需要的总开销,并不只是关注不同逻辑内核之间的作业调度,还在框架级别添加对多线程访问的支持;

  1. 交错并发,并发和并行

交错并发:一次执行一个线程的指令,两个线程的指令交错执行

并发 :两个线程的指令同时执行

并行化要求:对需要完成的工作进行划分、并发的运行处理划分的部分、并且能够整合运行结果;对一个问题进行并行化就会产生并发性;

  1. 多核并行程序设计原则

按照并行的方式思考

使用抽象编程(TPL任务并行库)

按照任务(事情)编程,而不是按照线程(CPU内核)线程

设计的时候要考虑关闭并发的情形

避免使用锁

李永胜为帮助并发而设计的工具和库

使用可扩展的内存分配器

设计的时候要考虑增长的工作负载而扩展

CoreInfo  --查看处理器信息程序

二.   命令式数据并行

TPL支持数据并行 任务并行 流水线(任务并行和数据并行的结合体)

Parallel.Invoke 对给定的独立任务提供潜在的并行执行;

需要传入一个要并行执行的Action的参数数组

方法没有特定的执行顺序,只有在所有方法都执行完之后才会返回;

Parallel.For 为固定数目的独立For循环迭代提供了负载均衡的潜在的并行执行;

循环并行化,不支持浮点数和步进。无法保证迭代执行的顺序;

Parallel.ForEach为固定数目的独立For循环迭代提供了负载均衡的潜在的并行执行;支持自定义分区器,让你可以完全掌控数据并发;提供了20种重载方法

利用一个范围整数作为一组数据,通过一个分区器,把数据分成一组数据块。每一块的数据都通过循环的方式处理,而这些循环都是并行的。

根据内核数目优化分区

Environment.ProcessorCount 获取逻辑内核的个数

从并行循环中退出

在参数中使用ParallelLoopState,就可以使用loopState.Break();或者loopState.Stop();进 行退出。其中的差别在于,假设调用Break的时候正在处理迭代100,那么可以保证小于100的迭代都被执行,而Stop不保证这个。

ParallelLoopResult作为返回值,可以知道是否是正常完成或者被Break的

捕获并行循环的异常

try

{

loopResult =
Parallel.ForEach(inputData,

(int number, ParallelLoopState
loopState) =>

{        throw new Exception();  });

}

catch (AggregateException ex)

{

foreach (Exception innerEx in ex.InnerExceptions)

{

Debug.WriteLine(innerEx.ToString());

}

}

ParallelOption

用于修改最大并行度。

var parallelOptions = new ParallelOptions();

parallelOptions.MaxDegreeOfParallelism = maxDegree;

三.  
命令式任务并行

System.Threading.Tasks.Task

一个Task表示一个异步操作,其创建和执行时独立的。

Task的状态和生命周期

时间: 2024-11-09 23:28:35

C#并行编程的相关文章

并行编程入门

目录 1. 并行编程简介 2. MapReduce 2.1 MapReduce简介 2.2 MapReduce框架 2.3 Hadoop介绍 2.4 Hadoop基本类 2.5 Hadoop编程实例 1.并行编程简介 1.1.并行编程作用,用途 商业用途,科学计算,大数据分析 1.2.并行编程兴起原因 目前的串行编程的局限性 使用的流水线等隐式并行模式的局限性 硬件的发展 1.3.并行算法设计原则步骤 a.分析问题 b.分解问题 其中分解方法有: 数据分解 递归分解 探测性分解 推测性分解 混合

C#并行编程 z

目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 基于任务的程序设计.命令式数据并行和任务并行都要求能够支持并发更新的数组.列表和集合. 在.NET Framework 4 以前,为了让共享的数组.列表和集合能够被多个线程更新,需要添加复杂的代码来同步这些更新操作. 如您需要编写一个并行循环,这个循环以无序的方式向一个共享集合中添加元素,那么必须加入一个同步机制

.Net中的并行编程-4.实现高性能异步队列

上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队列主要用于实时数据流的处理并简化多线程编程模型.设计该队列时考虑以下几点需求(需求来自公司的一个实际项目): 1. 支持多线程入队出队,尽量简化多线程编程的复杂度. 2. 支持事件触发机制,数据入队时才进行处理而不是使用定时处理机制, 而且内部能阻塞消费者线程. 3. 出队时数据处理的顺序要保证和入队时是一致

五 浅谈CPU 并行编程和 GPU 并行编程的区别

前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺垫. 区别一:缓存管理方式的不同 GPU:缓存对程序员不透明,程序员可根据实际情况操纵大部分缓存 (也有一部分缓存是由硬件自行管理). CPU:缓存对程序员透明.应用程序员无法通过编程手段操纵缓存. 区别二:指令模型的不同 GPU:采用 SIMT - 单指令多线程模型,一条指令配备一组硬件,对应32

第三篇:GPU 并行编程的运算架构

前言 GPU 是如何实现并行的?它实现的方式较之 CPU 的多线程又有什么分别? 本文将做一个较为细致的分析. GPU 并行计算架构 GPU 并行编程的核心在于线程,一个线程就是程序中的一个单一指令流,一个个线程组合在一起就构成了并行计算网格,成为了并行的程序,下图展示了多核 CPU 与 GPU 的计算网格: 二者的区别将在后面探讨. 下图展示了一个更为细致的 GPU 并行计算架构: 该图表示,计算网格由多个流处理器构成,每个流处理器又包含 n 多块. 下面进一步对 GPU 计算网格中的一些概念

Delphi xe7并行编程快速入门(转)

http://blog.csdn.net/henreash/article/details/41315183 现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库. 并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有

Java:并行编程及同步使用方法

知道java可以使用java.util.concurrent包下的 CountDownLatch ExecutorService Future Callable 实现并行编程,并在并行线程同步时,用起来十分简单的一种 .实现原理: 1.CountDownLatch 统计并行线程完成数,并提供了await()方法,实现等待所有并行线程完成,或者指定最大等待时间.2.ExecutorService提供了execute(Callable)执行线程方法,还提供了submit(Callable)提交线程.

Parallel并行编程初步

Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选择并行是明智的.通常情况,每个CPU核心代表一个硬件线程,但超线程技术,可以使一个cpu核心具有两个硬件线程.软件线程顾名思义就是我们在程序中所开启的. 下面看一个最基础的并行编程的例子,也足以体现多核心并行运行的好处,当然微软.NET为我们封装后,我们也不必过多关注底层操作,那我们就看一下运行结果

Net并行编程高级教程--Parallel

Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机还是生物都并发处理着各种事物.人真是奇怪,当你关注一个事情的时候,你会发现周围的事物中就常出现那个事情.所以好奇心驱使下学习并发.便有了此文. 一.理解硬件线程和软件线程 多核处理器带有一个以上的物理内核--物理内核是真正的独立处理单元,多个物理内核使得多条指令能够

如何进行并行编程:从并行矩阵运算开始

并行计算,就是多个进程并行协作,完成特定的任务.现在我们假定一个并行系统,包含了p个处理机,每个处理机一个进程,我们可以分别用字符“0”,“1”,...,“p-1”来引用它们,或者为了清晰,我们用 Pi 来引用它们,i 表示一个进程的进程号,进程之间可以相互传递消息,所谓消息,指的是一个数据结构. 在并行编程中,我们用程序代码定义好一个过程,每个进程都将运行这段程序代码定义的过程,也就是说,代码必须是通用的.接下来我们用并行矩阵计算的实例来说明. 矩阵计算 矩阵计算问题有很多种类型,例如: 求解