多核并行编程方法

在多核的硬件结构中,如果要充分发挥硬件的性能,必须采用多线程(或多进程)执行,以提高CPU的利用率。多核系统的编程模型和多个CPU的SMP系统的编程模型是一致的,都属于共享存储的编程模型;同时,多核环境中也可以使用的分布式编程模型。
目前,多核并行编程方法可以分为以下四类:基于Raw Thread API的方法、基于共享内存编程模型的方法、基于高层次模板库的方法、基于分布式编程的方法。
(1)基于Raw Thread API的方法:这种方法主要使用系统底层API来进行多线程编程。Windows Threads和POSIX threads都属于使用系统底层API[2,3],是最低层次的并行编程API,不同点是Windows threads应用于Windows平台,有Win32这样一个完整的库支持,相对较为成熟,而POSIX threads主要用于UNIX/Linux平台,但编程难度相当大。这些系统底层Raw Thread API是非常强大的并行程序设计工具,它将巨大的潜能交到了程序员手中。但是,这种编程方法会遭遇上一节所提到的问题。
(2)基于共享内存编程模型的方法:共享内存编程模型中最有代表性的是OpenMP,它可以帮助程序快速创建线程,解决多核编程中面临的问题。OpenMP形成于1997年,用于编写可移植的多线程应用程序,起初只是一个Fortran标准,后来又发展到C/C++,目前在Intel C++ Compiler和Microsoft VS2005以及更高版本等编译器上都得到了广泛支持。虽然,OpenMP简单易用,但是它限制了程序员对并行的控制,限定了所提供信息的数量,例如OpenMP没有动态线程调度机制、伸缩性的内存分配器、内嵌式并行程序、并发的数据结构等。当“少许并行”就足够时,使用OpenMP会比较方便。[4-6]
(3)基于高层次模板库的方法:这类方法具有面向对象的特征,基于模板技术构建了丰富的线程控制和并行计算的模板库。Java Threads是所有能显示支持并行的程序设计语言中使用最广泛的。在它的核心,提供了与POSIX Threads相同的概念特性,并且支持并发数据结构。Threading Building Blocks是由Intel针对多核平台开发的一组开源的C++的模板库,基于GPLv2开源证书,支持可伸缩的并行编程。它不需要特别的语言或者编译器的支持,因此可以广泛地被用于任何处理器、任何操作系统以及任何编译器。
使用这种方法进行多线程编程,程序员不需要将过多的精力放到同步、负载平衡、缓存优化等等的问题上,而能够轻松地实现自动调度的并行程序,使得CPU的多个核心处于高效运转之中。但是,这需要程序员熟练掌握这种开发工具。[7,8]
(4)基于分布式编程的方法:多核环境中可以使用分布式的消息传递编程模型,Intel的编译器就支持在多核环境中使用MPI编程。但是,在多核环境中使用消息传递编程会带来性能上的损失,并且不是所有的共享数据类型都适用消息传递模型来解决,例如,查找算法在多核中就不适用。[1,9]

[1]      周伟明. 多核计算与程序设计. 武汉:华中科技大学出版社,2009年3月.

[2]      Calvin Lin, Lawrence Snyder. 并行程序设计原理[M]. 北京:机械工业出版社, 2008年2月.

[3]      Jim B,Robert W. Win32多线程程序设计. 侯捷译. 武汉:华中科技大学出版社,2002年.

[4]      OpenMP官网. http://openmp.org/wp/.

[5]      Jin H,Frumkin M,Yan J.The OpenMP implementation of NAS parallel benchmarks and its performance.NAS Technical Report NAS-99-011, October 1999.

[6]      陈永健,OpenMP编译与优化技术研究,北京:清华大学,2004年.

[7]      胡斌,袁道华. TBB多核编程及其混合编程模型研究. 计算机技术与发展,2009年,第2期.

[8]      Intel公司.Intel Threading Building Blocks reference manual. 2007.

http://threadingbuildingblocks.org/.

[9]      Michael J Q. 并行程序设计C、MPI与OpenMP. 北京:清华大学出版社,2005.

时间: 2024-10-06 02:49:40

多核并行编程方法的相关文章

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

随着多核时代的到来与流行,传统的单线程串行程序的编程模式必将改变,取而代之的将是并行编程.目前已经有五种主要并行编程模型,下面将对此五种模型进行概括性的分析与比较: 1. MPI MPI(Message Passing Interface)消息传递接口是MPI论坛发布的一个库,而不是一门实现语言,支持C/C++/Fortran.是一种消息传递编程模型,为进程间通信服务.MPI提供了一种与平台无关,可以被广泛使用的编写消息传递程序的标准.用它来编写消息传递程序,不仅实用.可移植.高效和灵活,而且和

多核并行编程技术(一)

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

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

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

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

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

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

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

.NET 4 并行(多核)编程系列之一入门介绍

本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:  1. 并行编程和多线程编程的区别.  2. 并行编程技术的利弊  3. 何时采用并行编程 系列文章链接: .NET 4 并行(多核)编程系列之一入门介绍 .NET 4 并行(多核)编程系列之二 从Task开始 .NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之四 Task的休眠 .NET 并行(多核)编程系列之五 Task执行和异常处理

C#并行编程

一.基于任务的程序设计 共享内存多核OS和分布式内存OS 共享内存多核OS-一个微处理器由多个内核组成,且每个内核共享一段私有内存: 分布式内存OS-- 由多个微处理器组成,每个微处理器可以有自己的私有内存,微处理器可以位于不同的计算机上,每个计算机可以有不同的通信信道 消息传递接口(MPI):运行在分布式内存计算机系统上的并行应用程序所使用的最流行的通信协议: 并行程序设计和多核程序设计 并行程序是指同一时刻运行多条指令,编写的代码能够充分利用底层硬件提供的并行执行能力:多核程序设计能够充分利

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

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

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

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