变换
平移将x坐标和y坐标加上某一个值就完成了平移操作
x^{\prime} = x + t_x \quad y^{\prime} = y + t_y如果使用矩阵可以表示为:
P = \begin{bmatrix}
x\\y
\end{bmatrix}
\quad
P^{\prime} = \begin{bmatrix}
x^{\prime} \\y^{\prime}
\end{bmatrix}
\quad
T = \begin{bmatrix}
t_x \\ t_y
\end{bmatrix}并且$P^{\prime} = P + T$
三维平移和二维平移类似,只是增加了一项
旋转二维旋转可以看
如果使用向量形式进行表示为$P^{\prime} = R P$,其中R为
R = \begin{bmatrix}
cos\theta & -sin\theta\\
sin\theta & cos\theta
\end{bmatrix}上面是围绕(0, 0)进行旋转的例子,如果旋转位置为($x_r , y_r$),则变换方程为
\begin{aligned}
x^{\prime ...
贝叶斯方法
贝叶斯定理定理: $P(H | X) = \frac{P(X | H) * P(H)}{P(X)}$
其中P(H | X)可以读作x条件下p的概率。
这个公式的意义在于我们可以使用先验概率来求解后验概率。例如:
上面的例子中,买不买电脑是我们想知道的。而给出一个新的样例,我们不知道他买不买电脑,但是我知道它的年龄,收入等其他信息,现在我需要根据这些信息推断它买不买电脑也就是P( buys - computer = "yes" | age ="<=30")(小于30的人买电脑概率有多大)
朴素贝叶斯归纳方法朴素贝叶斯就是各个属性之间相互独立。有一个数据样本集,每个样本是一个n维向量X=(x1, x2, …xn)有m个类:C1, C2, …Cm;每个样本唯一的归属于一个类。
如果现在来了一个未知类别的数据X,想要求得它的分类,也就是P(H | X) H $\in$ {C1, C2, …, $C_m$},可以写为P($C_j$ | X)$
依照贝叶斯定理,可得$P(C_j |X) = P(X|C_j) P(C_j )$,由于P(X)是定值,所以 ...
51单片机结构
端口
在复位状态下,所有的sfr为0,所有的p端口为1
p0端口: 39-52脚。可以作为通用数据io端口或者地址数据复用总线。作为通用io端口时,有8个ttl的负载,在和外部负载连接时需要外接一个上拉电阻。作为地址数据复用总线时,首先输出外部存储器的低八位地址,然后变成数据总线进行数据输入输出。当作为io端口时,控制=0,因此上面的三极管输出始终为0,因此需要一个上拉电阻提供信号,当下面三极管为0时,由上拉电阻提供电压,引脚值为1。当下面三极管为1时,电路直接从上拉电阻到接地,引脚值为0,这被称为漏极开路作为地址数据端口时,控制=1,因此mux连接上面的地址数据io。当地址或数据为1时,上面的三极管输出1,当地址或数据为0时,下面的三极管有效,对外输出为0.
输入时需要先写1: 输入也就是读引脚,如果原来锁存器是0那么下面的三极管不连通,这样会有上拉电阻的干扰导致结果一定是1。因此先需要向锁存器输入1.mov a, #0ffh;mov p0, a; 向端口p0写1,共有8个输入端口ov a, p0;从p0口输入数据到a
读引脚和读锁存器是不同的通道,凡是读-修改-写(读锁存器中的 ...
插值
基础插值问题是给出一些离散的点,通过这些离散的点可以模拟出原曲线。
形式化定义:
设y = f(x) 在区间[a, b]上有定义,且已知在点$a \le x_0 < x_1 … < xn \le b$上的值$y_1 , … , y_n$,若存在一个函数P(x)使得
P(x_i ) = y_i \quad i = 0, 1, 2 ... nP(x)则为f(x)的插值函数,[a, b]为插值区间。
多项式插值
构建多项式P(x) = $a_0 + a_1 x + … + a_n x^n$来模拟f(x)。假设有[a, b]上有n+1个已知点。根据定义有:
\left\{\begin{matrix}
a_0 & + & a_1 x_0 & + & ... & + & a_n x_0^n & = & y_0\\
a_0 & + & a_1 x_1 & + & ... & + & a_n x_1^n & = & y_1\\
\vdots & & \vdots & & & & \vdots & & \\
a_0 & + & a_1 x_n & + & ... & + ...
缓存一致性
介绍现代计算机体系结构中往往使用多级缓存加快访存速度,往往使用多级缓存,其中1,2级缓存为每个核独享,而3级缓存往往是所有核共享。如果不同核同时对同一地址进行写,那么针对同一地址便有了不同的值,这种问题称为缓存一致性问题。
监听协议监听协议的特点为:
实现了一种广播机制来通知更改,通常使用总线
当CPU涉及全局操作时,需要在获取总线控制权之后,才可以进行更改。例如写入内存
所有处理器一直监听总线,并检测总线上的地址是否在本地中存在,如果有,则进行操作
写操作的串行化: 写操作必须在获得总线后才可进行
一个简单的监听协议中每个数据块有三种状态:
无效: 总线中的缓存在本地中不存在
共享: 当前缓存可能在其他处理器中有副本。只要发出读请求,就会进入共享状态,无论其他处理器中是否存在
独占: 当前缓存只在该处理器中存在
当接收到来自处理器的请求时,会发生如下转换:
当读写命中时:
当读写未命中时:
当总线中的请求命中时:
总的来说,当写入一块缓存时,这片缓存将会切换到独占状态,并且清除其他处理器中的缓存。当读取一块缓存时,将从其他处理器和内存中取得,并且将状态修改为共享
...
乱序处理器
基础本文乱序处理器基于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: 用来 ...