CPU 分支预测探索与利用

TAGE-SC-L预测器 “TAGE-SC-L Branch Predictors”(2016) TAGE-SC-L是将TAGE和简单的辅助预测器统计校正器(statistical corrector简称SC)和循环预测器(loop predictor简称L)相关联,比单个的TAGE更为有效。 存储预算 在32Kbits存储预算下,TAGE预测器使用大部分存储预算,只有非常有限的存储预算可以给辅助预测器。在CBP-4 trace下性能达到3.315MPKI。 在256Kbits存储预算下,可以实现具有TAGE预测器循环预测其LP和相当复杂的统计校正器SC。在CBP-4 trace下性能达到2.36 阅读详情

CPU 的分支预测是个有趣的性能优化点,在写代码层面、编译层面和汇编指令层面我们都可以介入指导分支预测做得更好,本文也将从这些角度来探索 CPU 分支预测,以达到更好的利用。

CPU 流水线

【参考维基百科 - Instruction pipelining:https://en.wikipedia.org/wiki/Instruction_pipelining】

CPU 流水线执行是一种在单处理器上实现多指令并行的技术。

CPU 一般的执行操作包含:获取指令、翻译指令、执行指令、内存访问、寄存器写入等,这些分别用到了 CPU 的不同处理单元。

 

 

如果每个 CPU 时钟周期只执行一个操作,那对于其他 CPU 上的处理单元是一种浪费,所以将各种不冲突的指令放到了同一个时钟周期内,达到更高的 CPU 利用率,提升执行指令的效率。

 

 

将流水线引入 CPU,可以提高 CPU 的效率。更简单的说,让 CPU 可以预先取出下一条指令,可以提供 CPU 的效率。如果存在跳转指令,那么预先取出的指令就无用了。CPU 在执行当前指令时,从内存中取出了当前指令的下一条指令。执行完当前指令后,CPU 发现不是要执行下一条指令,而是执行 offset 偏移处的指令。CPU 只能重新从内存中取出 offset 偏移处的指令。因此,跳转指令会降低流水线的效率,也就是降低 CPU 的效率。

【参考博文: https://blog.youkuaiyun.com/shuimuniao/article/details/8017971】

分支预测

分支预测一般发生在有状态跳转(conditional jump)的指令中。

在 stackoverflow 上对此的回答中,有个人举了一个很贴切的比喻和相关解释

问题:Why is processing a sorted array faster than processing an unsorted array?
回答链接: https://stackoverflow.com/a/11227902/13005964

比喻

 

 

假设你是控制火车轨道的扳道员,火车笨重冗长且与你没有提前协商轨道方向,如果让火车在变轨轨道前停下来,然后和你进行沟通,那会让火车旅程用时变长,且还需要重新启动。

这个时候,更好的方法是你直接猜测火车的运行轨迹,给他设置一个方向:

  • 如果猜对了,火车完全不需要停下来
  • 如果猜错了,火车就需要停下来,让你进行变轨的操作

如果你经常猜对,火车完全不需要停下来;如果你经常猜错,就需要火车花费大量的时间停下来且让你变轨。

指令层面

转换到指令层面:

 

 

由于 if 语句导致了分支跳转的指令存在,这个时候 CPU 同样面对了变轨的难题。

现代 CPU 有复杂的流水线支持,把获取指令、翻译指令、执行指令分摊到流水线上,通常 CPU 就会提前预先获取下一条指令。

这个时候,CPU 提前做出了某个分支的判断:

  • 如果猜对了,可以继续执行
  • 如果猜错了,那就需要刷新流水线并且回退到正确的分支

如果经常猜对,CPU 执行流完全不需要停下来;如果经常猜错,就需要花费 CPU 时间回退并调整。

一般情况下,CPU 预测失败后需要 10~20 个时钟周期来进行回退与调整。

如何更好帮助 CPU 准确地预测?

数据排序

如果 99% 的情况下都是往某个分支去执行,那直接预测为这个分支即可。现代 CPU 基本上能达到 90% 以上的命中率,但面对无法预测的分支而言,就显得鸡肋了。

分支预测的罪魁祸首就是 if 判断了。

if (data[c] >= 128)
    sum += data[c];

如果数据平均分布在 0 到 255 之间,当数据是排好序的,大约有一半的数据是不会进入上面代码的 if 里,另一半会进入。

这种情况对于分支预测是非常友好的,因为它会有大部分时间进入同样的分支里。

profile-guided optimization

PGO 生成插桩代码,运行进程,利用运行时采集生成一个 profile 的运行时信息,指导编译器生成更好的分支代码。

__builtin_expect

可以使用 gcc 的 __builtin_expect(expression, value) 来进行优化,这个函数的作用是允许程序员将最有可能执行的分支告诉编译器。

编译器拿到这个信息(分支转移的信息)之后,在编译过程会将可能性更大的代码紧接在其后,从而减少指令跳转带来的性能损耗。

【参考博文:https://www.jianshu.com/p/2684613a300f】

更好的方式是消除分支的存在

conditional move

【参考 stackoverflow 回答:https://stackoverflow.com/a/30150355/13005964】

cmove 指令不比较源地址和目标地址,它使用上一次比较的结果(存在状态寄存器里的某个标识符),来决定是否进行操作。

cmp eax, ebx
cmove ecx, edx

上面指令表示:如果 eax == ebx,就将 edx 拷贝到 ecx。

效果等同于有分支跳转的下面的指令版本:

cmp eax, ebx
jne skip
  mov ecx, edx
skip:

缺点

但 cmov 的开销会比较大 【参考讨论贴:https://news.ycombinator.com/item?id=6042728】

因为因特尔的 CPU 使用的基础架构只支持在一个时钟周期一条指令最多读取两个输入,但是 cmov 需要读取状态寄存器、源寄存器、目标寄存器的值,所有会有两个时钟周期的延时。

对于难以预测的分支,使用 cmov 是很好的方式。

但对于可以很好预测的分支,使用 cmov 对于性能而言反而是一种倒退。

而现代 CPU 还可能会存在乱序执行的情况,cmov 因为需要取好三个依赖的输入数据,才能执行,所以会导致乱序执行被阻塞。

【维基百科 - 乱序执行:CPU 处理器会根据输入数据的可用性来决定指令执行的顺序,而非程序的原始指令数据的执行顺序。这种方式,主要是为了避免因为获取下一条程序指令而引起的处理器等待,CPU 根据可用性先处理可以立即执行的指令。】

【gcc 早期版本 -O3 使用了 cmov 就导致了代码执行性能变差了,后来 -O3 使用 SSE 来优化循环了:https://stackoverflow.com/a/43941854/13005964】

位运算

if (data[c] >= 128)
    sum += data[c];

将上面的代码可以替换为下面这种形式:

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];

通过位运算成功消除了分支的存在了。

分支预测的实现方式

【参考维基百科 - branch predictor:https://en.wikipedia.org/wiki/Branch_predictor】

分支预测的实现方式非常多,建议直接看上面的链接,下面仅列出其中的一些。

Static branch prediction

在编译期间对分支进行预测,早期 CPU 会更偏好与有状态跳转不会发生,也即 jmp 的下一条指令会被预取,通过编译时的静态分析,把更有可能发生的分支衔接在 jmp 指令的后面。

Dynamic branch prediction

动态分支预测使用在运行时采集到的分支执行信息 (类似 PGO,采用计数器的方式) 来对分支的结果进行预测。

Random branch prediction

等概率地随机乱猜。

Next line prediction

【参考博客:https://docs.boom-core.org/en/latest/sections/branch-prediction/nl-predictor.html】

取指 PC 会在 BTB (Branch Target Buffer) 表中寻找匹配项,如果匹配上了,就会去查询 BIM (Bi-Modal Table,存储着计数器) 和 RAS (Return Address Stack) 来作出判断。

 

 

如果匹配项是 ret,则目标地址来源于 RAS。

如果匹配项是 jmp (无状态跳转),则无需访问 BIM。

如果匹配项是 bidx (branch index),则要标记那条指令是控制流判断的主因。

One-level branch prediction

1-bit 的计数器通常只是记录一下上一次分支跳转的结果。

而采用 2-bit 的计数器可以记录状态机的 4 个状态:

  • Strongly not taken
  • Weakly not taken
  • Weakly taken
  • Strongly taken

 

 

每当一个分支被执行时,就会以图中的形式来更新其状态,准确率高达 93.5%。

Two-level predictor

把上面的 2-bit 计数器的状态记录到分支跳转的历史记录表中来做辅助判断。

通常会保存上两次的结果到寄存器中 (a two-bit shift register)。

 

 

Local branch prediction

每个有状态跳转指令都保存一个属于自己的跳转历史记录表(history buffer)。

Global branch prediction

所有有状态跳转指令共享一个跳转历史记录表。

Alloyed branch prediction

结合了 local 和 global 的方式,还使用了一些 PC 中的 bit。

Loop predictor

基本上一个循环的有状态跳转,如果在循环的最后一条指令,则会重复执行 N-1 次;如果在循环的开头一条指令,则通常只会执行 1 次。

用一个简单的计数器就能很好地做到循环的分支预测。

Indirect branch predictor

不直接跳转指令的目标地址可以指定为两个或以上,通常采用 Two-level predictor 来进行预测。

C++性能优化:利用缓存局部性与分支预测提升代码效率 在计算机体系结构中,缓存和分支预测是影响程序执行效率的两个核心硬件机制。缓存通过存储近期访问的数据,利用时间局部性和空间局部性原理,减少CPU访问主内存的延迟,从而提升数据访问速度。分支预测则通过猜测程序执行路径,避免CPU流水线因条件分支而停顿,维持指令吞吐量。理解并优化这两项技术,对于编写高性能代码具有重要价值,尤其在数据密集型和高频条件判断的应用场景中,如游戏引擎、科学计算和数据库系统。本文聚焦于C++编程实践,通过分析缓存未命中和分支预测失败的具体案例,探讨如何通过优化数据布局和重构条件逻辑,显著提 阅读详情

相关推荐

OneDSE框架:基于Transformer的CPU设计空间探索技术

在计算机体系结构领域,设计空间探索(DSE)是优化处理器性能、功耗和面积(PPA)的关键技术。传统方法依赖周期精确模拟器或元启发式算法,面临速度慢、泛化性差等瓶颈。随着Transformer架构在序列建模中的突破,基于深度学习的预测模型为DSE提供了新思路。OneDSE框架创新性地结合TrACE预测器和MAST优化器,通过指令流token化、局部注意力机制等技术,实现参数空间与指标空间的双向预测。该方案在RISC-V平台上验证显示,预测精度提升5-28倍,探索效率提高11.9倍,特别适用于嵌入式CPU、服务

weixin_33720956的博客 361

TAGE-SC-L predictor

上一篇文章中介绍了TAGE预测器的基本结构以及算法,本文将会介绍TAGE的两种主要的变体,或者说是辅助预测器件,即对应的TAGE预测器变体则可以是TAGE-L/TAGE-SC/TAGE-SC-L;

major的博客 1912

高性能计算——分支处理的成本

这个简单的问题可能会引发我们对现代计算机处理器工作方式的深入思考。在探索CPU如何高效执行指令的过程中,我们不仅会发现答案,还会揭示一系列复杂且引人入胜的概念,包括分支预测、指令级并行性以及编译器优化技巧。在这篇文章中,我们将深入探讨这个问题,并了解为什么在某些情况下,对数据进行预处理(如排序)可以显著提高程序的执行速度。这不仅是关于数据组织的问题,更是关于现代处理器如何利用其架构来优化指令执行的故事。

walt3433的博客 635

基于性能分析引导的优化(Profile Guided Optimization, PGO)

现代程序优化不仅仅依赖编译器的静态优化,还需要结合运行时性能数据,以实现更深层次的优化。基于性能分析引导的优化(Profile Guided Optimization, PGO)是一种先进的优化技术,利用程序的实际运行数据,指导编译器对代码的布局、路径选择和指令生成进行调整,从而显著提升性能。PGO 是一种利用运行时行为数据进行编译优化的技术,特别适用于性能关键型应用。PGO 的核心是通过两阶段编译和分析,利用程序的运行时行为数据优化代码生成。文件,记录运行时的性能数据。

底层软件设计内幕 1726

手把手教你玩转CPU微架构--第五章:分支预测的“读心术”——如何让CPU“猜对”程序的执行路径5.3 工业界突破:Intel的“神经分支预测器”(Neural Branch Predictor)是

​,显著提升了复杂分支场景下的预测精度。其核心创新在于混合预测架构、动态历史适应和别名抑制技术,为现代处理器应对AI与多线程负载提供了关键支持。这一技术也标志着分支预测从“规则驱动”向“数据驱动”的范式转变。Intel的神经分支预测器(Neural Branch Predictor, NBP)是一种基于​。​学习分支行为的复杂模式,从而提升预测准确率。​的动态分支预测技术,其核心思想是通过​。Intel的神经分支预测器通过​。Intel的NBP采用​。

MHD0815的博客 148

Cisco三层交换机的详细配置

** 本文适用于新手小白以及微微基础的同学来用于参考,实验是在Cisco Packet Tracer Student 进行,实验最终效果如图所示,所有命令配置与图中的一致。 使用到的机器型号为:五台电脑,一台服务器,三个普通交换机(2960型号),一个三层交换机(3560-24PS),两台普通服务器(2811) 文章目录一、什么是三层交换机二、配置交换机步骤1.配置二层交换机2.配置三层交换机3.配置两台路由器以及最后一台电脑 一、什么是三层交换机 1.三层交换机 = 三层路由+二层交换机 2.工作在

真正的大师,永远都怀着一颗学徒的心。 4万+

L-TAGE预测器 “A 256 Kbits L-TAGE branch predictor”

在实际中,预测器使用的历史长度集首先通过几何级数来获得,然后再通过细化确定,不过这些改进能获得的精度方面的益处有限。 结构特点 由一个13-component TAGE预测器和一个256-entry 循环预测器(loop predictor)组成。 预测器组件由以下信息索引:PC,全局分支历史ghist(包括无条件分支),16-bit路径历史phist(包括每个分支1地址位)。 对于256Kbits的预测器,13-component达到了最大精度。 循环预测器用于识别具有恒定次数迭代的规则循环。当

qq_40379102的博客 972

两轮差速移动机器人运动分析、建模和控制

两轮差速运动分析及建模运动学分析三种运动状态分析函数模型仿真验证直线验证曲线验证旋转验证运动控制 运动学分析 运动特性为两轮差速驱动,其底部后方两个同构驱动轮的转动为其提供动力,前方的随动轮起支撑作用并不推动其运动,如图1两轮差速驱动示意图所示。 定义其左右驱动轮的中心分别为Wl和Wr,且对应线速度为Vl和Vr,该值可以通过电机驱动接口输出的角转速ωl,ωr2和驱动轮半径r求得,即: Vl=r⋅...

启小新的博客 8万+

CPU 工作原理(附详细图解)

🌸学习目标🌸 本章我们将从软件工程师的角度去了解计算机是如何工作的,通过对计算机核心工作机制的学习,有利于理解我们平时编程时的一些行为,动作的历史渊源。 在学习 CPU(中央处理器)之前,我们先来简单的了解一下计算机的发展历史。 让我们一起出发吧!!!😀😀😀 一. 计算机发展史 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。计算机的发展大体经历了.

Lucky_mzc的博客 5万+

自由曲面与衍射光学元件DOE:从基础理论到工业应用的全景解析

本文全景解析了自由曲面与衍射光学元件的核心理论与工业应用。文章深入探讨了自由曲面在非对称光学设计中的灵活性及其数学描述与制造挑战,并阐述了衍射光学元件通过微纳结构进行波前相位调制的原理与多样化功能。两者与经典光学互补融合,共同构成了高端成像、智能照明、激光加工及AR/VR等前沿领域的底层技术支柱。

devops8pract的博客 391

SimpleITK使用——1. 进行Resample/Resize操作

文章目录1. 变换到一个新的spacing1.1 使用Resample()的方法1.1.1 完整代码1.1.2 转换前后图像1.2 使用ResampleImageFilter()的方法2. 已知原图和变换后目标图像的大小2.1 代码2.2 转换后图像3. 相关内容说明3.0 体素和spacing3.1 Resample() 函数说明3.2 itk::simple::ResampleImageFilter函数说明 1. 变换到一个新的spacing 1.1 使用Resample()的方法 1.1.1

啷个哩个啷 8081

【亲测免费】 探索未来之路:TAGE分支预测器深度解析

探索未来之路:TAGE分支预测器深度解析 项目介绍 在复杂且日益增长的计算机架构领域,每一个微小的性能提升都可能成为决定性的竞争优势。今天,我们要向您隆重介绍一个开源宝藏 —— tage-predictor。这是一项革命性的尝试,它以SystemVerilog语言实现了高效的[TAGE(Temporal Anticipatory Global-Local Encoding)]分支预测算法。在这个C...

gitblog_00071的博客 642

C++编程中的分支预测优化:探索代码效率提升的新路径

分支预测优化是C++编程中提升性能的一个重要手段。通过减少分支数量、提高分支预测准确性以及利用编译器优化等方法,我们可以有效地提升程序的执行效率。然而,需要注意的是,优化并非一蹴而就的过程,它需要我们对程序有深入的理解,并结合实际情况进行权衡和调整。在追求性能的同时,我们也应关注代码的可读性和可维护性,确保优化不会带来不必要的复杂性。

330

PCL 使用RANSAC拟合平面【2026最新版】

RANSAC拟合平面算法原理和实现流程详解以及最大迭代次数和内点期望概率的设置方法。最后再对拟合后的平面法向量与向量(1,1,1)进行定向。博客长期更新,最近一次更新时间为:2026年4月24日。

点云侠的博客 42万+

创建 Qt Quick 项目

来看看如何使用 Qt Creator 创建 Qt Quick 项目!

青春不老,奋斗不止! 1万+

从‘猜测’到‘预测’:CPU设计者如何花式解决分支指令带来的性能瓶颈?

本文深入探讨了CPU设计者如何通过分支预测技术解决流水线中的控制冒险问题。从早期的静态预测到现代处理器的动态预测算法,如TAGE预测器和混合预测架构,文章详细解析了分支预测技术的演进及其对性能的提升。现代预测器准确率可达95%以上,显著优化了处理器性能。

weixin_30268071的博客 246

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1235

java中的四个指令_Java 中的分支预测

原标题:Java 中的分支预测编译:ImportNew/覃佑桦www.baeldung.com/java-branch-prediction1.引言分支预测是计算机科学中一个有趣的概念,它对我们的应用程序性能会产生深刻的影响。然而, 这个概念通常没有得到很好地理解,大多数开发者对此很少关注。本文中,我们将探索分支预测的确切含义,如何对软件产生影响,以及我们可以采取的行动。2.什么是指令流水线?开发...

weixin_39799307的博客 195

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++性能优化实战:缓存局部性与分支预测让代码飞起来

在计算机体系结构中,CPU缓存和指令流水线是决定程序执行效率的底层关键。缓存基于时间局部性和空间局部性原理工作,通过预取数据块(缓存行)减少昂贵的内存访问延迟;而流水线依赖准确的分支预测来维持高效吞吐,预测失败会导致流水线清空,产生显著性能惩罚。理解这些硬件特性对于编写高性能代码至关重要,尤其在数据密集型计算和实时系统中,能带来数量级的性能提升。本文聚焦C++实战,通过优化数据访问模式(如行优先遍历、SoA数据结构)和重构控制流(如消除分支、排序预处理),深入解析如何利用缓存局部性和分支预测机制,解决实际开

chubaisheng8627的博客 413

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

分支预测与流水线优化:提升CPU性能的关键技术

分支预测和流水线技术是现代处理器实现指令级并行(ILP)的核心机制。分支预测通过预判程序执行路径减少流水线停顿,其准确率直接影响CPU的IPC(每周期指令数)指标。动态预测器如两位饱和计数器和TAGE架构,利用运行时历史信息实现超过95%的预测准确率。流水线设计则通过超标量、乱序执行和推测执行等技术提升指令吞吐量,现代处理器如Cortex-A77的IPC可达3.0。这些硬件特性与算法优化相结合,在游戏AI、嵌入式系统等场景中能带来2-3倍的性能提升,特别是在处理条件分支密集和内存访问频繁的代码时效果显著。

weixin_33462927的博客 3

C++性能优化实战:从缓存局部性与分支预测原理到代码优化

在计算机体系结构中,CPU缓存和分支预测是决定程序执行效率的核心硬件机制。缓存通过存储近期访问的数据,利用时间局部性和空间局部性原理,大幅减少访问主存的延迟。分支预测则通过历史记录猜测程序执行路径,维持指令流水线的高效运转。理解这些底层原理对于编写高性能代码至关重要,尤其在C++等系统级编程中,能直接转化为显著的性能提升。本文聚焦于缓存局部性和分支预测这两个关键概念,通过具体代码示例,展示如何优化数据布局(如行优先遍历、SoA结构)和规整分支逻辑(如排序预处理、循环外提),从而减少缓存未命中和分支预测失败,

weixin_34216107的博客 344

动态分支预测(Dynamic Branch Prediction)如何通过历史行为分析提升流水线效率?

本文深入探讨了动态分支预测(Dynamic Branch Prediction)技术如何通过历史行为分析显著提升流水线效率。文章详细解析了分支历史表(BHT)、分支目标缓冲区(BTB)等核心机制,以及两级自适应预测和混合预测等先进策略,展示了现代处理器如何实现90%以上的预测准确率,有效解决控制冲突问题。

mango的博客 211

C++分支预测优化指南:从原理到实测,消除CPU流水线空转

现代CPU通过指令流水线并行执行,遇到条件跳转时依赖分支预测器猜测方向。一旦猜错,流水线冲刷,损失十几个时钟周期。这种分支误预测是C++性能优化中容易被忽视的隐藏成本,尤其当输入数据分布随机时,同样的逻辑耗时可能相差数倍。利用perf工具的branch-misses硬件计数器,可以精准定位分支惩罚。工程实践中,基于概率重排高频分支、用查表法替代复杂if/else链、用数学运算消除分支,或重新组织数据让分支特征集中,都能有效提升程序性能。在排序处理、字符解析、音频算法等场景中已有显著效果。通过实测数据展示有序

weixin_31421613的博客 173

CPU性能优化终极指南:likely与unlikely宏的实际性能差异测试

🚀 想要提升程序性能?想知道编译器优化的秘密武器?本文将带你亲手测试CPU likely与unlikely宏的性能差异,揭秘分支预测对程序运行效率的关键影响! 在软件开发中,CPU分支预测是影响程序性能的重要因素之一。Coder-Kung-Fu项目中的[tests/cpu/test01](https://link.gitcode.com/i/4669fe0a59c0b4c908568f3095

gitblog_01429的博客 830

1BRC硬件优化:CPU特性与硬件加速利用

10亿行数据挑战(1BRC)要求处理包含10亿行温度测量数据的文本文件,每行格式为`;`。传统Java I/O和字符串处理方式在此规模下性能表现不佳,主要瓶颈包括: - **I/O瓶颈**:传统文件读取方式无法充分利用现代存储设备带宽 - **字符串解析开销**:ASCII到数字转换、字符串比较等操作消耗大量CPU周期 - **内存访问模式**:随机内存访问导致缓存命中率...

gitblog_01069的博客 342
上一篇: 【译】优化 clang 编译器的 mapping 函数
下一篇: C++ 是如何处理函数符号查找?
流左沙
博客等级 码龄11年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值