RISC-V 手册 v2(一本开源指令集的指南)1 2018 RISC-V 手册 一本开源指令集的指南 DAVID PATTERSON, ANDREW WATERMAN 翻译:勾凌睿、黄成、刘志刚 校阅:包云岗 1 参考卡 2 3 目录 参考卡 ................................................ ........................................................................ 21 第二章 RV32I:RISC-V 基础整数指令集 ......................................................................................23 2.1 导言 ................................................................................... 23 2.2 RV32I 指令格式 ................................................................................................0 码力 | 164 页 | 8.85 MB | 1 年前3
RISC-V 开放架构设计之道 1.0.0Bell),微软公司成员,Digital PDP-11 和 VAX-11 指令集架构的设计者 这本方便的小书轻松地总结了 RISC-V 指令集架构所有的基本要素,是学生和从 业者的完美参考指南。 ——兰迪·卡茨(Randy Katz),加州大学伯克利分校教授,RAID 存储系统的 发明者之一 RISC-V 是学生学习指令集架构和汇编语言编程的不错选择,二者是后续使用高 级语言的基础。本书清晰地介绍了 RISC-V,还包含对其演化历史的深刻见解,以 及与其他常见架构的对比。以过去的指令集架构为鉴,RISC-V 的设计者能规避 一些不必要、不合理的特性,使其易于教学。虽然它很简洁,但它的强大足以在实 际应用中广泛使用。很久以前我教过汇编编程的入门课,如果我现在去教这门课, 我很乐意用本书作为教材。 ——约翰·马沙(John Mashey),MIPS 指令集架构的设计者之一 本书讲述了 RISC-V 能做什么,及其设计者为何赋予 寄存器跳转并链接 I JALR rd,imm(rs1) 与 CA C.AND rd′,rs2′ 同步 同步线程 I FENCE 与立即数 CB C.ANDI rd′,imm 同步指令和数据 I FENCE.I 或 CA C.OR rd′,rs2′ 环境 环境调用 I ECALL 异或 CA C.XOR rd′,rs2′ 环境断点 I EBREAK 传送0 码力 | 223 页 | 15.31 MB | 1 年前3
简明 X86 汇编语言教程 ...........................................................................38 5.4 x86 体系结构上的并行最大化和指令封包..........................................................40 5.5 存储优化........................... ............................46 第七章 X86 汇编指令集汇总...............................................................................................47 一.数据传输指令............................................ ..............................47 二、算术运算指令.........................................................................................................49 三、逻辑运算指令.........................................0 码力 | 63 页 | 598.28 KB | 1 年前3
Cmake 实践) ADD_EXECUTABLE(hello ${SRC_LIST}) PROJECT 指令的语法是: PROJECT(projectname [CXX] [C] [Java]) 你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的, 默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:_BINARY_DIR 以及< 以及 _SOURCE_DIR,这里就是 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE 指令可以直接使用了这两个变量),因为采用的是内部编译,两个变量目前指的都是工程所 在路径/backup/cmake/t1,后面我们会讲到外部编译,两者所指代的内容会有所不同。 同时 cmake 系统也帮助我们预定义了 ,修改工程名称后,需要同时修改这些变量。 SET 指令的语法是: SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可。 比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成: SET(SRC_LIST main.c t1.c t2.c)。 MESSAGE 指令的语法是: MESSAGE([SEND_ERROR 0 码力 | 47 页 | 264.27 KB | 1 年前3
Java 应用与开发 - JSP (Java Server Page)大纲 JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 本节习题 Java 应用与开发 JSP (Java Server Page) 王晓东 wangxiaodong@ouc.edu.cn 中国海洋大学 December 3, 2018 大纲 JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 本节习题 学习目标 1. 理解 JSP 和 提供的各类编程元素的使用方式,包括 JSP 指令、 JSP 动作、JSP 脚本。 3. 掌握 JSP 提供的内置对象与 Servlet 相关对象的对应,学会 各类对象的使用方法。 4. 能够使用 JSP 完成简单的 Java Web 编程。 5. 对 JSP 作为 MVC 设计模式中的视图构建方式有初步的 了解。 大纲 JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 内置对象 本节习题 大纲 JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 本节习题 大纲 JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 本节习题 接下来⋯ JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 本节习题 大纲 JSP 概述 JSP 指令 JSP 动作 JSP 脚本 JSP 内置对象 本节习题0 码力 | 47 页 | 740.36 KB | 1 年前3
2.1.3 如何用Go模拟CPU本人摄于哈佛计算机学院 计算机的演化历史 • 因为改纸带比较麻烦 • 冯诺伊曼架构 • 又称存储程序型计算机 • 可在运行时改变指令 • 指令控制指令和数据 计算机的演化历史 • 因为改纸带比较麻烦 • 冯诺伊曼架构 • 又称存储程序型计算机 • 可在运行时改变指令 • 指令控制指令和数据 • 用啥实现他老人家可没说 本人摄于MIT CSAI Lab 计算机的演化历史 • 冯诺伊曼架构 草稿纸 抽象多且环环嵌套 • 硬件过于复杂 • 软件基于操作系统等复杂概念 • 真的快且便宜 Go模拟CPU • 如何用Go实现冯诺伊曼架构CPU? • 简单:一个循环+一个大数组 读取当前指令 执行指令 下一条指令 模拟目标 – MOS 6502 • 诞生于1975年 • MOS 6502应用范围广 • 资料多且易获得 • 简单、容易实现的现代CPU MOS 6502简介 • 8位,变长ISA(CISC) – 0x1FF 0x1FF – 0xFFF9 0xFFFA Go模拟6502控制单元 • 读取当前指令:16位PC寄存器 • 执行指令 • 指令译码器(读出来的指令是什么) • 指令执行器(按指令执行) • 6502支持NOP指令(啥都不做) Go模拟6502控制单元 • 指令结构(instruction) • 操作码(valid opcode) • 寻址模式 (address mode)0 码力 | 42 页 | 7.10 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming分支预测成败对性能的影响 排序为什么对有分支的版本影响那么大 为什么需要流水线 • 为了高效, CPU 的内部其实是一个流水 线 (pipeline) 。流水线的目的是能把原本 串行的一系列指令并行化。为了理解为什 么需要流水线,我们先反过来,假设没有 流水线,会有什么坏处。 • 例如,右边你今天早上的任务清单。 • 请问你这些任务总共需要多少时间? 任务 时间 占用资源 洗脸 钟嘛!可以,不过这是在你每次只做一件 事的情况下,例如你烧开水时就站在旁边 干瞪眼,什么也不做,其实完全可以在烧 开水的同时洗脸刷牙呀!原始的 CPU 也 是这样, ALU 在运算的时候指令解码单元 就在旁边干瞪眼,要等 ALU 跑完写回寄 存器来指令解码单元才开始继续工作,很 低效。 任务 时间 占用资源 洗脸 5 分钟 眼睛,嘴巴,手 烧开水 10 分钟 煤气灶 刷牙 5 分钟 嘴巴,手 看比站 15 刷牙 烧开水 吃饭 看比站 拉粑粑 5 5 10 20 条件跳转指令 • 让不占用相同资源的任务同时进行,这也是 CPU 流水线的初衷。但理想是美好的,现实 是骨感的,对于程序来说,指令不只是一个 个简单的任务,有时候我们需要做判断,来 决定要执行的具体任务,这就是分支,在汇 编语言中体现为条件跳转指令。 • 例如我们这里给任务清单加一个,如果烧开 水时被烫伤,则直接去医院的特殊任务。0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化免从外部内存读写的超高延迟。 缓存的分级结构 查看高速缓存大小: lscpu • 可以看到我们 x86 电脑的缓存结构分为三级。 • 一级缓存分为数据缓存和指令缓存,其中数据缓存有 32 KB , 6 个物理核心每个都有一个,总共 192 KB 。而指令缓存的大小刚好和数据缓存一样也是 192 KB 。 • 二级缓存有 256 KB , 6 个物理核心每个都有一个, 总共 1.5 MB 。 缓存行预取技术:吃着一碗饭的同时,先喊妈妈烧下一碗饭 • 其实,当程序顺序访问 a[0], a[1] 时, CPU 会智能地预测到你接下来可 能会读取 a[2] ,于是会提前给缓存发送一个读取指令,让他读取 a[2] 、 a[3] 。缓存在后台默默读取数据的同时, CPU 自己在继续处理 a[0] 的数据。这样等 a[0], a[1] 处理完以后,缓存也刚好读取完 a[2] 了,从而 申请起始地址对齐到页边 界的一段内存,真正做到每个块内部不出现跨页现象。 手动预取: _mm_prefetch • 对于不得不随机访问很小一块的情况,还可以通过 _mm_prefetch 指令手动预取一个缓存行。 • 这里第一个参数是要预取的地址(最好对齐到缓存 行),第二个参数 _MM_HINT_T0 代表预取数据 到一级缓存, _MM_HINT_T1 代表只取到二级缓 存, _MM_HINT_T20 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化%rsi), %eax 相当于: eax = &*(rdi + rsi) 妙用本用于指针的指令,尽管此时 rdi 和 rsi 并不是指针 整数加常数乘整数:都可以被优化成 leal 因为这种线性变换在地址索引 中很常见,所以被 x86 做成 了单独一个指令。这里尽管不 是地址,但同样可以利用 lea 指令简化生成的代码大小。 eax = rdi + rsi * 8 指针访问对象:线性访问地址 省流助手: 如果你看到编译器生成的汇编里,有大量 ss 结尾 的指令则说明矢量化失败;如果看到大多数都是 ps 结尾则说明矢量化成功。 xmm0 xmm1 xmm0 addss %xmm1, %xmm0 addps %xmm1, %xmm0 xmm0 xmm1 xmm0 为什么需要 SIMD ?单个指令处理四个数据 • 这种单个指令处理多个数据的技术称为 SIMD ( single-instruction 在一定条件下,编译器能够把一个处理标量 float 的代码,转换成一个利用 SIMD 指令的 ,处理矢量 float 的代码,从而增强你程序的吞吐能力! • 通常认为利用同时处理 4 个 float 的 SIMD 指令可以加速 4 倍。但是如果你的算法不 适合 SIMD ,则可能加速达不到 4 倍;也有因为 SIMD 让访问内存更有规律,节约了指 令解码和指令缓存的压力等原因,出现加速超过 4 倍的情况。 第 1 章:化简0 码力 | 108 页 | 9.47 MB | 1 年前3
MoonBit月兔编程语言 现代编程思想 第十四课 案例:堆栈虚拟机
部分计算:程序优化,根据已知信息,运算进⾏特化 已知源程序与解释器,进⾏部分运算,获得⽬标程序 ⽬标程序 x 输⼊数据 -> 输出数据 2 虚拟机 ⼀处编写,处处运⾏ 定义⼀个不基于任何平台的指令集 在不同平台上实现解释器 两种常⻅的虚拟机 堆栈虚拟机:运算数存储在栈上,数据遵循先进后出原则 寄存器虚拟机:运算数存储在寄存器中 3 寄存器虚拟机 例:Lua VM (The Implementation WebAssembly WebAssembly是什么? ⼀个虚拟指令集 可以在浏览器以及其他运⾏时(Wasmtime WAMR WasmEdge等)中运⾏ MoonBit的第⼀个后端 WebAssembly指令集的⼦集为例 6 简单指令集 数据 只考虑32位有符号整数 ⾮零代表 true ,零代表 false 指令 数据操作: const add minus equal modulo 数据存储: local.get local.set 控制流: if/else call 7 类型定义 数据 1. enum Value { I32(Int) } // 只考虑32位有符号整数 指令 1. enum Instruction { 2. Const(Int) // 常数 3. Add; Sub; Modulo; Equal0 码力 | 31 页 | 594.38 KB | 1 年前3
共 291 条
- 1
- 2
- 3
- 4
- 5
- 6
- 30













