|
|
|
|
移动端

1.6.1 参考实现

《ARM嵌入式系统编程与优化》第1章Linux/ARM嵌入式平台,本章介绍如何使用GCC编译器、汇编器和连接器来编写和执行独立的汇编语言程序,以及如何将一个C语言代码和汇编语言代码合起来,以验证汇编代码子程序的正确性。本节为大家介绍参考实现。

作者:梁元宇 译来源:机械工业出版社|2017-09-26 19:05

【新品产上线啦】51CTO播客,随时随地,碎片化学习

1.6 汇编优化1:排序

接下来的两节通过两个例子来粗略介绍一下ARM汇编编程、优化以及性能分析。第一个例子是冒泡排序。

1.6.1 参考实现

先在bubble_sort.c文件中用C语言写一个参考实现。

前三行代码用于在全局存储器中分配32K整型数组。现在程序不会初始化这个数组。

回想一下,冒泡排序比较了每一个相邻对值n - 1次,其中n是元素数量。每次比较后,如果它们是未整理的顺序,则会被交换。每个单独值在最外层每次迭代时朝数组起始处移动一个位置,这可以认为是作为泡沫缓慢上升到液体顶部。

将这个文件保存为bubble_sort.c文件,使用gcc编译,并使用“-O3”标记“告诉”编译器使用最大优化:

使用以下指令了解程序执行所用时间:

在ARM Corte A15中,程序需要4.0s的中央处理器时间来执行。从这一方面,它可能对编译器效率做出粗略的估计。

程序比较需要n2 = 215×215 = 230对值,这意味着处理器的每次比较需要接近4.0/230 = 3.7ps。

当时钟频率为2.3GHz(通常在/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq中找到)时,这将转化为:

每次比较需要2.3e9×3.7e - 9 = 8.5个周期。

其中包括执行比较指令的周期和存储交换(缓存失效)需要的时间。这是合理的吗?

为了找出问题所在,接下来在bubble_sort_asm.s文件中编写一个纯汇编实现。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

.NET for Flash动态网站开发手札

本书深入浅出地说明了如何利用.NET、Flash及XML来辅助Flash富媒体应用程序的开发。 本书首先介绍了Flash影片应用程序与.NET应用程序结合的...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊