当前位置:文档之家› 基于多核DSP的OpenMp研究与实现

基于多核DSP的OpenMp研究与实现

基于多核DSP的OpenMp研究与实现
基于多核DSP的OpenMp研究与实现

Journal of Image and Signal Processing 图像与信号处理, 2016, 5(4), 147-154 Published Online October 2016 in Hans. https://www.doczj.com/doc/7218960835.html,/journal/jisp https://www.doczj.com/doc/7218960835.html,/10.12677/jisp.2016.54017

文章引用: 张琪, 王正勇, 余艳梅. 基于多核DSP 的OpenMp 研究与实现[J]. 图像与信号处理, 2016, 5(4): 147-154.

Research and Realization of OpenMp Based on Muiticore DSP

Qi Zhang, Zhengyong Wang, Yanmei Yu

Image Information Institute, College of Electronics and Information Engineering, Sichuan University, Chengdu Sichuan

Received: Sep. 18th , 2016; accepted: Oct. 4th , 2016; published: Oct. 7th

, 2016

Copyright ? 2016 by authors and Hans Publishers Inc.

This work is licensed under the Creative Commons Attribution International License (CC BY).

https://www.doczj.com/doc/7218960835.html,/licenses/by/4.0/

Abstract

Aiming at the complexity of multicore model in practical application, the three major models of data flow, master-slave and OpenMp are analyzed in this paper. Because the OpenMp model is easier to be implemented, it is taken as the major research object. Firstly, the implementation principle of OpenMp model is studied; the time consumed by the thread creation and task parti-tioning in the nested loop of the OpenMp model is analyzed in this paper. Then, the relationship between the core number and the number of threads in the OpenMp model is also studied. Finally, taking TMS320C6678 multi-core DSP of TI Company as the core processor, a simple image processing algorithm is used to verify the conclusions drawn from the above research. The results of test have proved OpenMp model when the number of threads is equal to the core number shortest execution time.

Keywords

TMS320C6678, OpenMp, Linear Assembly, Threads Scheduling

基于多核DSP 的OpenMp 研究与实现

张 琪,王正勇,余艳梅

四川大学电子信息学院图像信息研究所,四川 成都

收稿日期:2016年9月18日;录用日期:2016年10月4日;发布日期:2016年10月7日

Open Access

张琪等

摘要

针对目前在实际应用场景中多核模型的复杂性,本文在分析了数据流、主从、OpenMp三大多核模型后,选取其中更易实现的OpenMp模型作为主要研究对象。本文研究了OpenMp模型的实现原理,对多核模型OpenMp在嵌套循环中的线程创建以及任务划分所消耗的时间进行了分析,然后研究了OpenMp模型的核数和线程数之间的关系,最终以TI公司的多核DSP TMS320C6678为核心处理器,使用典型的图像处理算法对在以上研究中得出的结论进行了验证。经测试,OpenMp模型在线程数等于核数时执行时间最短。

关键词

TMS320C6678,OpenMp,线性汇编,线程调度

1. 引言

随着社会的发展,摩尔定律预言的半导体发展在2013年年底开始逐渐放缓,于是单芯片多处理器的解决方案成为改善处理器性能的一个重要方向,使用多核处理器已经成为一种趋势,但对于多核DSP处理器而言,主从模型、数据流模型、OpenMp模型是现在多核DSP处理器的三大主要并行程序处理模型。

其中主从模型是以主核作为控制核心,从核在主核的调度下完成任务处理,从核之间工作相互独立,即如果其中一个核停止工作,不会影响其他核的执行;数据流模型是一个线性的处理模型,其工作方式按流水线的方式依次串行处理;OpenMp则是由一个主线程开始,程序中的串行部分由主线程完成,并行的部分是由派生的其他线程来执行,但是如果并行部分没有结束,则不会执行后面的串行部分。

比较主从模型、数据流模型和OpenMp模型这三种方式,主从模型、数据流模型较为复杂,并且为了考虑负载的平衡,需要考虑算法处理时间的协调、任务的合理分割以及映射核的处理,而OpenMp使用就相对来说简单一些,大多数情况下只需要考虑该循环数据上的相关性,然后在其循环前面加上OpenMp的相关指令,就可以实现并行,这就降低了并行编程的难度和复杂度[1]。文献[2]利用OpenMp 对HEVC进行解码,但是没有深入分析核数和线程数的关系,文献[3]分析了在不同处理平台下核数和线程数对处理速度的影响,但是没有针对具体算法进行验证。

因此本文基于TMS320C6678硬件平台、采用OpenMp模型、以图像处理中值滤波作为分析验证,分析了多核多线程的调度,然后以512 × 512的椒盐噪声图片为素材,采用3 × 3的滤波模板实现了图片的去噪。实验结果表明,在TMS320C6678 (1 Ghz 8核)上经过各种优化后得到处理的平均时间为34.5 ms;

比较多核DSP的单核处理时间与八核处理时间,得出在TMS320C6678上使用OpenMp实现中值滤波算法加速达到7.88倍。

2. TMS320C6678介绍

多核定点浮点信号处理器TMS320C6678是基于KeyStone多核架构,整合了8个C66x核,每个核的频率可以运行在1.0 GHz到1.25 GHz,提供每秒高达40 GB MAC定点运算和20 GB FLOP浮点运算能力,可在10 W功耗下实现160GFLOP (Giga-Floating Point Operation per Second)浮点计算性能[4]。因此TMS320C6678非常适用于高速信号处理领域,如医学成像,虚拟现实以及人工智能等。此外,C66x核DSP也是TI第一款支持OpenMp API的多核DSP [5]。

张琪等3. OpenMp介绍

OpenMp是由OpenMP Architecture Review Board开始提出的,是用共享内存并行系统的多线程程序设计的一套指导性的编译处理方案(Compiler Directive),并且已经被广泛采用。OpenMP支持的编程语言包括C、C++和Fortran [6],支持OpenMp的编译器包括Sun Compiler、GNU Compiler和Intel Compiler 等。OpenMp提供了对并行算法的高层抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信信号。当选择忽略这些pragma,或者编译器不支持OpenMp时,程序又可退化为通常的程序(一般为串行),代码仍然可以正常运作,只是不能利用多线程来加速程序执行。

OpenMp的实现是基于fork-join模型的,主线程顺序执行,当主线程遭遇并行区域时,分配的子线程按照任务各自执行,直到并行区域结束[7],主线程处理流程如图1所示。

在C/C++中,OpenMP指令使用的格式为:

#pragma omp 指令 [子句[子句]…]

其中常用指令如表1所示。

其中常用字句如表2所示。

其中常用调度类型如表3所示。

4. OpenMp的并行分析

4.1. OpenMp在嵌套循环中的分析

在图像处理领域中,for循环扮演着不可或缺的角色,而本文OpenMp也是主要针对for循环进行展开的,实际处理中OpenMp指令在for循环中位置不同,程序执行的方式也会随之不同,图2为OpenMp 针对for循环的两种表现形式。

图2(a)这种放置位置表示把最外层的for循环进行并行处理,即对循环变量i进行线程创建以及线程分配,假设其创建线程花费时间为a,线程分配花费时间为b,则其花费的总时间为a + b,图2(b)表示把嵌套里面的for循环进行并行处理,即对循环变量j进行线程创建以及线程分配,那么其花费的总时间为i × (a + b),显然i × (a + b) > a + b;在某些处理的时候还需要对特定变量进行写保护,即有且只能让一个线程去操作该变量,但是由于每个核派生的任务不一样,造成执行完任务的时间也会不相同,所以当操作该变量时可能需要等待,那么这也导致程序执行效率降低。

图1. OpenMp主线程处理流程

张琪等

Table 1. Commonly used instructions

表1. 常用指令

Parallel 表示这段代码将被多个线程并行执行

For 一般用在for循环之前,表示将循环分配到多个线程中并行执行;也可以与parallel for相结合,表示for循环的代码将被多个线程并行执行

Sections 一般用在可能会被并行执行的代码段之前

Critical 一般用在代码的临界区之前

Table 2. The commonly used words

表2. 常用字句

Private 表示每个线程都拥有自己的变量私有副本

Schedule 表示如何调度for循环迭代

Shared 表示一个或多个变量将成为多个线程间的共享变量

Table 3. Commonly used scheduling type

表3. 常用调度类型

Dynamic 循环变量区域分为n等份,某个线程执行完1份之后再执行其他需要执行的那一份任务

Guided 循环变量区域由大到小分为不等的n份,运行方法类似于dynamic

Runtime 在运行时使用上述三种调度策略中的一种,默认是使用static

Static 循环变量区域分为n等份,每个线程平分n份任务

(a) (b)

Figure 2. Two kinds of forms of OpenMp in view of the for loop

图2. OpenMp针对for循环的两种表现形式

4.2. OpenMp中关于线程数与核数的分析

当使用OpenMp模型时,还应该对其核数与线程数加以考虑,假设在一个任务中,其核数为m,线程数为n,当m > n时,即核数大于线程数,那么操作系统在分配线程时,将存在一些核分配不到线程,而造成核出现饥饿状态;当m < n时,即核数小于线程数,那么操作系统在分配线程时,将存在一些线程由于核数不够导致其出现等待状态;综上,我们可以得出当线程数等于核数时,即没有线程等待,也没有核出现饥饿,即一个核执行一个线程。

5. OpenMp的实现

5.1. OpenMp实现中值滤波

中值滤波是图像处理领域中比较基础的处理之一,是基于排序统计理论的一种有效抑制噪声处理技

张琪等

术,原理是把数字图像中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值更加接近真实值,从而消除孤立噪点。本文在分析了OpenMp的一些原理及调度方式后,使用中值滤波处理算法作为验证,之所以选择中值滤波是由于其处理时可以通过使用其他共享变量来存储执行结果而不会相互干扰;在本文中,采取static、dynamic、guided、runtime调度方式衡量程序的运行时间。在中值滤波的循环前面采用关键字#pragma omp parallel for来实现程序处理的并行,采用private实现变量的私有化,即对for循环中的循环变量进行保护,使每一个线程都能独立地拥有循环变量的私有拷贝。

TMS320C6678一共拥有8个核,每个核都能实现最高1.25 Ghz的主频,但在本文中,使用1 Ghz 作为每个核的主频,然后线程设置为8线程,即每个核分配一个线程,然后对其执行的时间进行比对,部分程序展示如图3所示,private (i, j, arry)表示循环变量i,j,arry在每个线程里都拥有变量私有副本,其他线程不能访问,shared (dataout)表示8个线程共同使用dataout数组,schedule (guided)表示调度方式为guided,即在起始阶段每个线程会被分配到较大的迭代块,后面分配到的迭代块将依次递减,直到减为1,sort (arry)表示对arry数组里的像素进行排序,dataout[] = arry[5]表示把排序后的中间像素值赋给当前位置。

5.2. 线性汇编优化

线性汇编语言是介于C/C++和汇编语言之间的一种语言,它相对于汇编语言编写相对简单,TI官方有提供线性汇编的编程格式与标准[8] [9]。

中值滤波函数的原理是用其周围邻域的中值代替当前像素值,方法是对其模板内的像素进行排序,生成单调上升(或下降) [10],由于该排序函数在遍历该图像时需要对图像中的每一个像素点进行排序,故对其排序函数进行线性汇编优化,优化条件是在8核8线程DSP下,对512 × 512图片采用3 × 3中值滤波模板,实验结果如表4所示。

5.3. 其他优化

1) 字节对齐:对于程序中经常访问的存储空间,采用32字节对齐,以空间换取执行时间。

2) 缓存优化:由于CPU执行速度快于存取速度,所以在执行程序时采用缓存,本文缓存设置为:64K L2,32K L1,32K P1。

3) -O3优化:文件级优化,会大量地消除未使用的函数及变量,本文在最后采用此优化,效果明显。

6. 实验结果及数据分析

图4为OpenMP不同调度方式下,循环迭代次数与执行时间的关系。由图中可看出,使用runtime 类型时,即运行时选择前面三种调度类型中的一种时,迭代次数对执行时间没有影响;而guided、static、dynamic在自动调度和循环迭代次数相对较少时表现更好,如果给其分配size过大,反而执行时间变长,这是由于分配给线程的迭代次数过多,即花费了大量的时间去创建线程以及分配线程浪费了时间;但是当循环迭代次数达到一定值时,即大于4000次时,其执行时间几乎没有变化,这是由于分配给线程的迭代次数过大后,即把循环中所有的线程都分配给一个核去处理了,其他核则分配不到线程。

图5为OpenMP线程数、核数与执行时间的关系图。首先把核数等于线程数作为分界线,从图中看出,当核数大于线程数时,程序的执行时间随着线程数的增加而减少,当核数小于线程数时,程序的执行时间随着线程数的增加而几乎不变,原因是由于当核数大于线程数时,某些核分配不到线程,造成核处于饥饿状态,因此,当线程数增加时,饥饿的核由于分配到线程,处理时间减少;当核数小于线程数时,是因为无论线程怎么增加,执行程序的核是一定的,在没执行完上一个线程之前,是不会执行下一个线程的,所以执行时间几乎没有改变;综上,当核数接近线程数时程序执行时间最短。

张琪 等

测试背景是基于四幅512 × 512的带椒盐噪声的彩色图片,原图和中值滤波后的测试结果图如图6所示。在经过线性汇编、-O3等优化后得到单核下平均处理时间为272.1 ms ,在8核8线程下平均处理时间为34.5 ms 。

Table 4. Linear assembly optimization 表4. 线性汇编优化

不优化 线性汇编优化

耗时时间

288 ms

137 ms

Figure 3. Median filtering openmp part program 图3. 中值滤波openmp 部分程序

Figure 4. OpenMP scheduling and loop iterations execution time 图4. OpenMP 调度方式以及循环迭代次数执行时间

0 4 40 400 4000

40000

280

240

200

160

120

80

40

处理时间(m s )

guided

static dynamic runtime

循环迭代次数

张琪 等

Figure 5.

OpenMP the number of threads and nuclear execution time 图5. OpenMP 线程数与核数的执行时间对比

Figure 6. Test the original image and the result 图6. 测试原图与结果图

7. 结论

本文对多核DSP 的三种模型OpenMp 、主从模型、数据流模型做了一些简要介绍,由于OpenMp 模型在使用上相对于其他两种模型简单,编程者只需要在程序中加入适当的编译器指令来表其们的意图,程序将自动并行化。本文以512 × 512的图片为例进行图像中值滤波处理,并对OpenMp 模型的调度方式

1 2 4 8 10

12

240

200

160

120

80

40

处理时间(m s )

1核2核4核

8核

线程数

280

张琪等

和线程数量进行测试,最终图像在经过线性汇编等一系列优化后得到单核下的平均处理时间为272.1 ms,8核8线程下的平均处理时间为34.5 ms,测试结果表明了基于多核DSP的OpenMp模型在处理类似像素点或则像素块问题上具有良好的性能,并且根据实验数据可得出,OpenMp模型在线程数等于核数时执行时间最短。

参考文献(References)

[1]Mou, X.G., Wei, G.H. and Zhou, X. (2014) Parallel Programming and Optimization Based on TMS320C6678. Applied

Mechanics & Materials, 615, 259-264.https://www.doczj.com/doc/7218960835.html,/10.4028/https://www.doczj.com/doc/7218960835.html,/AMM.615.259

[2]Chavarrias, M., Pescador, F., Garrido, M.J., et al. (2015) A Multicore DSP HEVC Decoder Using an Actorbased Da-

taflow Model and OpenMP. IEEE Transactions on Consumer Electronics, 61, 236-244.

https://www.doczj.com/doc/7218960835.html,/10.1109/TCE.2015.7150599

[3]Zheng, Z., Chen, X., Wang, Z., et al. (2011) Performance Model for OpenMP Parallelized Loops. IEEE International

Conference on Transportation, Mechanical, and Electrical Engineering (TMEE), 16-18 December 2011, 383-387.

https://www.doczj.com/doc/7218960835.html,/10.1109/tmee.2011.6199223

[4]Texas Instrument. DataSheet Tms320c6678 Multicore Fixed and Floating-Point Digital Signal Processor. SPRS691D

April 2013.

[5]Texas Instrument (2012) OpenMP Programming for Key Stone Multicore Processors.

[6]Mego, R. and Fryza, T. (2013) Performance of Parallel Algorithms Using OpenMP. Radioelektronika,16-17 April

2013, 236-239. https://www.doczj.com/doc/7218960835.html,/10.1109/radioelek.2013.6530923

[7]Texas Instrument (2011) OpenMP Programming for TMS320C66x Multicore DSPs.

[8]Texas Instrument (2012) TMS320C6000 Optimizing Compiler v7.4 User’s Guide. SPRU187U.

[9]Texas Instrument (2012) TMS320C6000 Assembly Language Tools v7.4 User’s Guide. SPRU186W.

[10]张丽, 陈志强, 高文焕, 等. 均值加速的快速中值滤波算法[J]. 清华大学学报: 自然科学版, 2004, 44(9): 1157-

1159.

期刊投稿者将享受如下服务:

1. 投稿前咨询服务(QQ、微信、邮箱皆可)

2. 为您匹配最合适的期刊

3. 24小时以内解答您的所有疑问

4. 友好的在线投稿界面

5. 专业的同行评审

6. 知网检索

7. 全网络覆盖式推广您的研究

投稿请点击:https://www.doczj.com/doc/7218960835.html,/Submission.aspx

期刊邮箱:jisp@https://www.doczj.com/doc/7218960835.html,

燕山大学多核程序设计实验报告

实验一Windows多线程编程 一、实验目的与要求 了解windows多线程编程机制 掌握线程同步的方法 二、实验环境和软件 WindowsXP VC6.0 三、实验内容 创建线程: HANDLECreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId ); 四、实验程序 #include"stdafx.h" #include #include #include #include usingnamespacestd; voidThreadFrunc1(PVOIDparam) {

while(1) { Sleep(1000); cout<<"ThisisThreadFrunc1"<

多核编程与并行计算实验报告 (1)

(此文档为word格式,下载后您可任意编辑修改!) 多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日

实验一 // exa1.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFunc1(PVOID param) { while(1) { Sleep(1000); cout<<"This is ThreadFunc1"<

实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include using namespace std; DWORD WINAPI FunOne(LPVOID param){ while(true) { Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! "; } return 0; } int main(int argc, char* argv[]) { int input=0; HANDLE hand1=CreateThread (NULL, 0, FunOne, (void*)&input, CREATE_SUSPENDED,

多核程序设计

计算机的发展按照硬件工艺可以分为 第一代(1946~1958):电子管数字计算机。 第二代(1958~1964):晶体管数字计算机。 第三代(1964~1971):集成电路数字计算机。 第四代(1971年以后):大规模集成电路数字计算机。 现代计算机发展历程可以分为两个明显的发展时代: 串行计算时代 并行计算时代。 并行计算机是由一组处理单元组成的,这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。 并行计算机个最主要的组成部分: 计算节点 节点间的通信与协作机制 Flynn根据指令流和数据流的不同组织方式,把计算机系统的结构分为以下四类: 单指令流单数据流(SISD) 单指令流多数据流(SIMD) 多指令流单数据流(MISD) 多指令流多数据流(MIMD) 指令流(instruction stream) 指机器执行的指令序列 数据流(data stream) 指指令流调用的数据序列,包括输入数据和中间结果。 SISD 计算机是传统的顺序执行的计算机 在同一时刻只能执行一条指令(即只有一个控制流)、处理一个数据(即只有一个数据流)。 缺点: 单个处理器的处理能力有限 没有并行计算能力 在MIMD计算机中没有统一的控制部件。 在SIMD机中,各处理单元执行的是同一个程序, 而在MIMD机上,各处理器可以独立执行不同的程序。 MIMD结构比SIMD结构更加灵活。 SIMD计算机用于对不同数据的相同运算(向量和矩阵运算) 而MIMD计算机可以适应更多的并行算法 从系统结构的角度来分类,一般有以下几种: 1)对称多处理器(SMP) 2)分布式共享存储多处理机(DSM) 3)大规模并行处理机(MPP) 4)并行向量处理机(PVP) 5)集群计算机。

多核编程与并行计算实验报告 (1)

多核编程与并行计算实验报告 姓名: 日期:2014年 4月20日 实验一 // exa1.cpp : Defines the entry point for the console application.

// #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFunc1(PVOID param) { while(1) { Sleep(1000); cout<<"This is ThreadFunc1"<

实验二 // exa2.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include #include using namespace std; DWORD WINAPI FunOne(LPVOID param){ while(true) { Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! ";

多核程序设计概述

环/球/I T | 计算机教育 2007.7 | 39 ★英特尔多核课程园地★ 《多核程序设计》概述 浙江大学计算机学院 陈天洲 英特尔中国公司大学合作部 曹 捷 王靖淇/文 半导体技术的进步使单芯片多处理器成为现实并推动着多核计算技术的不断进步。浙江大学从2006年开设单独的多核课程,并联合国内五所重点高校设计编写了《多核程序设计》作为该课程的教材,对多核计算技术进行了全面深入的讲解,以期由此完善学生的知识结构。 1 多核计算技术的概述 随着新材料的应用和新技术的发展,VLSI 技术取得长足进步,在单个芯片上集成多个处理器核心构成多核处理器已经成为处理器技术的主流。按计算内核的对等与否,CMP 可分为同构多核和异构多核。计算内核相同,地位对等的称为同构多核。然而,一般认为处理器通用核的数目在超过16个后,再增加通用处理核的数目就难以带来更大的性能提升。于是出现了一些为特别任务专门定制的专用处理核,包括面向科学计算等的“领域专用核”、图形图像处理和数字信号处理(DSP)等“行业专用核”。这些专用核的体系结构利用特定应用的特征进行定制,从而达到定制应用的高性能和高效率。 从2005年出现的英特尔与AMD 的双核处理器、2006年推出的4核处理器到2007年2月英特尔公司展示的80核处理器,处理器中集成核的数目呈现迅速增多的趋势。除此之外,具有更多核和不同功能核的处理器也在研发,例如整合了1025个简单处理器的芯片Kilocore ,包括1024个8位处理器和1个Power PC 核。 伴随着多核处理器的发展尤其是处理器核数目的增加与处理器核功能的变化,在体系结构、软件、 功耗和安全性设计等方面,巨大的挑战也随之而来。处理器的发展使得原有面向单核或者多处理器的软件架构不适于在单芯片多处理器的硬件结构上充分利用多计算核心的能力,需要相应的软件层面的共同发展。为此,软件结构的变化尤其是针对多核硬件体系结构的程序设计成为有效发挥多核计算能力的重要方面。 为了适应技术的发展,为社会培养合格的计算机人才,在大学计算机教学中开设相应的多核计算课程势在必行。计算机方向课程的开设尤其是教材的设计,不仅要注意到满足完善学生知识结构,适应计算机技术迅速发展的情况,同时也需注意到社会对于多核计算技术方面人才的需求,通过合理的设计,满足知识更新与就业两方面的要求。 2 多核课程设计 多核计算技术的发展使得计算机教学发生了变化,这种变化主要来自于多核计算技术所带来的新的知识点。这些新的知识点主要包括:多核SOC 芯片技术;多核芯片与传统单核微处理器、SMP 的区别;多核下的各种硬件设计技术(Cache 与存储一致性、网络互连、IO 管理);并行体系与多核体系结构;典型多核芯片介绍;嵌入式多核芯片技术;多核平台结构与芯片组支持技术(包括固件技术);多核操作系统;多核系统软件对并行编程的支持;多线程编程对多核的支持;多核多线程编程技术(主要是关于Windows 与Linux 操作系统);OpenMP 对多核的支持;多核平台上的编译工具与编译优化技术;多核API 优化函数库;多核多线程程序的性能评测工具与方法。

多核程序设计考题(样本)

选择题:20% 1.下列不是多核处理器的是B A.INTEL酷睿2 E4500 B.AMD闪龙3000+ C.cell处理器 2.若对于一个给定的应用,用串行算法执行的时间为24秒,用并行算法执行的时间为32秒,则加速比为:A A.0.75 B.1.33 C.1 3.OpenMP是哪种并行编程环境的代表? C A.消息传递 B.数据并行 C.共享存储 4.针对“降低处理器二分之一的频率,会增加二分之一的功率消耗”的说法,下面的选项中哪个是正确的:B A、这个说法是正确的 B、这个说法是错误的 C、对于台式机和服务器,这个说法是正确的,但对于笔记本电脑,这个说法是错误的 5.下面是线程创建函数,其中线程函数定义参数是: A HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID IpParameter, DWORD dwCreationFlags, LPDWORD IpThreadId, ); A.lpParamenter B.lpStartSddress C.lpThreadAttributes 填空题:20% 1并行计算机的两个最主要的组成部分是计算节点和节点间的通信与协作机制 2.按计算内核的对等与否,CMP可分为同构多核和异构多核 3.目前比较主流的片上高效通信机制有两种,一种是基于总线共享的cache结构,一种是基于片上的互联结构. 4.进程具有两个明显的特征,一个是资源特征,另一个是执行特征. 5.线程有4个基本状态:就绪,运行,阻塞,终止 判断题10% 1.根据Amdahl定理,程序的加速比决定于串行部分的性能. . T 2.K-路组关联映射策略很容易产生cache颠簸. F 3.在忙等待条件下发生的饥饿,称为"死锁" F 4.在任何一个线程中调用exit将会结束整个进程. . T 5.墙上时间包括:计算CPU时间,通信CPU时间,同步开销时间和进程空闲时间. T 简答题:30% 1.简述什么是cache映射策略及当前的三种cache映射策略. Cache映射策略指的是内存块和cache线之间如何建立相互映射的关系.

《多核程序设计》概述

《多核程序设计》概述 陈天洲1 曹捷 王靖淇 (浙江大学计算机学院, 杭州 310027) 摘 要: 随着半导体技术的进步,多核芯片已经成为处理器技术的主流。浙江大学根据多核计算技术的发展趋势,以经典体系理论为基础,以培养动手实践能力为目标,开设了多核课程,并以此进行了教材设计,联合清华大学等高校编写了适合于《多核程序设计》,作为多核计算课程教学设计的一种探索。 关键词: 多核计算;课程设计;教材设计;实践 半导体技术的进步使单芯片多处理器成为现实并推动着多核计算技术的不断进步。浙江大学从2006年开设单独的多核课程,并联合国内五所重点高校设计编写了《多核程序设计》作为该课程的教材,对多核计算技术进行了全面深入的讲解,以期由此完善学生的知识结构。 1 多核计算技术的概述 随着新材料的应用和新技术的发展,VLSI技术取得长足进步,在单个芯片上集成多个处理器核心构成多核处理器[1][2][3]已经成为处理器技术的主流。按计算内核的对等与否,CMP可分为同构多核和异构多核。计算内核相同,地位对等的称为同构多核。然而,一般认为处理器通用核的数目在超过16个后,再增加通用处理核的数目就难以带来更大的性能提升。于是出现了一些为特别任务专门定制的专用处理核,包括面向科学计算等的“领域专用核”、图形图像处理和数字信号处理(DSP)等“行业专用核”[5, 6]。这些专用核的体系结构利用特定应用的特征进行定制,从而达到定制应用的高性能和高效率。 从2005年出现的英特尔与AMD的双核处理器[4]、2006年推出的4核处理器到2007年2月英特尔公司展示的80核处理器,处理器中集成核的数目呈现迅速增多的趋势。除此之外,具有更多核和不同功能核的处理器也在研发,例如整合了1025个简单处理器的芯片Kilocore [7],包括1024个8位处理器和1个Power PC核。 伴随着多核处理器的发展尤其是处理器核数目的增加与处理器核功能的变化,在体系结构、软件、功耗和安全性设计等方面,巨大的挑战也随之而来。处理器的发展使得原有面向单核或者多处理器的软件架构不适于在单芯片多处理器的硬件结构上充分利用多计算核心的能力,需要相应的软件层面的共同发展。为此,软件结构的变化尤其是针对多核硬件体系结构的程序设计成为有效发挥多核计算能力的重要方面。 为了适应技术的发展,为社会培养合格的计算机人才,在大学计算机教学中开设相应的多核计算课程势在必行。计算机方向课程的开设尤其是教材的设计,不仅要注意到满足完善学生知识结构,适应计算机技术迅速发展的情况,同时也需要到社会对于多核计算技术方面人才的需求,通过合理的设计,满足知识更新与就业两方面的要求。 2 多核课程设计 1收稿日期: 2007-05-16 作者简介: 陈天洲(1970-),男,浙江,博士,教授,主要研究方向:计算机系统结构、嵌入式系统。 曹捷,男,英特尔中国大学合作部 王靖淇,女,英特尔中国大学合作部

02多线程的那点儿事(之多核编程)

多核编程并不是最近才兴起的新鲜事物。早在intel发布双核cpu之前,多核编程已经在业内存在了,只不过那时候是多处理器编程而已。为了实现多核编程,人们开发实现了几种多核编程的标准。open-mp就是其中的一种。对于open-mp还不太熟悉的朋友,可以参照维基百科的相关解释。 open-mp的格式非常简单,原理也不难。它的基本原理就是创建多个线程,操作系统把这几个线程分到几个核上面同时执行,从而可以达到快速执行代码的目的。比如说,我们可以编写一个简单的例子。 在编写open-mp程序之前,朋友们应该注意下面三点, (1) 使用vs2005或者以上的版本编写open-mp程序; (2) 编写程序的时候,选择【Property Pages】->【Configuration Properties】->【c/c++】->【language】->【OpenMp Support】,打开开关; (3) 添加#include 声明。 首先,我们编写简单的一个打印程序,看看结果。 [cpp]view plaincopy 1.#include 2. 3.void print() 4.{ 5.int i; 6.#pragma omp parallel for 7.for(i = 0; i < 100; i ++) 8. { 9. printf("%d\n", i); 10. } 11.} 上面这段代码好像也没有什么特别的地方,但是我们可以在printf设一个断点,看看函数调用堆栈, [cpp]view plaincopy 1.openmp.exe!print$omp$1() Line 14 C++ 2.vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0x19c bytes 3.vcompd.dll!_vcomp::ParallelRegion::HandlerThreadFunc() + 0xe0 bytes 4.vcompd.dll!_InvokeThreadTeam@12() + 0x98 bytes 5.vcompd.dll!__vcomp_fork() + 0x1cd bytes 6.openmp.exe!print() Line 11 + 0xe bytes C++

多核架构及编程技术

《多核架构及编程技术》设计报告 基于OpenMP的二维方阵相乘及 基于IPP的函数DFT及反变换 学院:电子信息学院 专业:通信工程 学号: 2011301200237 姓名:叶子童 指导老师:谢银波 时间: 2013年6月

基于OpenMP的二维方阵相乘 姓名:叶子童专业:通信工程学号:2011301200237 指导教师:谢银波 [设计原理] 声明3个800阶的矩阵,用srand函数对A,B矩阵随机赋值,在主程序中用3个for循环来进行计算,用OpenMP实现循环并行化,用clock()函数统计运算时间并输出时间及C矩阵。 [主要功能] 计算2个随机生成的800阶二维矩阵相乘的结果,统计运算时间并输出结果矩阵。 [设计的主要内容] 实验代码为: #include"stdafx.h" #include #include #include"stdlib.h" #include #include int a[800][800], b[800][800], c[800][800];

int main() { int i, j, t, k; double duration; clock_t start, finish; for (int i=0;i<800;i++) for (int j=0;j<800;j++) a[i][j]=rand()%100; //随机产生-100的随机整数 for (int i=0;i<800;i++) for (int j=0;j<800;j++) b[i][j]=rand()%100; start=clock(); #pragma omp parallel shared(a,b,c) private(i,j,k) #pragma omp for schedule(dynamic) //循环动态分割成大小为chunk的块,动态分割给线程for(i=0;i<800;i++) { for(j=0;j<800;j++) { c[i][j]=0; for(k=0;k<800;k++) { c[i][j]+=a[i][k]*b[k][j]; } } } printf( "Time to do the calculate is "); finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%2.6f seconds\n", duration ); Sleep(2000); for(i = 0;i < 800;i++) { for(j = 0;j < 800;j++) { printf("%d ",c[i][j]); } printf("\n"); } return 0; } 输出的运算时间为3.483s。

燕山大学多核程序设计实验报告

实验一Windows多线程编程一、实验目的与要求 了解windows多线程编程机制 掌握线程同步的方法 二、实验环境和软件 Windows XP VC 6.0 三、实验内容 创建线程: HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 四、实验程序 #include"stdafx.h" #include #include #include #include using namespace std; void ThreadFrunc1(PVOID param) {

while(1) { Sleep(1000); cout<<"This is ThreadFrunc1"<

并行计算与多核程序设计

第四章Windows多线程编程及 调优->web课件 返回 在Windows平台下可以通过Windows的线程库来实现多线程编程,可以利用Win32 API或MF C以及.Net Framework提供的接口来实现。实现方式的多样化给Windows编程带来了很大的灵活性,但也使得多线程编程变得复杂。对于多线程的程序我们可以使用Visual Studio调试工具进行调试,也可以使用多核芯片厂家的线程分析与调试工具进行调试及优化。 Windows线程库介绍 Win32 API是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。Win32 API提供了一系列处理线程的函数接口,来向应用程序提供多线程的功能。 MFC是微软基础函数类库(Microsoft Foundation Classes),由微软提供的,用类库的方式将Wi n32 API 进行封装, 以类的方式提供给开发者。在MFC类库中,提供了对多线程的支持。由于MF C是在Win32 API 基础之上进行封装的,其基本原理与Win32 API的基本实现原理很类似。MFC 对同步对象作了封装,因此对用户编程实现来说更加方便。 .NET Framework由两部分构成:公共语言运行库(Common Language Runtime ,CLR)和Fra mework类库(Framework Class Library ,FCL)。CLR包括自己的文件加载器、垃圾收集器、安全系统等。CRL提供了一个可靠而完善的多语言运行环境。CLR是一个软件引擎,用于加载应用程序、检查错误、进行安全许可认证、执行和清空内存。Framework类库提供了所有应用程序模型都要使用的一个面向对象的API集合。.NET 基础类库的System.Threading命名空间提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在System.Threading命名空间中。其中Thread类用于创建及管理线程,ThreadPool类用于管理线程池等,此外还提供线程间通讯等实际问题的机制。 使用win32线程API Win32 函数库中提供了操作多线程的函数,包括创建线程、管理线程、终止线程、线程同步等接口。 线程必须从一个指定的函数开始执行,该函数称为线程函数,具有如下原型: DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm); 线程创建 创建线程的函数如下:

多核程序设计(最重要的)

一、多项选择 1.计算机的硬件工艺发展的顺序是:(A) A.电子管数字计算机、晶体管数字计算机、集成电路数字计算机、大规模集成 电路数字计算机。 B.晶体管数字计算机、电子管数字计算机、集成电路数字计算机、大规模集成 电路数字计算机。 C.电子管数字计算机、集成电路数字计算机、大规模集成电路数字计算机、晶 体管数字计算机。 D.电子管数字计算机、集成电路数字计算机、晶体管数字计算机、大规模集成 电路数字计算机 2.下面关于Intel8086芯片与8088芯片的描述,不正确的是:(D) A.8086是第一个16位的微处理器。 B.8088是第一个16位的微处理器。 C.8086每周期能传送或接受16位整数。 D.8088每周期能传送或接受16位整数。 3.针对内存的速度瓶颈,英特尔为80386设计了--------来解决这个速度瓶颈:(B)A.虚拟86. B.高速缓存(Cache). C.浮点运算单元。 D.多媒体扩展指令集。 4.对一个具体的问题做性能优化时,可以同时在这多个层次上考虑可能的优化手段,一般来说:(AB) A.在越高的层次上进行优化,可能获得的效益越高。 B.在越高的层次上进行优化工作则相对越容易实现。 C.在越高的层次上进行优化,可能获得的效益越低。 D.在越低的层次上进行优化工作则相对越难于实现。 5.VTune性能分析器中的取样功能有哪几种方式?(AC) A.基于时间取样 B.随机取样。 C.基于事件取样。 D.线性取样。 6.Intel调优助手能够给我们自动推荐代码改进方法,主要有以下哪些方面?(BCD) A.算法自动改进。 B.处理器瓶颈以及改进。 C.取样向导增强。 D.超线程。 7.使用-O3编译选项所得的程序,执行效率比使用-O2编译选项所得的程序--:(D)

积分计算pai 多核编程 cqupt

重庆邮电大学 多核编程与并行计算实验报告 姓名: 班级: 学号: 日期:2014年 4月11 日

一实验目的和要求 积分法计算圆周率 如图 2-1所示:梯形积分——每一竖条都拥有固定宽度的“梯级”。每个竖条的高度便是被积函数的值。将所有竖条的面积加在一起便得出曲线下面积的近似值,即被积函数的值。 若选择一个被积函数及积分极限,那么该积分在数值上便等于π。这样就构成了利用积分法计算圆周率的基本思路。 图2-1 编写多线程程序,计算圆周率π值,并在Visual Studio 2005上调试、运行输出结果;说明程序设计的基本思路,以及如何实现线程的互斥和同步? 二实验环境与软件 Visual studio 2010 三实验内容 积分法计算圆周率 四实验步骤 编写多线程程序,计算圆周率π值,并在Visual Studio 2005上调试、运行输出结果

五实验结果 源代码 #include #include #include #include #include using namespace std; static long num_steps=10; double step,pi; int main() { int i; double x,sum=0.0; clock_t start,finish; printf("请输入您要用几步来进行计算\n"); cin>>num_steps; step=1.0/(double)num_steps; start=clock(); #pragma omp parallel for num_threads(8) default(shared) private(x) reduction(+:sum) for(i=0;i

(完整word版)VxWorksSMP多核编程指南

VxWorks SMP多核编程指南 本文摘自vxworks_kernel_programmers_guide_6.8 第24章 1.介绍 VxWorks SMP是风河公司为VxWorks设计的symmetric multiprocessing(SMP)系统。它与风河公司的uniporcessor(UP)系统一样,具备实时操作系统的特性。 本章节介绍了风河VxWorks SMP系统的特点。介绍了VxWorks SMP的配置过程、它与UP编程的区别,还有就是如何将UP代码移植为SMP代码。 2.关于VxWorks SMP 多核系统指的是一个系统中包含两个或两个以上的处理单元。SMP是多核技巧中的一个,它的主要特点是一个OS运行在多个处理单元上,并且内存是共享的。另一种多核技巧是asymmetric multiprocessing(AMP)系统,即多个处理单元上运行多个OS。 (1)技术特点 关于CPU与处理器的概念在很多计算机相关书籍里有所介绍。但是,在此我们仍要对这二者在SMP系统中的区别进行详细说明。 CPU:一个CPU通常使用CPU ID、物理CPU索引、逻辑CPU索引进行标示。一个CPU ID通常由系统固件和硬件决定。物理CPU索引从0开始,系统从CPU0开始启动,随着CPU个数的增加,物理CPU索引也会增加。逻辑CPU索引指的是OS实例。例如,UP 系统中逻辑CPU的索引永远是0;对于一个4个CPU的SMP系统而言,它的CPU逻辑索引永远是0到3,无论硬件系统中CPU的个数。 处理器(processor):是一个包含一个CPU或多个CPU的硅晶体单元。 多处理器(multiprocessor):在一个独立的硬件环境中包含两个以上的处理器。 单核处理器(uniprocessor):一个包含了一个CPU的硅晶体单元。 例如:a dual-core MPC8641D指的是一个处理器上有两个CPU;a quad-core Broadcom 1480指的是一个处理器上有四个CPU。 在SMP系统上运行UP代码总会遇到问题,即使将UP代码进行了更新,也很难保证代码很好的利用了SMP系统的特性。对于在SMP上运行的代码,我们分为两个级别:SMP-ready:虽然可以正常的运行在SMP系统上,但是并没有很充分的利用SMP系统的特点,即没有利用到多核处理器的优势; SMP-optimized:不仅可以正常的运行在SMP系统上,而且还能很好的利用SMP系统的特点,使用多个CPU使多个任务可以同时执行,提高系统的效率,比UP系统的效果更加明显。 (2)VxWorks SMP OS特点 VxWorks单核编程(UP)与SMP编程在多数情况下是一样的。类似的,多数API在

对于多核cpu和多核编程模型的讨论

对于多核cpu和多核编程模型的讨论 多内核定义: 多内核(multicore chips)是指在一枚处理器(chip)中集成两个或多个完整的计算引擎(内核)。 背景: 为什么不能用单核的设计达到用户对处理器性能不断提高的要求呢? 答案是功耗问题限制了单核处理器不断提高性能的发展途径。 多核技术的开发源于工程师们认识到,仅仅提高单核芯片(one chip)的速度会产生过多热量且无法带来相应的性能改善,先前的处理器产品就是如此。他们认识到,在先前产品中以那种速率,处理器产生的热量很快会超过太阳表面。即便是没有热量问题,其性价比也令人难以接受,速度稍快的处理器价格要高很多。 上世纪八九十年代以来,推动微处理器性能不断提高的因素主要有两个:半导体工艺技术的飞速进步和体系结构的不断发展。半导体工艺技术的每一次进步都为微处理器体系结构的研究提出了新的问题,开辟了新的领域;体系结构的进展又在半导体工艺技术发展的基础上进一步提高了微处理器的性能。这两个因素是相互影响,相互促进的。一般说来,工艺和电路技术的发展使得处理器性能提高约20倍,体系结构的发展使得处理器性能提高约4倍,编译技术的发展使得处理器性能提高约1.4倍。但这种规律性的东西却很难维持。 多核的出现是技术发展和应用需求的必然产物。这主要基于以下事实: 1.晶体管时代即将到来 根据摩尔定律,微处理器的速度以及单片集成度每18个月就会翻一番。多核通过在一个芯片上集成多个简单的处理器核充分利用这些晶体管资源,发挥其最大的能效。 2.门延迟逐渐缩短,而全局连线延迟却不断加长 3.符合Pollack规则 按照Pollack规则,处理器性能的提升与其复杂性的平方根成正比。如果一个处理器的硬件逻辑提高一倍,至多能提高性能40%,而如果采用两个简单的处理器构成一个相同硬件规模的双核处理器,则可以获得70%~80%的性能提升。同时在面积上也同比缩小。 4.能耗不断增长 5.设计成本的考虑 6.体系结构发展的必然 研究人员提出了两种新型体系结构: 单芯片多处理器(CMP)与同时多线程处理器(Simultaneous Multithreading,SMT),这两种体系结构可以充分利用这些应用的指令级并行性和线程级并行性,从而显著提高了这些应用的性能。 从体系结构的角度看,SMT比CMP对处理器资源利用率要高,在克服线延迟影响方面更具优势。CMP相对SMT的最大优势还在于其模块化设计的简洁性。复制简单设计非常容易,指令调度也更加简单。同时SMT中多个线程对共享资源的争用也会影响其性能,而CMP对共享资源的争用要少得多,因此当应用的线程级并行性较高时,CMP性能一般要优于SMT。此外在设计上,更短的芯片连线使CMP比长导线集中式设计的SMT更容易提高芯片的运行频率,从而在一定程度上起到性能优化的效果。 总之,单芯片多处理器通过在一个芯片上集成多个微处理器核心来提高程序的并行

多线程与多核编程

第13章 多线程与多核编程 多任务的并发执行会用到多线程(multithreading ),而CPU 的多核(mult-core )化又将原来只在巨型机中才使用的并行计算(parallel computing )带入普通PC 应用的多核程序设计(multi-core programming )中。 13.1 进程与线程 进程(process )是执行中的程序,线程(thread )是一种轻量级的进程。 13.1.1 进程与多任务 现代的操作系统都是多任务(multitask )的,即可同时运行多个程序。进程(process )是位于内存中正被CPU 运行的可执行程序。参见图15-1。 图15-1 程序与进程 目前的主流计算机采用的都是冯·诺依曼(John von Neumann )体系结构——存储程序计算模型,程序(program )就是在内存中顺序存储并以线性模式在CPU 中串行执行的指令序列。对于传统的单核CPU 计算机,多任务操作系统的实现是通过CPU 分时(time-sharing )和程序并发(concurrency )完成的。即在一个时间段内,操作系统将CPU 分配给不同的程序,虽然每一时刻只有一个程序在CPU 中运行,但是由于CPU 的速度非常快,在很短的时间段中可在多个进程间进行多次切换,所以用户的感觉就像多个程序在同时执行,我们称之为多任务的并发。 13.1.2 进程与线程 程序一般包括代码段、数据段和堆栈,对具有GUI (Graphical User Interfaces ,图形用户界面)的程序还包含资源段。进程(process )是应用程序的执行实例,即正在被执行的程序。每个进程都有自己的虚拟地址空间,并拥有操作系统分配给它的一组资源,包括堆栈、寄存器状态等。 线程(thread )是CPU 的调度单位,是进程中的一个可执行单元,是一条独立的指令执行路径。线程只有一组CPU 指令、一组寄存器和一个堆栈,它本身没有其他任何资源,而是与拥有它的进程共享几乎一切,包括进程的数据、资源和环境变量等。线程的创建、维护和管理给操作系统的负担比进程要轻得多,所以才叫轻量级的进程(lightweight process )。 一个进程可以拥有多个线程,而一个线程只能属于一个进程。每个进程至少包含一个线程——主线程,它负责程序的初始化工作,并执行程序的起始指令。随后,主线程可为执行各种不同的任务而分别创建多个子线程。 一个程序的多个运行,可以通过启动该程序的多个实例(即多个进程)来完成,也可以进程(内存中) 可执行文件(磁/U/光盘上) 运行

相关主题
文本预览
相关文档 最新文档