乱序处理器
基础本文乱序处理器基于tomasulo算法。指令集为mips,参考书籍为《超标量处理器设计》
乱序处理器处理的主要是tomasulo算法中提到的相关,大致可以分为重命名,发射,执行,写回,退休五个阶段。除了这五个阶段外,前端还有取指和译码两个大的阶段。
译码译码主要解析出这条指令的rs, rt, rd, src1, src2和aluop。rs和rt是两个源操作数,rd为目的操作数, src1和src2是两个操作数的值,aluop是代表这条指令进行的操作。
需要特别注意的一点是mult和div的处理。因为mult和div是存在hilo寄存器中的,并且它写回时需要写回两个操作数,因此可以将它划分成两条指令。两条指令的rd分别为hi和lo。
重命名基于rob的重命名首先我们有一个rat(寄存器重命名表),他表示虚拟寄存器(r0-r31)和物理寄存器(真实的物理寄存器堆和rob)的映射关系。
寄存器重命名的过程为:
根据解析出来的rs和rt编号查rat表,与此同时查物理寄存器堆
如果当前值位于物理寄存器中,则直接取出,并且将当前src置为从寄存器中取出来的值,输出的寄存器编号置为0。否则重 ...
PDede: Partitioned, Deduplicated, Delta Branch Target Buffer
摘要: 本篇文章设计了一个新的BTB组织形式,将地址划分为Region,Page,Offset三部分,然后三部分使用不同的表进行存储,从而减小分支目标重复存储的几率。最终ipc提升14.4%,BTB缺失的概率减少54.7%(这性能…)
现象
BTB中存在一些重复的目标,浪费了空间
跳转的分支占所有分支的超过一半,甚至有些超过三分之二
Region,Page,Offset三部分有不同的空间和时间局部性,并且有许多分支目标使用同样的Region和Page
超过60%的target在同一个Page内方法如图为该论文设计的结构,大致分为BTBM,Region BTB, Page BTB三部分
当搜索分支目标时,将首先搜索BTBM,然后使用Page-BTB Pointer和Region-BTB Pointer来搜索其他两个BTB,最后将Region, Page, Offset三部分拼接得到最终结果。
根据前面的发现60%的分支目标在同一个page内,因此BTBM中有一个Delta-Bit位,如果Delta-Bit为1,则分支目标在同一个Page内,直接使用Offset和当前PC拼接便可得到分支 ...
向量处理器和gpu
向量处理器传统的处理器每一条指令只能针对一个数据执行加减乘除等操作,而向量指令可以在一条指令中实现对多个数据进行操作。
RV64V的主要构成为:
向量寄存器:供32项,每一项包含32个64位元素。向量寄存器至少有16个读端口和8个写端口。为了实现大带宽,通常做法为使用多个存储体来组成寄存器堆
向量功能单元: 包括加减乘除,逻辑运算,浮点运算等单元,所有单元都是完全流水化的
向量存储/载入单元: 可以复用标量存储单元,然后每个周期取1-2个数据
例如给出下面一段代码,并使用向量指令实现
for(int i=0; i<32; i++) y[i] = a * x[i] + y[i];
使用RV64V实现为vsetdcfg 4*FP64 # 启用4个双精度浮点向量寄存器fld f0.a # 载入标量avld v0.x5 # 载入向量Xvmul v1.v0.f0 # 向量-标量乘vld v2.x6 # 载入向量Yvadd v3.v1.v2 # 向量-向量加vst v3.x6 ...
A Scalable Front-End Architecture for Fast Instruction Delivery
简介一个非常经典且现在都在使用的流水线前端架构。它的特点是将分支预测放在流水线的最前端,和取指进行了结构。将ICache移出了关键路径。
结构
部件介绍:
FTQ: 用来缓存分支预测器提供的预测地址,分支预测器会不停的预测并提交地址给FTQ,然后Icache从FTQ中获得取指地址并进行取指
FTB(fetch target buffer): 包括分支预测器,btb等
FTBFTB是该设计的核心部件,他可以保存分支跳转指令的跳转地址,并对条件分支进行预测。它的结构如下图所示。
它的主体是一个表,使用pc进行查表,查表方式和cache类似。每个表项表示一个fetch blcok,每个fetch block的起始地址为分支跳转到目的地址,中止地址(fall through)为经常发生跳转(biased taken or unbiased)的分支。查表时是通过起始地址进行查表的。
FTB每次生成下一个fetch block的起始地址和中止地址,以及用于下次预测的pc。
每个表项包含如下内容:
tag: 地址的高位,参照cache的tag项
carry, partial fall thr ...
sparql和cpyher
sparql原文链接
SELECT [DISTINCT] <variable1> [<variable2> ...][FROM ...]WHERE{ triple pattern 1. [triple pattern 2.] ... [附加条件...]}[OFFSET 数字][LIMIT 数字][ORDER BY | GROUP BY ...]例如SELECT ?xWHERE { dbr:James_Cameron dbo:directs ?x . }
符号:
variable: 变量,使用?变量名来表示变量,例如?x1
: 注释
*和+: 正则表达式,*表示0次或多次,+表示一次或多次
^: 用来反转主语和宾语之间的关系,例如s p o和o ^p s等价
/: 表示拼接谓语。例如?s c:cites/c:cites/c:cites :paperA表示s经过引用距离为3的所有论文
关键字:
WHERE: 用来表示查询条件,它由主谓宾三部分组成,其中主语和宾语可以为变量
FROM: 用来 ...
Branch Runahead: An Alternative to Branch Prediction for Impossible to Predict Branches
介绍论文原文
tage-sc-l分支预测器在大多数问题上都有很高的准确率,但是对于数据依赖型的分支却无能为力。例如判断一个数组中的某个数据是否为0,它依赖于数组的值,现有分支预测器都是基于过去分支的历史进行的,二者没有相关性,因此无法预测。
本文提出了一种提前执行分支指令的方法,通过一个小的处理器提前计算出分支结果,来处理分支预测器无法预测数据依赖型分支的问题
依赖链的计算守护分支和影响分支想要提前计算出分支指令,首先需要知道哪些指令和这个分支指令相关。这里首先需要给出两个定义
守护分支(Guard branch): 守护分支会决定另外的分支是否执行。例如两层的if,如果外层的if不执行,那么内层的if也不会执行,这时外层的if就是守护分支
影响分支(affector branch): 影响分支是可以影响其他分支源数据的分支。
要获得守护分支和影响分支首先需要知道分支正确路径和错误路径的合并点。由于现代乱序多发射的结构导致一次预测错误会多取上百条错误指令,因此可以使用正确路径的指令和错误路径的指令来找到两条路径的合并点。
守护分支的确定很简单,任何出现在合并点之前的分支都可以认为是 ...
gpu存储架构
本篇是《通用图形处理器设计-GPGPU编程模型与架构原理》的阅读笔记
gpu处理器架构
gpu存储结构简介
gpu存储和cpu截然不同,呈现倒三角的结构。gpu使用如此多的寄存器文件主要是为了线程束的零开销切换。因为每个线程束都有它自己的寄存器,因此每次切换线程束时就不需要像cpu线程切换时那样将寄存器存入内存再读取了。
大容量寄存器带来的一个负面影响是L1和L2缓存的容量被大量挤压,在Pascal架构中超过60%的片上存储容量被分配给了寄存器。在NVIDIA V100架构中每个核最多128kb的l1数据缓存容量,而每个核中最多有2048个线程,也就是说每个线程只能分配到64b的空间。而l2缓存的容量有6mb,远小于l1数据缓存共10mb的容量。
寄存器gpu处理器的高并行导致每个核需要大量的寄存器端口。例如如果同时执行32个线程,每次需要读取3个操作数,那么要求寄存器文件每周期需要提供96个32bit的读端口和32个写端口。而寄存器在存储中占了绝大部分比重,大量的资源消耗导致寄存器无法使用激进的多端口设计。gpu中往往使用多bank的单端口来模拟多端口的设计。
如图所示为多板块寄存 ...
gpu核心结构
本篇是《通用图形处理器设计-GPGPU编程模型与架构原理》的阅读笔记
基础gpu基础结构可以参照
在上面已经提到线程块调度器会将线程块发送给对应的处理器,而处理器将执行线程块中所有线程。但是线程网格和线程块都是用户指定的,而硬件资源是有限的,例如寄存器端口,执行单元数量等。如果线程块的数量过大,那么执行一条指令就需要很多周期的时间,而且不好调度。因此处理器中真正的调度单位是线程束,线程束的大小是根据硬件资源决定的,线程块传递给处理器时会自动将线程块划分成若干线程束。
线程束中所有线程的pc相同,即执行的指令相同,不同的是他们有不同的线程id,读寄存器时会根据线程id和寄存器id来获得寄存器值。如果将它看成向量处理器,那么线程束就是单个指令流,每个线程只是一个分量。
每一个处理器中都会同时存在大量线程束,通过快速切换线程束执行来隐藏访存等耗时操作的延迟。
GPU指令流水线
gpu流水线和cpu类似,分为取指,译码,调度,读寄存器,执行,写回等阶段。
取指和译码在gpu中由于同时存在多个线程束且每个线程束的执行进度不一致,因此取指单元中需要保存多个pc值,然后调度单元根据线程束的状态选 ...
tage分支预测器
介绍tage分支预测器论文
tage-sc-l分支预测器
tage分支预测器是现代高性能处理器中常用的预测器,他使用pc和全局历史作为输入,通过哈希得到index和tag进行查表,并且谨慎的只更新少数表来减少表项的占用。在一些测试集中可以达到95%以上的准确率且低于5MKPI
预测tage分支预测器由一个base表和多个tage表组成。
base表是一个类gshare预测器,使用pc的哈希作为index。
tage表由三个部分组成,tag,u和ctr。其中ctr为饱和计数器。使用pc和不同长度的全局历史查表
tage表的查表方式为将pc和n位的全局历史使用不同的哈希函数分别获得index和tag,然后使用index获得表中的某一项表项,再使用tag进行匹配表项中的tag,如果匹配成功则使用表项中的饱和计数器作为最终结果。
如果有多个表成功匹配,则将最长历史的表的结果作为最终结果,如果全部没有匹配,则使用基础预测器作为最终结果
在实现时,如果历史长度较短,则可以直接将历史异或,进行折叠来获得index和tag。如果历史长度较长,则可以选择历史中的某几位和上一步计算结果进行逻辑操作来生成 ...
简截
简介简截是一款截图软件。它的主要功能是图片透明化。
透明化前
透明化后
此外他还支持多种截图模式并且可以图片上编辑
下载及代码
所有版本
最新版本(密码8nq4)
文档
github地址页
欢迎拿走源码自己修改。也可以在评论区提意见(我设置了邮箱提醒)。
功能介绍
支持开机自启,自动更新,历史记录保存,自动复制到剪切板等功能
多区域截图
滚动截图
使用opencv库的图像拼接实现,并且加上了多线程,位置在Capture_window/…/Scroll_handle。
此外滚动截图可以调整滚动速度。滚动速度较快时可以利用所有cpu。

绘制 当前仅支持笔,荧光笔和文本绘制,并且支持撤销、恢复和擦除。
透明
目前仅可以做到对某一个色素透明,对于渐变和拍屏无效。并且由于文字都是由不同种类像素组成因此无法做到选取文字(正好下学期有图像处理,看看通过反锯齿可以直接把文字的范围弄出来)。
oc ...