平方根倒数算法
平方根倒数算法看到一个非常巧妙的平方根倒数计算算法,特此记录。
我们首先要先了解IEEE754浮点数标准:32位的浮点数,划分为符号位,阶码,尾数。我们将一个小数以二进制的科学记数法表示,如:1.1 * 2^3。阶码即指数部分,尾数即小数点后面的数字(小数点前面一定是1:二进制小数点前面只能是0/1,同时科学计数法又要求该数大于等于1,因此可以省略)。
符号位占1位,0/1表示该数的正/负
阶码占8位,由于需要表示负指数,因此范围为[-127, 128]
尾数占23位
我们将阶码记作E,尾数记作M,由此得到公式:$$(1+\frac{M}{2^{23}})*2^{E-127}$$接下来说回求平方根算法。早期的平方根算法利用了牛顿求解零点的迭代法。其原理是先任取一点x0,然后计算x0该点的切线与x轴的交点,将该交点作为下一次迭代的x0。由此迭代,x0将逼近函数与x轴的真实交点。形式上,迭代公式为:$$x_{n+1}=x_{n}-\frac{f(x_{n})}{f’(x_n)}$$最原始的计算算法需要多次迭代,直至精度满足需求。但是一些聪明的程序 ...
精力充沛的小Tips
精力充沛的小Tips减少精力消耗
Don’t do what you love, but love what you do.
为自己做的事赋予价值
恢复精力
实际措施(Top 3):聊天,听音乐,睡觉
午睡10-20分钟,正常睡觉7-8小时
睡醒后要换一件事情做
工作:强烈的目标感和使命感
vim-2
Vim-2: vim like a pro配置.vimrchttps://github.com/selikapro/vimrc-likapro
下载这个仓库
.vimrc放到home/user下,hotkey放在~/.vim下
安装vim-plughttps://github.com/junegunn/vim-plug
直接curl就行:
12curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
MemSSA
MemSSAMemorySSA将建立一个映射,将指令映射到MemoryAccess
MemoryAccess分为三种:
MemoryDef
MemoryPhi
MemoryUse
memoryDef是修改内存或者引入指令顺序限制的指令。如Store,call,load等等
memoryPhi是针对内存的phi指令。如果同时有多个memoryDef流入一个basicBlock,那么这个BasicBlock头部就会有一个MemoryPhi。实际上LLVM中并没有MemoryPhi的操作,因此它是一种虚拟的IR,我们需要将基本块与其对应,类似的,指令与MemoryDef/MemoryUse对应。
memoryUse是只读取但不会修改内存的指令,如load,call等等
clobber表示一个memoryAccess可能和另一个memoryAccess影响相同的区域
每个函数都有一个特殊的MemoryDef,叫做LiveOnEntry。它支配函数中的每个MemoryAccess,也是唯一一个不对应llvm中具体指令的MemoryDef。
以下面为例:
12345678910111 ...
LoopAnalysis
LoopAnalysisIRLoop,包含以下几个关键概念:
header: 循环的起始节点,同时也是回边指向的节点
entering block: 指向header的基本块,不属于循环内
latch: 循环内指向循环的基本块
exiting block: 存在一条边从exiting block指向循环外
exit block: exiting edge指向的基本块就是exit block, 不属于循环内
IRLoop有以下性质:
一个loop的header是唯一的:也就是说一个loop可以由它的header确定,一个节点最多也只能是一个loop的header
loop之间可以嵌套:如一个大loop中包含一个小loop
两个loop不会交叉:两个loop要么不相交,要么是嵌套关系,永远不会只共享一部分节点。如下图中的两个loop,我们会将其结合视作一个loop
LoopInfo
该部分源码地址:https://llvm.org/doxygen/GenericLoopInfoImpl_8h_source.html#l00573
LoopInfo Pass会识别IR中的循环, ...
悬疑小说
悬疑小说悬疑小说类型:
本格派:发生案件,侦探找凶手
变格派:加入更多的阴森恐怖变态的元素
社会派:从小的案件反应社会问题
新本格派:喜欢加入反转,叙述性诡计等
框架:开头,铺垫,高潮,结尾
悬疑小说会在这个过程中不断的加入并解开悬念点
马原-2
马原-2哲学的基本问题:是思维(意识)和存在(物质)的关系问题
物质和精神哪个是世界的本原(唯物主义,唯心主义)
思维和存在有无同一性,即思维能否正确认识存在
唯物主义分为古典唯物主义(实物),机械唯物主义(例子),辩证唯物主义(一切客观存在)
如辩证唯物主义将人类历史视作物质 -> 唯物史观
旧唯物主义(古典唯物主义,机械唯物主义)在自然观上唯物,却在历史观上唯心,因此又被叫做半截子,不彻底的唯物
唯心主义分为主观唯心主义(精神本源是本我),客观唯心主义(精神本源是独立于人之外的一种精神)
可知论:物质和意识有同一性(唯物,唯心)
不可知论:二元论(眼前的世界是否为真实的世界)
二元论属于不彻底的唯心主义
哲学的重要问题:世界是怎样存在的
辩证法:世界是联系,全面,发展,矛盾的
形而上学:世界是孤立,片面,静止,无矛盾的
马克思在哲学 史上的两大历史贡献:
创立了唯物史观
形成了辩证唯物主义
在马克思之前的黑格尔(辩证唯心主义),费尔巴哈(形而上学唯物主义),马克思将其结合,形成了辩证唯物主义
马原
马原-1知识点马克思主义的构成:马克思主义哲学,马克思主义政治经济学和科学社会主义
恩格斯的《反杜林论》中首次提出该构成
基础和方法是哲学,主体内容是政治经济学,目的和归宿是科社
马克思主义的基本立场:无产阶级的解放,全人类的解放,一切为了人民
马克思主义的基本观点:是关于自然,社会,人类思维发展一般规律的科学认识
科学性是马克思主义的独有特性
马克思主义的基本方法:辩证唯物主义,历史唯物主义,实事求是,辩证分析,社会基本矛盾和主要矛盾分析,历史分析,阶级分析,群众路线
世界上第一个马克思主义政党:共产主义者同盟
世界上第一个无产阶级政党的党纲:《共产党宣言》
马克思主义公开问世的标志:《共产党宣言》发表,1848.2
马克思主义的社会根源/经济社会背景:资本主义生产方式在欧洲已经有了相当的发展
马克思主义的阶级基础/实践基础:无产阶级反抗资产阶级剥削和压迫的斗争
马克思主义的思想渊源:德国古典哲学,英国古典政治经济学,英法空想社会主义
列宁提出:社会主义革命可能在一国或数国首先发生并取得胜利
原因在于资本主义的发展绝对规律表明其一定会导致经济政治发展不平 ...
DomAnalysis
DomAnalysis:计算支配边界原论文:An Efficient Method of Computing Static Single Assignment Form
支配相关的概念就不重复叙述了,这里主要记录一下论文里的算法及其证明。
支配边界初始定义:$$DF(X)={Y|(\exist P \in pred(Y))(X支配P\ and\ X不支配Y)}$$按照该定义计算的话,对每个基本块算法复杂度都是平方级别的,我们希望实现一个线性算法计算一个基本块的DF。
我们把DF(X)拆成两个集合,一个是DF_local(X),这一部分是X自己无法支配的,另一部分是DF_up(Z)(Z被X直接支配,也就是支配树上X的儿子),这一部分是X的儿子无法支配的,传递性可知X无法支配。形式化的定义如下:$$DF_{local}(X)={Y|X\in pred(Y)\ and\ X不支配Y}$$
$$DF_{up}(Z)={Y|Y\in DF(Z)\ and\ X不支配Y}$$
引理1:DF(X)=DF_local(X) + DF_up(Z)
充分性的 ...
ucore1
Ucore-1准备环境Linux环境:VMBox上建一个Ubuntu的虚拟机
qemu硬件环境模拟器:
1sudo apt-get install qemu-system
下载lab代码:
1git clone https://github.com/kiukotsu/ucore
labcodes中包含了各lab的原始代码,labcodes_answer中包含了对应lab的答案。
初次运行ucore在lab1中执行make命令:
生成bootblock,kernel,sign和ucore.img文件
执行make qemu即可运行ucore
BIOSbios,基本输入输出系统,是一个固化在主板上的软件,计算机加电后,会先执行BIOS处的代码,完成最基础硬件的自检和初始化。在这之后,BIOS会选择一个启动设备(例如软盘、硬盘、光盘等),并且读取该设备的第一扇区(即主引导扇区或启动扇区)到内存一个特定的地址0x7c00处,然后CPU控制权会转移到那个地址继续执行。至此进一步的工作交给了ucore的bootloader。
bootloaderbootloader需要完成以下几项工作:
切 ...