0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GD32H7如何利用超标量流水线

麦辣鸡腿堡 来源:轩哥谈芯 作者:义轩 2023-11-29 17:15 次阅读

我们拿一个算法的代码实现来举例子,首先我们写一个求阶乘的子函数,这里我偷懒让 ChatGPT 帮忙生成了一个:

#include
// 阶乘函数intfactorial_iterative(int n) { int result = 1; // 从1乘到n for (int i = 1; i <= n; ++i) { result *= i; } return result;}
// 示例int main() { int result_iterative = factorial_iterative(5); printf("5的阶乘是: %dn", result_iterative);
return 0;}

这种简单的迭代算法的优点是比较容易理解,一眼就可以看出程序员想干什么。

但这样写出来的程序缺点也很大,就是运行效率非常低,我们在算法编写中最怕的就是for 循环,因为这里面会存在大量的比较和跳转,同时最容易产生一些代码被无效的循环执行。

图片

这些缺点有的会被编译器的优化措施给规避掉,比如编译器可以把一些需要内存访问的变量先放到寄存器中,等计算完结果后,再把结果从寄存器中转移到内存中,因为 CPU 读取寄存器比读取内存可快多了。

但是编译器也不是万能的,有些优化他就做不到。比如,我们改成下面展开的样子,超标量的流水线就开始起作用了。

// 阶乘函数intfactorial_iterative(int n) {    int result0 = 1, result1 = 1, result2 = 1,result3 = 1;    // 从1乘到n    for (int i = 1; i < n; i += 4) {
result0 *= i; result1 *= i + 1; result2 *= i + 2; result3 *= i + 3;
} return (result0 * result1 * result2 * result3);}


首先,我们假设开启了编译器优化,编译器已经把所有内存访问的变量在函数开始都归置到了寄存器中,那么这时候我们可以看到,4 个 result 的乘法语句是相互独立的,他们的计算过程不依赖于其他 3 个语句的计算结果。

这就好比安排了四个人,给他们算 4 个单独的式子,假设他们计算能力相同,于是他们会在同一段时间后跑到黑板上来互相乘一下算个总的结果。

而如果我们只是简单的做循环展开,不增加新的寄存器变量,也就是不加人的情况下是怎么样的呢?

// 阶乘函数intfactorial_iterative(int n) {    int result = 1;    // 从1乘到n    for (int i = 1; i < n; i += 4) {
result *= i; result *= i + 1; result *= i + 2; result *= i + 3;
} return (result * result * result * result);}


这里只放了一个聪明的孩子做算式,不过你看他要做的 4 个算式,其中后一个算式总要用到前一个算式的结果,他即便再聪明也得一个一个的算。

这就是超标量流水线的用处,当然展开多少还需要我们自己衡量,本质上也是用空间换时间,另外寄存器可是稀缺资源。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19404

    浏览量

    230758
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17313

    浏览量

    352218
  • 代码
    +关注

    关注

    30

    文章

    4821

    浏览量

    68893
  • 编译器
    +关注

    关注

    1

    文章

    1642

    浏览量

    49238
收藏 人收藏

    评论

    相关推荐

    什么是超标量处理器的流水线超标量处理器的特点有哪些?

    如果每周期可取出多条指令(eg: 超过一条)送到流水线中执行,并使用硬件来对指令进行调度(eg: 靠硬件自身来决定哪些指令可以并行执行)的处理器,就可称为超标量处理器;
    的头像 发表于 03-04 14:03 3243次阅读

    FPGA中的流水线设计

    8bit 流水线加法器的小例子 module add8(a, b, c);input[7:0] a;input[7:0] b;output [8:0] c; assign c[8:0
    发表于 10-26 14:38

    现代RISC中的流水线技术

    取得了成功。流水线技术是当前指令集处理器设计中广泛采用的技术。在这里我们将重点放在(标量流水线处理器的设计。流水线处理器设计中的许多方法和技术,例如用于检测和化解相关的
    发表于 03-01 17:52

    什么是流水线技术

    什么是流水线技术 流水线技术
    发表于 02-04 10:21 3943次阅读

    什么是超标量技术/FADD?

    什么是超标量技术/FADD? 超标量(superscalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,
    发表于 02-04 10:45 1606次阅读

    流水线中的相关培训教程[4]

    流水线中的相关培训教程[4] 下面讨论如何利用编译器技术来减少这种必须的暂停,然后论述如何在流水线中实现数据相关检测和定向。
    发表于 04-13 16:09 4819次阅读

    电镀流水线的PLC控制

    电镀流水线的PLC控制电镀流水线的PLC控制电镀流水线的PLC控制
    发表于 02-17 17:13 36次下载

    FPGA之流水线练习(3):设计思路

    流水线的平面设计应当保证零件的运输路线最短,生产工人操作方便,辅助服务部门工作便利,最有效地利用生产面积,并考虑流水线安装之间的相互衔接。为满足这些要求,在流水线平面布置时应考虑
    的头像 发表于 11-28 07:07 2400次阅读

    各种流水线特点及常见流水线设计方式

    按照流水线的输送方式大体可以分为:皮带流水装配线、板链线、倍速链、插件线、网带线、悬挂线及滚筒流水线这七类流水线
    的头像 发表于 07-05 11:12 7447次阅读
    各种<b class='flag-5'>流水线</b>特点及常见<b class='flag-5'>流水线</b>设计方式

    如何选择合适的LED生产流水线输送方式

    LED生产流水线输送形式分为平面直线传输流水线、各种角度平面转弯传输流水线、斜面上传流水线、斜面下传流水线这四种输送方式,企业也是可以根据L
    发表于 08-06 11:53 1053次阅读

    嵌入式_流水线

    流水线一、定义流水线是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的,他们可同时为多条指令的不同部分进行工作。• 把一个重复的过程分解为若干个子过程
    发表于 10-20 20:51 6次下载
    嵌入式_<b class='flag-5'>流水线</b>

    什么是流水线 Jenkins的流水线详解

    jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkin
    发表于 05-17 16:57 1109次阅读

    首款Cortex-M7内核超高性能MCU性能揭秘

    GD32H7系列MCU采用基于Armv7E-M架构的600MHz Arm Cortex-M7高性能内核,凭借支持分支预测的6级超标量流水线架构,以及支持高带宽的AXI和AHB总线接口,
    发表于 05-25 11:36 1178次阅读
    首款Cortex-M<b class='flag-5'>7</b>内核超高性能MCU性能揭秘

    H7的特点 什么是超标量流水线

    流水线,并且是超标量的,并且支持分支预测。 内置了高级DSP硬件加速器和双精度浮点单元(FPU),以及硬件三角函数加速器(TMU)和滤波算法加速器(FAC)。 内置了TFT LCD液晶驱动器和图形处理
    的头像 发表于 11-29 16:52 885次阅读
    <b class='flag-5'>H7</b>的特点 什么是<b class='flag-5'>超标量流水线</b>

    GD32H7系列MCU安全启动概述

    电子发烧友网站提供《GD32H7系列MCU安全启动概述.pdf》资料免费下载
    发表于 01-17 15:34 0次下载
    <b class='flag-5'>GD32H7</b>系列MCU安全启动概述