CPU扫盲-自创指令集难吗?

自制TD_4指令集的四位的软核单周期cpu 说一下这个项目的意义:可以很好的复习数字电路的基础知识,其次就是加强对计算机组成中cpu的整体理解,最后是用fpga写一个对应的软核cpu,能锻炼Verilog HDL语言的编程能力,比较感兴趣的朋友完全可以尝试打板,用74系列芯片复刻这个cpu,相信跑起来的cpu带来满满成就感,总之这个项目用来入门很不错了。我们以一条指令了解该指令集,这是一条寄存器操作指令可以看到低四位表示立即数Im的值为4,而高四位是寄存器A的地址,对应机器码就是0011 0100,这个指令集一共12条指令属于精简指令集。 阅读详情

  在CPU扫盲-CPU与指令集中阐述了CPU与指令集之间的关系,这篇文章则是针对指令集的专场,指令集顾名思义就是一套指令的集合。CPU扫盲-CPU与指令集中提到创造指令集并不难,难的是如何将指令集推广,那这篇文章我们就从创作者的角度去理解它,我们尝试创造一个只包含几个指令的指令集。当然这篇文章的目的不是摒弃全部现有指令集概念完全闭门造车,而是站在现有指令集概念的肩膀上从创造者的角度去更深入的理解它。

  在CPU的世界里只有0和1,指令就是通过特定顺序、特定数量的0和1的来定义相加、赋值等行为。指令集则是一系列行为的集合,通过他们就可以指挥CPU为各种事物编码。

  目前界内的指令集分为两个派系CISC (Complex Instruction Set Computer / 复杂指令集计算机)和RISC (Reduced Instruction Set Computer / 精简指令集计算机),CISC和RISC 并不是具体的指令集,而是两种不同的指令体系,相当于指令集中的门派,是指令的设计思想。举个例子,就像中医与西医,中医讲究从整体上调理身体,西医则更多的是解决器质性病变。这就是两种不同的医疗思路,类似于 CISC 和 RISC 这两种指令体系。那什么是指令集呢?拿中医举例,像华伦、张仲景这两位医圣,他们虽然都是基于中医的思想治病,但医术各有特色,水平也不尽相同,这就相当于不同的指令集。

  CISC系列指令集的出现远早于RISC,那时候设计指令集就是摸着石头过河,考虑比较局限,当时的程序员还都在使用汇编语言编写代码,总期望着一个指令可以多干一些事情,把工作转移给硬件电路,这样程序员爽歪歪,这样做的结果就是指令越来越复杂,长短不一,参数繁多。CPU硬件电路的制造工艺虽然不断进步但其电路的设计始终被CISC的指令集限制,最终成为CPU性难以能提升、尺寸难以缩小的瓶颈。此时诞生了RISC。其实最开始并没有CISC这个名字,只是后面出现了RISC为了作区分就将RISC之前的指令集统称CISC。CISC中的指令集就是大杂烩,长短不一、使用频率不一、没有规则限定,而RISC相当于对CISC的一次重构,借鉴了 CISC 的经验,取其精华,弃其糟柏。在RISC中采用定长指令,大大提升译码效率;将复杂指令拆分成多个简单指令,减少了硬件电路的复杂性,给予CPU微架构设计更多的发挥空间(苹果的M1);限制每个指令最多一个内存寻址操作数,推崇寄存器到寄存器的操作,保证每个指令都能在单个时钟周期内完成… RISC旨在提高每个指令的执行时间,以此来提升CPU工作流水线整体性能。

  无论是CISC还是RISC都是采用操作码+操作数的设计思路,指令集中的操作数可以是寄存器、立即数、内存地址三种,也对应了CPU寻址的三大类:

  1. 寄存器寻址:寄存器寻址就是操作数是某一个寄存器,CPU执行指令时需要从寄存器中获取或写入”数据“。如:mov ax, bx,将bx寄存器中的值写入ax寄存器。。
  2. 内存寻址:寄存器寻址就是操作数是一个内存地址,CPU执行指令时需要从内存中获取或写入”数据“。内存寻址又分为直接寻址、基址寻址、变址寻址、基址变址寻址。我们这里只用最容易理解直接寻址,就是将直接在操作数中给出的数字作为内存地址,告诉 CPU 取此地址中的”数据“作为操作数。如:mov ax, [0x3000],将0x3000 地址中的”数据“写入ax寄存器。
  3. 立即数寻址:立即数寻址就是操作数是一个常数。只所以叫立即数就是凸显这个”数据“CPU拿来立即可以使用,在执行指令时无需去内存或寄存器中寻址。如:mov ax, 0x18,将数据 0x18写入ax寄存器。

  接下来我们尝试来设计一个指令集,我们这里为了凸显寻址方式的不同多加个一个”寻址方式“字段,我们的指令集规则如下:在这里插入图片描述
11 代表操作数为内存地址,10代表操作数为寄存器,00代表操作数为立即数。如:11 00 10 代表操作数1是内存地址,操作数2是立即数,操作数2是寄存器。
  现在开始设计指令完成一个内存变量和立即数相加后并赋值给内存变量的操作:C=A+B,A是内存变量值8内存地址是0x3000,B是立即数6,C的内存地址是0x3008。可以用寄存器有Ra、Rb、Rc。

  • 指令一:从内存获取数据存入寄存器,假设指令为 load
  • 指令二:将两个操作数相加并存入寄存器,假设指令为 add
  • 指令三:将寄存器中数据写入内存,假设指令为 store
    在这里插入图片描述
      像 load 0x002c Ra 0x3000这就是我这个指令集所对应的汇编语言,但操作码以及寄存器名称都是随便取的,因为汇编语言只是给人看的助记符,CPU并不关心这个,CPU只关心二进制的机器码。上图中寻址方式以及立即数和内存地址使用的是16进制,最终转换成2进制供CPU执行。操作码和寄存器的二进制机器指令对应关系如下:
    ​在这里插入图片描述
      至此我们操作数和操作码都有了,其实指令集己经完成了。不过在一长串的二进制01中,哪些是操作码,哪些是操作数呢?这就是指令格式的由来。我们人为规定个格式,规定操作码和操作数的大小及位置,然后CPU 硬件电路中写死这些规则,让 CPU 在硬件一级上识别这些格式,从而能识别出操作码和操作数。列如:操作码定长2bit、寻址方式定长6bit、操作数是寄存器时占2bit,是内存地址或立即数时占16bit(虽然操作数不定长,但当译码器分析出操作码后就能确定这个指令存在几个参数,分析完寻址方式就能确定每个操作数的长度)。
    按上面的指令格式我们需要执行的指令如下:
    在这里插入图片描述
  1. 步骤一:机器指令是 00 101100 00 0011000000000000,CPU识别出指令的前两位是00就知道是load指令,需要两个参数,然后再往后识别4位为10 11 CPU就能知道操作数1是寄存器寻址,操作数2是内存寻址,只有两个参数所以跳过寻址方式的后两位,整个译码过程都是写死在硬件中的规则,不同的指令有不同的规则。这时CPU已经知道该如何执行这条指令了,首先去0x3000地址获取”数据“,然后将数据存入Ra寄存器。
  2. 步骤二:机器指令是 01 100010 00 0000000000000110 01 ,CPU识别出指令的前两位是01就知道是add指令,需要三个参数,然后再往后识别6位为 10 00 10 CPU就知道三个操作数分别是 寄存器、立即数、寄存器。然后CPU执行指令将立即数6与寄存器Ra中的值相加并存入寄存器Rc。
  3. 步骤三:机器指令是 10 11000 0011000000001000 01 ,CPU识别出指令前两位是10就知道是store指令,需要两个参数,然后再往后识别4位为11 10 CPU就知道操作数1是内存地址寻址,操作数2是寄存器寻址,只有两个参数所以跳过寻址方式的后两位。然后CPU执行指令将Rc中的值写入内存0x3008。
      至此一个非常简易的指令集模型已经创造完毕,相信大家对指令集的理解更深刻了一些。假设上文自创的指令集不仅仅包含着三个指令,它的指令已经很完善了,并且已经可以量产使用此指令集的CPU了,这就代表自研指令集成功了嘛?
      答案是否定的,这仅仅是开始而已,相信大家能发现,因为不管是 操作码+寻址方式+操作数的指令格式,还是load、add、store这些汇编指令都是我随便设计的,也就是说这个CPU只有我懂怎么用,现有的软件在此CPU上都无法运行。因为相同的代码在不同指令集的编译器下,最终呈现的编译结果是不同的,虽然都是由01组成的二进制数字,但是长短和顺序是不同的,这就代表着不同指令集的CPU直接是语言不通,一个计算机换了不同指令集的CPU后原先的软件就不能用了,所以需要有人帮我去写各种编译器和解释器,将高级语言按照我的指令集规则进行编译,我的CPU才能正常工作,显然没人愿意。这些工作往往只能由指令集的厂商进行牵头推动,我显然没这么大的脸。通过这个自研的过程回过头来再看一下CPU扫盲-CPU与指令集中提到的**“创造指令集并不难,难的是如何将指令集推广”**这句话是否很有道理。指令集背后不仅是个计算机生态链,更重要的是全球经济链。
自己动手写CPU(6)简单算术操作指令 本博客先记录简单算术操作指令 简单算术操作指令一共有15条指令分别是:add、addi、addiu、addu、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、multu 阅读详情

相关推荐

CPU入门扫盲篇之一文搞懂多 CPU、多核 CPU、超线程技术、SMP

上,如果某个物理核心在执行指令流时需要等待指令数据,那么该核心就有一段时间处于空闲状态(虽然可能很短暂)。,非对称多处理器,指某些处理器用来运行特殊的程序,比如操作系统,而另外的处理器用来运行非特殊程序,比如用户程序。的时候,需要等待指令需要的数据到达,那么,在这个等待的时间内,才可以切换到指令流。,是指任何程序,不管运行在内核空间,还是用户空间,都可以运行在任意一个处理器上。物理核,物理核之间通过片内总线相连,相比主版上的系统总线,片内总线速度非常快。为了实现超线程技术,一个物理核心内部,会同时包含。

芯想是陈的博客 1万+

十四、中国为什么没有自己的指令集

其一 需要时间积累和大量的资金 重点是现在生态圈(x86高效能市场,arm低功耗市场,mips廉价市场)已经建立 你开发出新的指令集别人又不用 不用就没钱拿 没钱拿就没法继续发展 这是个死循环 其二 生态圈远远大于技术,一旦优势建立后很难推翻,就像mac逼格在高也干不翻window,wp再流畅也是炮灰一样 其三 仔细想想,你做了指令集有多少应用愿意为你优化?你做了指令集有多少人能够认同并使用? 其...

I want to know a little more. 3147

ARM 之十五 扫盲 ARM 架构、指令集、ARM IP、授权方式

  ARM 架构的 MCU 用了好多年,对于 ARM 架构也或多或少的有了一些了解。之前都是遇到啥问题直接去官网找对应的手册,一直没有系统的总结一下。是时候总结一下,好进行下一步学习了! ARM 文档   在了解 ARM 相关的各种概念之前,先来简单说一下 ARM 官方提供的文档的组织结构。其实,国外这些大公司对于文档的组织都是比较规范的,例如,ST 的 参考手册、数据手册、应用手册等等,ARM 文档也基本如此,分为参考手册、用户指南。这么划分的目的就是为了让各部分更加独立。简单来说,参考手册仅介绍原理,用

技术干货 2万+

国产CPU技术突破之后,下一道难关在哪?

好在攻难克艰,生态发展稳步推进。同时,龙芯产品经几年的发展追赶,性能基本将近2019年Intel发布的十代酷睿水平,体现出龙芯产品迭代发展的潜力,未来可期。CPU发明至今50年,出现过众多指令集,唯有x86和ARM分别在商用IT市场和移动市场成为主流,而其他像是SPARC、PowerPC、Alhpa、MIPS等指令集,要么被迫开源,要不终止更新,消失在CPU发展的历史长河。鲲鹏、飞腾则选用ARM架构,一方面在于ARM架构的商业模式,厂商可在授权公版架构基础上进一步研发,从技术角度开发门槛低,成品速度快;

2301_78654669的博客 722

DLPFC.h5ad格式数据简便获取方式+STAGATE论文复现问题

简便获取DLPFC.h5ad格式的数据方式

apple_74057836的博客 2255

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 980

简易CPU设计入门:本系统所写入的指令

简易CPU设计

2401_82825368的博客 947

cesium 实现经纬线绘制和经纬度标注

废话不对数直接上线效果图及代码 1.效果图 2.实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=

一碗老面的博客 2569

CPU扫盲-CPU与指令集

很多非开发的同学指令集名称与CPU名称分不清。这是因为一种 CPU 只能识别一种指令集,所以很多情况下 CPU 都以其支持的指令集名称来称呼,比如当我们要下载软件时通常关注的就是指令集的名称x86、ARM等,但是我们在买电脑时厂商备注的却是酷睿12代、龙芯3C5000、飞腾2000等,所以导致有的同学会把龙芯、飞腾、酷睿与x86、ARM搞混。这里的龙芯、飞腾、酷睿指的是CPU的名称,名字可以有CPU的厂商来取。而x86、ARM则是指令集的名称,基本都是由国外最早的几家处理器厂商创造并命名的

yangxiaofei_java的博客 6791

1、工作流介绍

工作流起源于办公自动化,是对软件中业务流程的抽象。通过工作流将各个任务有序组织起来形成一个完整的业务闭环。比如:请假审批流程,网上购物流程,银行贷款流程;!

leyoliu的博客 5104

YOLO + Qwen3-VL-Seg 深度诊断:双引擎协同完成AI质检

本文提出了一种创新的工业质检双引擎架构,结合YOLO实时检测与Qwen3-VL-Seg精细化诊断,有效解决了传统检测方法中检测与诊断割裂的问题。YOLO部署在边缘端实现高效定位(3.2MB模型,<10ms延迟),Qwen3-VL-Seg在云端完成语义级缺陷分析(仅17M参数的解码器实现像素级分割)。该方案通过6步闭环流程,从实时感知到工艺反哺,显著提升了工业质检的准确性和可解释性,为智能制造提供了从"发现"到"解决"的完整技术路径。

mingo_敏 220

CPU扫盲

CPU扫盲 文章目录CPU扫盲指令集指令集概念指令集架构CPU和指令集的关系CPU如何执行指令以及流水线技术指令系统组成地址空间操作数指令操作和编码CPU如何执行一条指令CPU如何执行多条指令RISC-V指令集架构寄存器RSIC-V32I 寄存器说明RAISC指令比较指令格式比较寻址方式比较公共指令功能RAISC常见指令类型基础整数指令算数运算类指令逻辑运算指令移位运算累指令位操作指令转移指令普通访存指令(数据传输指令)条件分支指令边界检查访存指令内存屏障指令基础浮点指令特权指令伪指令RISCV一些关注的信

yanlei980827的博客 697

ABAP Development Tool for Visual Studio Code 里使用 MCP server

本文讨论了SAP ABAP开发环境中,除GitHub Copilot外,其他可作为MCP客户端接入ABAP开发工具(MCP server)的编码代理(coding agent)。GitHub Copilot是官方确认可用的工具,而其他代理如Claude Code、Cursor、Windsurf Cascade、Cline和Continue虽然理论上支持MCP协议,但要实际用于ABAP开发还需满足两个关键条件:兼容MCP协议,并能处理VS Code虚拟工作区文件系统。这些工具需要单独验证是否支持ABAP开发工

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 252

指令集与微架构 扫盲

作者:王强 链接:https://zhuanlan.zhihu.com/p/19893066 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 随着智能设备的广泛普及,这几年媒体上越来越多的出现关于“架构”“ARM vs x86”“芯片研发”的相关内容。很多消费者和爱好者面对这些以往不太常见的信息时就会迷惑甚至产生误解。其中一组比较容易被混淆的概念就是CPU、架构、...

liyucheng987的博客 1840

【YOLOv8科研级优化】基于YOLOv9的GELAN模块重构C2f架构,显著提升模型精度与推理效率

打开确保模型解析器能识别GELANBlock模块。通过将YOLOv9的GELAN模块集成到YOLOv8的C2f模块中,我们实现了一个“强特征表达+高效计算”的目标检测模型。这个改进不仅在工程上能提升复杂场景下的检测效果,更在科研上提供了“多分支特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的改进中,帮你在论文中打造独特的研究点。

FJN110的博客 110

自然语言处理(扩展学习1):Scheduled Sampling(计划采样)与Teacher forcing(教师强制)

作者:安静到无声作者简介:人工智能和硬件设计博士生、优快云与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。o( ̄▽ ̄)d。

安静到无声 2143

CPU指令集扫盲帖

看到大家都在讨论“龙芯”的前景,但有一些不是很熟悉计算机的朋友可能会听的比较乱,所以特此开帖扫盲,普及一下基础知识。 指令集是什么? 指令集就是指令的集合——有朋友说了,您这不废话吗——哈哈,那指令又是什么?简单的说,就是你吩咐CPU去做什么事情,给它下的命令。比如你有一个老婆,你给她下指令:老婆,倒水!老婆,做饭!老婆,洗碗!这

积土成山 4610

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

CPU基础扫盲:开发人员不得不了解的CPU那些事

CPU是计算机硬件系统的核心部件,也就是整个计算机的大脑。包含运算器+控制器(两个部件里面有寄存器组),通过CPU内部的总线进行通信。控制器(Control Unit,简称CU):计算机的指挥系统,用来控制计算机其它组件的运行。运算器(算数逻辑运算器,Arithmetic/Logic Unit简称ALU):运算功能,用来完成各种二进制编码做算数运算和逻辑运算,包括加减乘、与或非运算。控制器和运算器联系十分紧密,两大部件多数集成在同一芯片,统称为。

秃了也弱了 3795

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

CPU扫盲-CPU如何执行指令以及流水线技术

计算机基本硬件由控制器、储存器、运算器、输入设备、输出设备五大部件组成,其中运算器、控制器、部分储存器被集成在一起统称为中央处理单元。CPU在电路设计上实现了多个独立电路,支持每个步骤独立执行,CPU 可以一边执行指令,一边取指令,一边译码。虽然CPU在同一时刻只能执行一条指令,由于cs:ip的值在取码完成后就会被更新为下一条指令的地址,所以在执行这条指令的同时可以去翻译下一条指令,同时去获取下下条指令。这样的流水线模式大大提升CPU的执行效率。

yangxiaofei_java的博客 1882

深度学习工具包 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")

电脑配置知识_电脑配置知识扫盲——CPU篇(下)

电脑配置知识扫盲CPU篇(下)上次推文,我们已经介绍了CPU的主频、外频、前端总线频率、缓存四个方面的知识,今天给大家讲解一下关于电脑CPU的指令集。在进入今天的主题之前,先用通俗易懂的方式讲一下CPU是如何工作的以及什么是指令集吧(PS:小编也只是比较粗浅的查阅了一些资料了解了一下,如有错误欢迎指正)CPU里面有灰常灰常多的晶体管,每一个晶体管都可以比作一个开关,它只有两种状态:连通与...

weixin_40008884的博客 224

kernel notes: 扫盲

模块: IO 网络 文件系统 0基础!菜抠脚,走起。 扫清概念: 处理器:CPU GPU SoC 架构: 指令集架构、arm内核、SoC、处理器、CPU、GPU等的关系 ARM芯片、内核、架构、指令集的联系与区别 通俗来理解 ARM芯片内核,架构,指令集,软核和硬核之间的关系 arm32/64 Hello BiscuitOS ...

hunter 271

【笔记11】个人扫盲:内存与CPU中的核、线程、物理CPU、逻辑CPU

文章目录CPU与内存CPU内存什么是通道常见问题物理CPU和逻辑CPU常见问题LINUX查看WINDOW查看 CPU与内存 CPU CPU(Central Processing Unit)即中央处理器。CPU从内存(Memory)或缓存(Cache)中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成系统指令的执行。 CPU里包含计算单元(...

occamo的博客 5874

【扫盲】【线程】多核 CPU 与多线程的关系

多核 CPU 的每个核心(Core)是独立的物理计算单元,能真正。让多个线程“交替执行”(单核)或“同时执行”(多核)。,无论 CPU 是单核还是多核,操作系统都可以通过。例如,4 核 CPU 可同时运行 4 个线程。:通过 4 核并行,计算速度显著快于单线程。程序通过创建多个线程(Thread)实现。多核 CPU 与多线程的关系需要从。

qq_43298381的博客 2785

CPU GPU 扫盲帖

CPU与GPU之间有什么不同?为什么需要GPU编程,相比CPU编程,有什么优势?

Rico's Blogs 2608
上一篇: CPU扫盲-CPU与指令集
下一篇: CPU扫盲-CPU如何执行指令以及流水线技术
躺平程序猿
博客等级 码龄8年 4870粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值