多核报告gai

更新时间:2024-05-19 09:37:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1

《多核架构及编程技术》设计报告

综合设计

学 院: 电子信息学院 专 业: 电子信息工程 学 号: 2011301200025 姓 名: 江燕婷 指导老师: 谢银波

时 间: 2014年5月20号

综合设计

姓名:江燕婷 专业:电子信息工程 学号:2011301200025 指导教师:谢银波

一、设计原理

1.OpenMP是面向共享内存与多分布式共享内存的多处理器多线程并行编程语言,具有良好的可移植性,支持多种编程语言,支持多种平台。基本的OpenMP编译制导语句有:parallel、for、parallel for、sections等,常用的库函数有omp_get_num_threads、omp_get _threads_num、omp_set_num_threads等。

2.Intel IPP(integrated performance primitives)即Intel集成性能基元。它具有跨平台和操作系统的通用API,是一个交叉架构的跨平台软件库,提供了大量的库函数功能。Intel IPP中一维信号处理功能主要集中在计算滤波、分析、编码4个方面。Intel IPP提供了很多信号发生函数,可作为信号发生器使用Intel IPP中的频域滤波采用ippsFFT根函数或者ippsDFT根函数。

3.使用Intel辅助软件工具可以对多核程序实现调试与性能优化。Intel C++编译器可针对采用C和C++语言编写的应用程序代码进行编译、链接和优化,充分发挥Intel多核处理器的潜能,提高该应用程序的性能。Intel VTune Amplifier可以帮助程序员定位并定性分析程序中与性能有关方面的内容,其主要功能有采样寻找热点问题、提供源代码级的性能问题信息、使用调用曲线图评测查找关键路径等。

二、设计要求

1、已知二维方阵:A[N] [N]、B[N] [N]、C[N] [N],N=800,C=A×B,采用随机函数srand产生[0-100]的随机整数,给矩阵A,B赋初始值,并计算C的值。 要求:① 采用OpenMP进行并行处理; ② 统计C矩阵生成所耗费的时间;

③ 使用工具进行性能优化,比较优化前后时间差;

2、求函数 y=|sin(ex)|在区间(0—5120)做单位采样后的DFT变换结果。 要求:① 统计转换时间,并绘图显示C曲线;

② 将DFT结果作DFT反变换,比较与原函数的差异;

③ 回答是否采用了多线程方法,从什么地方可以得出这一结论?

3、采用工具分析以上程序的热点问题及多线程性能情况

三、设计内容一

已知二维方阵:A[N] [N]、B[N] [N]、C[N] [N],N=800,C=A×B,采用随

2

机函数srand产生[0-100]的随机整数,给矩阵A,B赋初始值,并计算C的值。

1.用srand函数产生随机数的方法

定义函数:void srand(unsigned int seed)

srand()用来设置rand()产生随机数时的随机数种子,通常用时间来作为随机数生成器的种子,time的值每时每刻都不同,种子不同,所以产生的随机数也不同。srand(time(NULL))产生一个以当前时间为随机数的种子)rand()0产生一个0到100的随机整数。需要的头文件为#include\。

2.使用定时器clock()可记录生成矩阵C所需要的时间。

3.遇到的问题:程序编译通过后运行结果出错,如下图所示:

图1

当N值小于292时可正常运行,无错误提示,说明是由于数组较大(N×N=800×800)引起的。Windows默认的堆栈保留大小为1MB,而int型输出组为32位4字节,3组int[800][800]即为800*800*4*3位,为7680000字节,因此1MB的堆栈保留远远不够,导致运行出错。解决办法有两种,方法一可以直接修改系统保留堆栈大小,在VS2012的项目—属性—配置属性—链接器—所有选项里面的“堆栈保留大小”(单位是字节)修改为8000000即可。方法二是采用动态内存分配,因为动态内存分配用到的是堆段,而堆段是直接存到散碎的内存中而不需要入栈的,所以会避免堆栈过小而溢出的问题,具体见粘贴代码部分。方法一运行显示时间要比方法二时间短,这是由于修改堆栈时内存是固态,是连续的,而动态内存分配需要不断地更改地址,相乘计算所需时间较长。如下图所示:

图2 方法一运算结果

图3 方法二运算结果

报告中均采用修改堆栈大小的程序。

5.用OpenMP对程序进行并行处理,对矩阵A与矩阵B的相乘过程用parallel for编译制导语句实现并行化操作。即,

#pragma omp parallel for shared(A,B,C) private(i,j,k) 相乘计算的for循环体将被两条线程并行执行。并行处理前后的运行结果比较如下图所示:

3

图4 并行处理前

图5 并行处理后

可见采用OpenMP进行并行处理后生成C矩阵的时间大大缩短了。 CPU使用记录如下图所示:

图6 并行处理前后CPU使用记录对比

7.使用Intel C++编译器优化编译,

图7

运行结果为:

图8

8.使用工具Intel VTune Amplifier XE 2013分析程序性能

(1)在VS2012中选择要进行性能分析的工程Test_Array_OpenMP并点击Intel VTune工具的New Analysis菜单,进入如下界面,

4

图9

(2)选择一种分析类型,这里我们选择Basic Hotspots(基本热点)。热点分析指出最耗时的代码。热点分析不能用来分析整个系统,但是可以加载一个程序或者附加到一个进程中进行分析。热点分析使用用户态采样和跟踪分析方法。 (3)点击Start即可开始。开始后会自动生成前面选择的工程,启动程序,开始收集数据。收集工作完成后将会自动进行分析并显示结果。如下图所示,

图10

图11

5

(4)由Bottom-up图可以获得目标进程中的线程信息,最耗用时间的函数及其调用关系。从

上图可以看出,在耗用时间最多的函数就是主函数,因为该程序中仅有主函数而没有调用函数。而其中耗用时间最多的也就在于使用OpenMP由主线程创建并行线程所在的并行域,这是因为该部分在进行的是矩阵A与矩阵B的相乘运算。

(5)由Summary图显示分析获取的数据统计,包括程序消耗的时间,热点位置和程序运行的计算机环境参数等。

图12

9.使用工具Intel Inspector XE2013工具分析内存错误,分析线程错误,分析程序中的错误和安全漏洞。

选择分析类型为Detect Deadlocks,点击Start开始,分析结果如下图所示,

图13

没有发现线程错误与漏洞。

四、设计内容二

求函数 y=|sin(ex)|在区间(0—5120)做单位采样后的DFT变换结果。

6

1.下载并安装Intel IPP库,在VS2012中完成IPP的编程头文件与库文件路径设置。

2.使用ippCore.lib库的ippGetCpuClocks()函数访问处理器的时钟记录器,通过两个记录器相减以测试DFT计算消耗的准确时间,即 start=ippGetCpuClocks(); ??

end= ippGetCpuClocks();

3.使用ipps.lib函数库中的相关函数实现DFT变换的计算, ippsDFTInitAlloc_R_32f(&pDFTSpec,len,IPP_FFT_DIV_INV_BY_N,

ippAlgHintFast)分配和初始化一种采用傅里叶变换的优化执行表的特殊结构,它设置了指针变量pDFTSpec

ippsDFTFwd_RToCCS_32f(pSrc,(Ipp32f*)pDst,pDFTSpec,0 )实现FFT正变换 ippsDFTInv_CCSToR_32f(pSrc,(Ipp32f*)pDst,pDFTSpec,0)实现FFT反变换 IppStatus ippsExp_32f(const Ipp32f* pSrc,Ipp32f* pDst,int len)实现信号e^x的产生

IppStatus ippsSin_32f_A11(const Ipp32f* pSrc,Ipp32f* pDst,Ipp32s len) 实现正弦信号sin(x)的产生

ippsMagnitude_32fc(pDst, pDstMag, len)计算由pDst指针指向的一个复数的模,并存放到pDstMag指针

4.遇到的问题

(1)错误提示:error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation,use _CRT_SECURE_NO_WARNINGS. See online help for details.

解决方法:右击工程--属性--配置属性--C/C++--命令行,在命令行中增加 /D _CRT_SECURE_NO_WARNINGS

产生错误的原因是这个方法不是安全的CRT,当然,建议使用安全的CRT,但如果不想用(有时候为了安全性,得多写几行代码),要禁止这个警告 ,得定义一个宏

#define _CRT_SECURE_NO_WARNINGS 或者将sprintf改成sprintf_s。

(2)错误提示:error C4996: 'ippsDFTFree_R_32f': is deprecated. This function is obsolete and will be removed in one of the future IPP releases. Internal memory allocation will not be supported - use GetSize and Init pair for this functionality. Use the following link for details: http://software.intel.com/en-us/articles/intel-ipp-71-deprecated-features/

解决方法:代码中找到ippsDFTFree_R_32f,选中ippsDFTFree_R_32f,右击--转到定义,找到该函数后把其上面一行/**/掉即可。 (3)错误提示:

7

图14

解决方法:在系统环境变量path中添加dll的目录即可。 5.运行结果

图15

图16

6.使用Intel C++编译器优化编译后运行结果为:

图17

8

7.使用工具Intel VTune Amplifier XE 2013分析程序性能

图18

图19

图20

由热点函数可看出在DFT计算过程中使用到了多线程工作。

9

图21

图22

图23

10

本文来源:https://www.bwwdw.com/article/zwm7.html

Top