资料介绍
引言
公司基于超标量体系结构的某款PowerPC芯片开发出了电力系列自动化装置,它对实时性要求很高。但软件的运行效率低,这就需要我们针对该芯片的超标量体系结构特点进行软件优化。实践中,在针对性优化后进行对比实验,装置软件运行效率大大提高,实际效果良好。
1 超标量体系结构PowerPC芯片特点
1.1 超标量体系结构芯片
PowerPC芯片属于超标量体系结构。超标量体系结构是一种微处理器设计模式,它能够在一个时钟周期内执行多条指令。在超标量体系结构设计中,处理器或指令编译器判断指令能否独立于其他顺序指令而执行,或是依赖于另一指令,必须按顺序执行。然后处理器使用多个执行单元并行执行两个或更多独立指令。
1.2 PowerPC芯片特点
1.2.1 流水线机制
该芯片一条指令,可简单分为取指、译码、执行,提交4个时钟周期操作。同一周期,CPU的不同部件可并行执行多条指令的不同操作,从而达到指令并行,提高CPU的吞吐率。
1.2.2 总线频率
该芯片的主频达到400 MHz,但访问内存的总线频率是100 MHz,只有主频的1/4。由此可见,当访问内存数据时,其运行时间比执行计算程序慢多了。当系统大量访问内存时,系统运行速度会明显下降。
1.2.3 16 KB的指令Cache和16 KB的数据Cache
PowerPC芯片中指令Cache和数据Cache中访问指令和数据的速度与主频一样。同样,当读取指令和数据时在Cache中读取的速度约是内存中读取速度的4倍。
(1) 指令Cache运作机制
每次指令运行时若指令未在指令Cache中,即指令Cache未命中,则一次从内存中读出待执行的连续32字节(32字节相当于8个浮点数)指令到指令Cache。同时将指令Cache中最久未访问的代码淘汰出Cache。32字节相当于3~5条普通C语言代码。
(2) 数据Cache运作机制
每次访问数据时,若数据未在数据Cache中,即数据Cache未命中,则一次从内存中读出连续32字节数据到数据Cache。同时将数据Cache中最久未访问的数据淘汰出Cache。
2 从超标量流水线机制的角度进行优化
2.1 超标量流水线机制对程序效率的分析
从前面的流水线机制可以看到,若指令能达到尽可能的并行,程序运行效率会明显提高。这就需要优化代码,让编译器优化成并行指令。
2.2 从提高指令并行和流水线不被打断的角度进行优化
要提高指令并行,主要就要提高代码并行可能性。防止流水线不被打断,就是要尽量避免跳转。
2.2.1 循环体代码并行执行的优化
代码举例1:
for(i=0;i《1000;i++) {
Y[i]=Y[i]+Y[i-1];
}
该代码循环体代码之间因为存在相关数据,导致代码无法被CPU并行执行,需要避免类似代码。
代码举例2:
for(i=0;i《1000;i++) {
Y[i]=X[i]+Z[i];
}
该代码循环体代码之间不存在相关,能被CPU并行执行。CPU执行时代码如下:
Y[0]=X[0]+Z[0],
Y[1]=X[1]+Z[1],
Y[2]=X[2]+Z[2],
Y[3]=X[3]+Z[3],
2.2.2 代码顺序执行避免跳转的优化
跳转的语句主要有if_else结构、switch_case结构、循环结构等。
if_else结构可以将选择概率最大的语句放到if语句之后。因为取指时,紧接着if语句的指令会被取到。这样发生跳转的次数降低,流水线被中断的概率降低。
尽量降低循环嵌套层数和循环次数,这样发生跳转的次数也降低。
2.2.3 避免小段程序代码循环的优化
比如2~3句的小循环,可以适当展开。
一是可以提高循环内指令并行的可能性。
二是可以减少跳转次数。
循环体代码超过10句普通C语言代码,可以不要展开。
3 从指令Cache的角度进行优化
3.1 指令Cache对程序效率的分析
从前面分析可知,若程序取指环节能从指令Cache中读取,而不是每次都从内存中读取,则能显著提高程序执行速度。
3.2 从提高指令Cache命中的角度进行优化
① 尽量使程序顺序执行。
② 避免大量相似的代码重复实现、分散调用。
③ 尽量将相同的代码在一个地方循环执行,提高指令Cache的命中率。不要分散执行,导致多次读取同一段代码到指令Cache中。
3.2.1 多个相似函数的优化
代码举例3:
{
FuncA;//3个相似函数连续调用
FuncB;
FuncC;
}
优化为
for(i=0;i《3;i++) {
Func(i);
}
这样相同的代码一次即可从内存读到Cache中,另外2次指令都是从Cache中读取。
3.2.2 大函数拆分的优化
由于函数体较大,超出了指令Cache的大小,导致第1次循环结束、第2次循环开始时,函数体前面内容已经被调出Cache。同样代码又重新从内存中读取到Cache中,如此反复,实际的结果是函数体Func代码被三次从内存中读取到Cache中,导致效率大大降低。
代码举例4:
for(i=0;i《3;i++) {
Func(i);
}
被优化为:
for(i=0;i《3;i++) {
Func1(i);
}
for(i=0;i《3;i++) {
Func2(i);
}
for(i=0;i《3;i++) {
Func3(i);
}
将函数体Func分成几个单独的子函数:Func1、Func2、Func3,然后分别循环。这样Func1循环时,由于代码量较小,整个函数体都在Cache中。Func2、Func3类似。这样的结果是,函数体Func1、Func2、Func3都只从内存被读一次到Cache中。
4 从数据Cache的角度进行优化
4.1 数据Cache对程序效率的分析
从前面分析可知,在程序取操作数环节,若能从数据Cache中读取操作数,而不是每次都从内存中读取则能提高程序执行速度。
4.2 从提高数据Cache命中的角度进行优化
① 访问数据时,最好是对同一段数据在一个地方集中访问。
② 访问数据时,最好是根据数据的顺序依次访问。比如对数组的访问,最好是按数组成员依次访问,效率较高。
③ 为了使程序能够连续访问数据,需要调整数据结构、重构代码使得数据结构和程序配合,提高数据Cache的命中率。
4.2.1 数组连续访问的优化
代码举例5:
float afBuf[1000];
float xBuf[8][24];
Func {
for(i=0;i《24;i++) {
xBuf[0][i]=afBuf[0+i];
xBuf[1][i]=afBuf[24+i];
……
xBuf[7][i]=afBuf[168+i];
}
}
被优化为:
Func {
for(i=0;i《8;i++) {
m=i*24;
xBuf[i][0]=afBuf[0+m]
xBuf[i][1]=afBuf[1+m];
……
xBuf[i][23]=afBuf[23+m];
}
}
这样优化后,数据每次访问都是连续的。
4.2.2 将不连续数据访问重构为连续访问的优化
代码举例6:
floatafBufA[24];
floatafBufB[24];
floatafBufC[24];
floatxbuf[200];
Func {
xBuf[0]=afBufA[0];
xBuf[1]=afBufB[0];
xBuf[2]=afBufC[0];
……
xBuf[69]=afBufA[23];
xBuf[70]=afBufB[23];
xBuf[71]=afBufC[23];
}
被优化为:
struct {
float fA;
float fB;
float fC;
} aBufABC[24];
floatxbuf[200];
Func {
xBuf[0]=aBufABC[0].fA;
xBuf[1]=aBufABC[0].fB;
xBuf[2]=aBufABC[0].fC;
……
xBuf[69]=aBufABC[23].fA;
xBuf[70]=aBufABC[23].fB;
xBuf[71]=aBufABC[23].fC;
}
5 软件优化实验结果
5.1 优化对比实验
在自动化装置的主要消耗资源的实时扫描任务中进行了代码分析,并按上述可能优化措施进行了优化。优化前实时扫描任务占用资源为系统CPU总资源的52%。代码优化后实时扫描任务占用CPU资源只有系统总资源的31%。
对比可以看出,系统效率提高了40%,效果是非常明显的。
结语
虽然CPU的标称性能指标非常高,但其有专用的体系结构,对一般开发者的编程开发方式而言并不是完全匹配,导致发挥不出CPU的潜力。所以有针对性的根据CPU的体系结构特点进行分析,并采取针对性的优化措施,才能真正发挥其性能,满足嵌入式强实时性要求。
公司基于超标量体系结构的某款PowerPC芯片开发出了电力系列自动化装置,它对实时性要求很高。但软件的运行效率低,这就需要我们针对该芯片的超标量体系结构特点进行软件优化。实践中,在针对性优化后进行对比实验,装置软件运行效率大大提高,实际效果良好。
1 超标量体系结构PowerPC芯片特点
1.1 超标量体系结构芯片
PowerPC芯片属于超标量体系结构。超标量体系结构是一种微处理器设计模式,它能够在一个时钟周期内执行多条指令。在超标量体系结构设计中,处理器或指令编译器判断指令能否独立于其他顺序指令而执行,或是依赖于另一指令,必须按顺序执行。然后处理器使用多个执行单元并行执行两个或更多独立指令。
1.2 PowerPC芯片特点
1.2.1 流水线机制
该芯片一条指令,可简单分为取指、译码、执行,提交4个时钟周期操作。同一周期,CPU的不同部件可并行执行多条指令的不同操作,从而达到指令并行,提高CPU的吞吐率。
1.2.2 总线频率
该芯片的主频达到400 MHz,但访问内存的总线频率是100 MHz,只有主频的1/4。由此可见,当访问内存数据时,其运行时间比执行计算程序慢多了。当系统大量访问内存时,系统运行速度会明显下降。
1.2.3 16 KB的指令Cache和16 KB的数据Cache
PowerPC芯片中指令Cache和数据Cache中访问指令和数据的速度与主频一样。同样,当读取指令和数据时在Cache中读取的速度约是内存中读取速度的4倍。
(1) 指令Cache运作机制
每次指令运行时若指令未在指令Cache中,即指令Cache未命中,则一次从内存中读出待执行的连续32字节(32字节相当于8个浮点数)指令到指令Cache。同时将指令Cache中最久未访问的代码淘汰出Cache。32字节相当于3~5条普通C语言代码。
(2) 数据Cache运作机制
每次访问数据时,若数据未在数据Cache中,即数据Cache未命中,则一次从内存中读出连续32字节数据到数据Cache。同时将数据Cache中最久未访问的数据淘汰出Cache。
2 从超标量流水线机制的角度进行优化
2.1 超标量流水线机制对程序效率的分析
从前面的流水线机制可以看到,若指令能达到尽可能的并行,程序运行效率会明显提高。这就需要优化代码,让编译器优化成并行指令。
2.2 从提高指令并行和流水线不被打断的角度进行优化
要提高指令并行,主要就要提高代码并行可能性。防止流水线不被打断,就是要尽量避免跳转。
2.2.1 循环体代码并行执行的优化
代码举例1:
for(i=0;i《1000;i++) {
Y[i]=Y[i]+Y[i-1];
}
该代码循环体代码之间因为存在相关数据,导致代码无法被CPU并行执行,需要避免类似代码。
代码举例2:
for(i=0;i《1000;i++) {
Y[i]=X[i]+Z[i];
}
该代码循环体代码之间不存在相关,能被CPU并行执行。CPU执行时代码如下:
Y[0]=X[0]+Z[0],
Y[1]=X[1]+Z[1],
Y[2]=X[2]+Z[2],
Y[3]=X[3]+Z[3],
2.2.2 代码顺序执行避免跳转的优化
跳转的语句主要有if_else结构、switch_case结构、循环结构等。
if_else结构可以将选择概率最大的语句放到if语句之后。因为取指时,紧接着if语句的指令会被取到。这样发生跳转的次数降低,流水线被中断的概率降低。
尽量降低循环嵌套层数和循环次数,这样发生跳转的次数也降低。
2.2.3 避免小段程序代码循环的优化
比如2~3句的小循环,可以适当展开。
一是可以提高循环内指令并行的可能性。
二是可以减少跳转次数。
循环体代码超过10句普通C语言代码,可以不要展开。
3 从指令Cache的角度进行优化
3.1 指令Cache对程序效率的分析
从前面分析可知,若程序取指环节能从指令Cache中读取,而不是每次都从内存中读取,则能显著提高程序执行速度。
3.2 从提高指令Cache命中的角度进行优化
① 尽量使程序顺序执行。
② 避免大量相似的代码重复实现、分散调用。
③ 尽量将相同的代码在一个地方循环执行,提高指令Cache的命中率。不要分散执行,导致多次读取同一段代码到指令Cache中。
3.2.1 多个相似函数的优化
代码举例3:
{
FuncA;//3个相似函数连续调用
FuncB;
FuncC;
}
优化为
for(i=0;i《3;i++) {
Func(i);
}
这样相同的代码一次即可从内存读到Cache中,另外2次指令都是从Cache中读取。
3.2.2 大函数拆分的优化
由于函数体较大,超出了指令Cache的大小,导致第1次循环结束、第2次循环开始时,函数体前面内容已经被调出Cache。同样代码又重新从内存中读取到Cache中,如此反复,实际的结果是函数体Func代码被三次从内存中读取到Cache中,导致效率大大降低。
代码举例4:
for(i=0;i《3;i++) {
Func(i);
}
被优化为:
for(i=0;i《3;i++) {
Func1(i);
}
for(i=0;i《3;i++) {
Func2(i);
}
for(i=0;i《3;i++) {
Func3(i);
}
将函数体Func分成几个单独的子函数:Func1、Func2、Func3,然后分别循环。这样Func1循环时,由于代码量较小,整个函数体都在Cache中。Func2、Func3类似。这样的结果是,函数体Func1、Func2、Func3都只从内存被读一次到Cache中。
4 从数据Cache的角度进行优化
4.1 数据Cache对程序效率的分析
从前面分析可知,在程序取操作数环节,若能从数据Cache中读取操作数,而不是每次都从内存中读取则能提高程序执行速度。
4.2 从提高数据Cache命中的角度进行优化
① 访问数据时,最好是对同一段数据在一个地方集中访问。
② 访问数据时,最好是根据数据的顺序依次访问。比如对数组的访问,最好是按数组成员依次访问,效率较高。
③ 为了使程序能够连续访问数据,需要调整数据结构、重构代码使得数据结构和程序配合,提高数据Cache的命中率。
4.2.1 数组连续访问的优化
代码举例5:
float afBuf[1000];
float xBuf[8][24];
Func {
for(i=0;i《24;i++) {
xBuf[0][i]=afBuf[0+i];
xBuf[1][i]=afBuf[24+i];
……
xBuf[7][i]=afBuf[168+i];
}
}
被优化为:
Func {
for(i=0;i《8;i++) {
m=i*24;
xBuf[i][0]=afBuf[0+m]
xBuf[i][1]=afBuf[1+m];
……
xBuf[i][23]=afBuf[23+m];
}
}
这样优化后,数据每次访问都是连续的。
4.2.2 将不连续数据访问重构为连续访问的优化
代码举例6:
floatafBufA[24];
floatafBufB[24];
floatafBufC[24];
floatxbuf[200];
Func {
xBuf[0]=afBufA[0];
xBuf[1]=afBufB[0];
xBuf[2]=afBufC[0];
……
xBuf[69]=afBufA[23];
xBuf[70]=afBufB[23];
xBuf[71]=afBufC[23];
}
被优化为:
struct {
float fA;
float fB;
float fC;
} aBufABC[24];
floatxbuf[200];
Func {
xBuf[0]=aBufABC[0].fA;
xBuf[1]=aBufABC[0].fB;
xBuf[2]=aBufABC[0].fC;
……
xBuf[69]=aBufABC[23].fA;
xBuf[70]=aBufABC[23].fB;
xBuf[71]=aBufABC[23].fC;
}
5 软件优化实验结果
5.1 优化对比实验
在自动化装置的主要消耗资源的实时扫描任务中进行了代码分析,并按上述可能优化措施进行了优化。优化前实时扫描任务占用资源为系统CPU总资源的52%。代码优化后实时扫描任务占用CPU资源只有系统总资源的31%。
对比可以看出,系统效率提高了40%,效果是非常明显的。
结语
虽然CPU的标称性能指标非常高,但其有专用的体系结构,对一般开发者的编程开发方式而言并不是完全匹配,导致发挥不出CPU的潜力。所以有针对性的根据CPU的体系结构特点进行分析,并采取针对性的优化措施,才能真正发挥其性能,满足嵌入式强实时性要求。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 电气信息工程丛书之Linux PowerPC详解-核心篇 0次下载
- 优化算法、智能算法、智能控制技术的特点和应用
- 超标量处理器的指令乱序提交机制综述 13次下载
- 基于MBNS滑动窗口的多标量乘快速算法 18次下载
- ARM体系的特点与ARM的技术的简介及AMBA总线的分析 9次下载
- 优化算法和智能算法与智能控制技术有哪些特点和应用 8次下载
- 高性能低功耗嵌入式CPU的关键技术 0次下载
- 乱序超标量处理器核的功耗优化 3次下载
- 优化603e超标量微处理器PowerPC指令执行 8次下载
- XScale体系结构及编译优化问题 0次下载
- 空间矢量脉宽调制(SVPWM)技术特点及其优化方法 8次下载
- 基于PowerPC的模拟量输入接口扩展
- PowerPC处理器优势及其应用研究
- PowerPC 和Dallas 的时钟芯片接口设计1
- PowerPC和Dallas的时钟芯片接口设计
- 【电磁兼容技术案例分享】PWM信号线束导致的辐射超标解决案例 564次阅读
- 交换机cpu和交换芯片的关系 810次阅读
- 【电磁兼容技术案例分享】由SGMII通讯导致的辐射发射高频单支超标问题解决案例 612次阅读
- MCU芯片的分类及特点 958次阅读
- 因芯片NC引脚线路导致RE测试超标问题案例 1322次阅读
- 辐射发射测试超标的整改案例 1.1w次阅读
- 基于PowerPC 405微处理器和VME总线实现以太网接口设计 2545次阅读
- 基于嵌入式处理器PowerPC7447的设计方案 1128次阅读
- 基于SOPC技术的嵌入式处理器PowerPC硬核测试实例详解 1465次阅读
- 浅谈通信产品发射超标问题的解决 3097次阅读
- 浅谈ARM处理器的特点和体系结构 1.7w次阅读
- PowerPC没落发展史 4.1w次阅读
- ptn技术特点及体系结构详解 2.1w次阅读
- PowerPC平台Linux的移植(一) 1712次阅读
- 芯片设计中的功耗估计与优化技术 1.5w次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多