五种主要多核并行编程方法分析与比较

随着多核时代的到来与流行,传统的单线程串行程序的编程模式必将改变,取而代之的将是并行编程。目前已经有五种主要并行编程模型,下面将对此五种模型进行概括性的分析与比较:

1. MPI

  MPI(Message Passing Interface)消息传递接口是MPI论坛发布的一个库,而不是一门实现语言,支持C/C++/Fortran。是一种消息传递编程模型,为进程间通信服务。MPI提供了一种与平台无关,可以被广泛使用的编写消息传递程序的标准。用它来编写消息传递程序,不仅实用、可移植、高效和灵活,而且和当前已有的实现没有太大的变化。目前MPI的主要实现有以下三种:

  优点:可以在集群上使用,也可以在单核/多核CPU上使用,它能协调多台主机间的并行计算,因此并行规模上的可伸缩性很强,能在从个人电脑到世界TOP10的超级计算机上使用。

  缺点:第一,基于消息传递,需要显示划分和分布计算任务,显示进行消息传递与同步,且不易增量开发串行程序的并行性;第二,使用进程间通信的方式协调并行计算,这导致并行效率较低、内存开销大、不直观、编程麻烦。

  参考资料:MPI论坛

2. OpenMP

  OpenMP(Open Multi Processing)是由Open ARB发布的一种用于并行编程的规范,是建立在串行语言上的扩展,目前可以在C/C++/Fortran中使用。

  OpenMP由三部分组成:编译指导(compiler directive)、运行库(runtime library)和环境变量(environment variables)。其语言模型基于以下假设:执行单元是共享一个地址空间的线程,即OpenMP是基于派生/连接(fork/join)的编程模型。Fork/join的并行机制如下图所示:

  Fork/join并行机制:并行区前,串行命令派生出多条并行命令并行执行,执行到并行区末等待,等所有并行任务都结束,再转到串行执行。

  OpenMP有两种常用的并行开发形式:一是通过简单的fork/join对串行程序并行化;二是采用单程序多数据对串行程序并行化。

  优点:第一,共享存储模型,使得程序员不必进行数据划分和分布,使得开发并行程序比较容易;第二,更适合于SMP系统;第三,主要面向循环级的并行开发,可以容易地实现增量性的并行化。

  缺点:第一,OpenMP只适用于SMP结构;第二,OpenMP主要开发循环级的并行程序,受此限制,对某些应用并不适合;第三,OpenMP的编写、正确性调试和性能调度复杂。

  参考资料:Open ARB - OpenMP

3. Intel IPP

  Intel IPP(Integrated Performance Primitives),Intel集成性能基元是Intel函数库的第二代。Intel为每种新的多核处理器都发布一个IPP函数库(C/C++ API),专用于多核架构,提供了调度优化的函数库,其中涉及的领域有数学、信号处理、音频视频、图像处理与编码、字符串、密码学。 IPP的组成如下图所示:

  优点:是经过性能高度优化的库,执行效率高。

  缺点:专用于Intel处理器和某些领域,不方便移植。

  参考资料:Intel IPP产品介绍

4. Intel TBB

  Intel TBB(Threading Building Blocks),Intel线程构建模块,是一个为创建可靠的、可移植的和可扩展的并行程序的C++模板库。专用于编写高层抽象的C++程序,和可移植的程序。

  优点:可移植、可扩展。

  缺点:性能没有IPP高。

  参考资料:Intel TBB产品介绍

5. MapReduce

    MapReducesh是Google的人研究出来的一个模型,开发的一个针对大规模群组中的海量数据处理的分布式编程模型。

  参考资料:http://www.mapreduce.org/

  此外,并行编程模式还有X3H5, Phreads, HPF等,但都不常用。

时间: 2024-10-07 10:09:56

五种主要多核并行编程方法分析与比较的相关文章

多核并行编程方法

在多核的硬件结构中,如果要充分发挥硬件的性能,必须采用多线程(或多进程)执行,以提高CPU的利用率.多核系统的编程模型和多个CPU的SMP系统的编程模型是一致的,都属于共享存储的编程模型:同时,多核环境中也可以使用的分布式编程模型.目前,多核并行编程方法可以分为以下四类:基于Raw Thread API的方法.基于共享内存编程模型的方法.基于高层次模板库的方法.基于分布式编程的方法.(1)基于Raw Thread API的方法:这种方法主要使用系统底层API来进行多线程编程.Windows Th

iOS中有3种常见的多线程编程方法

1.NSThread 这种方法需要管理线程的生命周期.同步.加锁问题,会导致一定的性能开销 2.NSOperation和NSOperationQueue 是基于OC实现的.NSOperation以面向对象的方式封装了需要执行的操作,然后可以将这个操作放到一个NSOperationQueue中去异步执行.不必关心线程管理.同步等问题. 3.Grand Centeral Dispatch 简称GCD,iOS4才开始支持,是纯C语言的API.自iPad2开始,苹果设备开始有了双核CPU,为了充分利用这

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

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

多核并行编程技术(一)

首先需要先理解几个概念:串行:最基本的程序执行方式,串行程序的整个运行时,只有一个调用栈和一个运行时上下文,单进程/单线程程序可以认为是串行程序.并发:多线程出现后比较常见的程序执行方式,多线程程序运行时,会有多个运行时上下文和对应的多个调用栈.逻辑上多个线程同时发生,物理上是有操作系统调度,CPU某一时刻依然只执行一个线程的任务,但是某个执行中的线程随时可能被OS调度走,而随后运行的线程操作的数据可能跟刚刚被调度走的线程造成冲突,所以有共享数据同步问题. 多进程如果有共享数据,也符合并发程序的

写出高性能的多核并行编程

什么样的程序运行效率高? 程序的数据和指令都在cache中.没有cache miss出现. 所以怎样让并行程序性能高基本能够演变成 怎样降低cache miss? 尤其是多核下.并行程序cache的问题已经无法回避了,否则并行的效率还没有一个线程高. 敲代码的时候MESI协议要时刻浮如今眼前. 借用一句歌词:如今不是从前了,兔子比狐狸狡猾了. 1.绞尽全部的脑汁,避免使用全局变量,尤其是程序执行过程中可能改动的变量. 全部线程仅仅读的变量能够放松一丁点儿要求. 2.per thread per

五种ip proxy的设置方法

我们在制作爬虫爬取想要的资料时,由于是计算机自动抓取,强度大.速度快,通常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网页,就很可能被封,在这里介绍相关的技巧,以免被封:但在制作爬虫时,还是要适当加入延时代码,以减少对目标网站的影响. 一.requests设置代理: import requests proxies = { "http": "http://192.10.1.10:8080", "https": "http://

多线程(十五、ConcurrentHashMap原理二类和方法分析)

ConcurrentHashMap的构造 ConcurrentHashMap,采用了一种"懒加载"的模式,只有到首次插入键值对的时候,才会真正的去初始化table数组. 构造方法: 1.空构造函数,默认桶大小162.指定桶初始容量的构造器,必须是2次幂值 /** * 指定table初始容量的构造器. * tableSizeFor会返回大于入参(initialCapacity + (initialCapacity >>> 1) + 1)的 最小2次幂值 */ publi

五种JSP页面跳转方法详解

1. RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递. 但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,

【CUDA并行编程之五】计算向量的欧式距离

本文将介绍如何用cuda来计算两个向量之间的欧式距离,其中涉及到了如果将二维矩阵传入到核函数进行计算的问题,并且介绍两个内存分配和拷贝的API:cudaMallocPitch以及cudaMemcpy2D. 一.需求分析 现在我们要解决这么一个问题:计算一个D维的向量A[D]到二维矩阵B[N][D]的每一行的欧式距离,并且将每一组距离保存在一个向量dis[N]中并返回.我们还是通过串行和并行两种方式来进行实现. 二.串行实现 实现方法就是用一个二重循环进行相乘,然后将结果保存.上代码: dis_c