csapp_cachelab
第五章(优化程序性能) 编译器优化的限制 generally useful optimization code motion:减少计算的频次,把相同的重复计算移动到循环外 reduction in strength:将昂贵的计算换成更便宜的(如乘变加和移位) share common subexpressions:重复使用部分表达式 Opmization on Blocker #1: Procedure Calls 实际上该代码的运行及其低效:每次循环都算一次strlen(s),程序是平方增长的 前面的编译器优化程度开高点都行,但是这个优化不了:因为编译器必须假定函数调用是黑盒,它无法确定该函数的调用会产生什么副作用 可以内联来搞,也不算太good #2:Memory 编译器不能确定有无别名(aliase,即两个变量指向同一片地址),所以只能一遍一遍地从内存中读出来,算完再放回去 aliase实际上在c中很容易发生:可以对指针进行运算操作,同时直接访问存储结构,程序员能做的就是习惯引入局部变量 Exploing Instruct...
csapp_bomblab&attacklab
第三章 书 程序计数器(%rip):将要执行的下一条命令在内存中的地址 (%rsp)栈顶指针 gcc -Og -S m.c生成汇编 objdump -d m.o 汇编代码中的.开头的通常可以忽略 地址只能用64位所以(%eax)是错的 mov后缀表示的是操作的是这么长的数据 imulq:操作数有两个的时候正常截断,仅一个操作数:固定寄存器中的值乘这个,然后在两个地方表示 反汇编后的硬编码寻址 call Q:将该指令紧接的下一条(A)的地址压入栈中,程序计数器设置为Q的起始地址,ret返回从栈中弹出A,并将程序计数器设置为A 调用者保存和被调用者保存(惯例是%rbp,%rbx以及%r12~15为被调用) 当过程 P调用过程Q时,Q必须保存这些寄存器的值,保证它们的值在Q返回到 P时与Q被调用时是一样的。过程Q保存一个寄存器的值不变,要么就是根本不去改变它,要么就是把原始值压人栈中,改变寄存器的值,然后在返回前从栈中弹出旧值。压人寄存器的值会在栈帧中创建标号为“保存的寄存器”的一部分 保存在栈上movq %rdi (%rsp) 好的编程实践typedef int fix_m...
csapp_datalab
计算机系统漫游 pc:一个字(word)的空间,存储某一指令的地址 32bit system:1 word=4 bytes bus:总线 进程 上下文:操作系统跟踪的进程运行所需要的所有信息 虚拟内存(为每个进程提供了巨大的连续地址) 使用ssh运行程序 提高运行速度: 线程级并发(thread-level concurrency) 指令级并行(instruction-level parallelism) 单指令多数据并行(single instruction multi data parallelism) 超线程:一个cpu执行多个线程(cpu中部分硬件是有备份的),常规切换线程很慢,超线程可以决定并很快切换线程 程序结构和执行 第二章 信息的表示和处理(book) 进制转换:十六进制每一位换成四位的二进制,二进制每四位算出十六进制 位运算:取补<=>异或上全1的掩码 x&~0xff:取最低位的字节 区分:c语言的逻辑运算符和位运算(~和!) 左移位就是直接补0,逻辑右移补零,算术右移补最高位(c标准没规定...
cs61b
lecture 1 first java program 1.java程序只能以类、接口、枚举(class,interface,enum)作为程序的起始 2. 3.java variables must be claimed before using and the type will not change ever since,if there exists a type error the compile can't finished 4function 所有函数以public static开头(其实也有别的) 函数必须是类的一部分,所以java中所有函数也叫方法 必须指明所有参数的类型和返回类型 交作业 git add lab1/*git commit -m "done with Collatz"git push origin master#origin:远程仓库别名#master:本地分支名称,新的可能叫main lecture 2 编译 编译并运行java文件 小tips:可以用tab键补全文件名字 编译生成的.class文件已经经过了类型检查...
cs61a
welcome python ok -q python-basics -u --local没有ucb账号本地运行ok的方法 有用的命令行参数 -i :直接进入交互模式,可以方便地查看各变量 python -m doctest:不单独编写测试文件的情况下进行测试(Doctest 模块通过扫描你代码的文档字符串(docstrings),查找看起来像 Python 交互式会话的代码块,并执行这些代码块以验证它们的输出是否与文档中预期的输出相匹配。)还可以添加-v详细看到输出信息 e.g def add(a, b): """ This function adds two numbers. >>> add(2, 3) 5 >>> add(10, -5) 5 """ return a + b Functions 任何编程语言都具有的三种强大的机制: 中缀表示法(infix notation),运算符(例如 +、-、* 或 /)出现在操作...
cs143
introduction interpreter:online takes the program and the data you need,then give the output. compiler:offline it takes the program and give the executable(different type),this executable then takes data and run fortran I(the first compiler) lexical analysis parsing semantic analysis optimization code generation lexical analysis is not trivial,it divides sentence into words(tokens) parsing is diagramming the sentence(it’s a tree) sematic analysis understand the meaning(仅能做到非常有限的,主要检...
18.06SC MIT
18.06SC Unit1 矩阵的LU分解 其实就是分解成上三角乘下三角 由来:正常的矩阵化行阶梯的时候 划出来的是一个上三角 划的过程使用左乘置换矩阵来表示,可以变成下三角 每一步左乘置换矩阵Ei,jE_{i,j}Ei,j都是在原本的矩阵的(i,j)(i,j)(i,j)处产生零 还有一种LDU分解:D为对角阵,U可以化成主对角线均为1的 条件:顺序主子式均不为0 四个基本空间 任何矩阵都定义了四个基本空间 列空间C(A):A矩阵的列向量组成的空间 零空间N(A):方程Ax=0的所有解构成的空间 行空间 C(ATA^TAT):矩阵行向量 左零空间N(ATA^TAT):矩阵转置的方程的解 Unit2 正交向量与正交子空间 正交:空间正交等价于所有向量都正交(正交一定垂直而反过来不一定) 我们将中的三维空间的两个二维子空间推广到n维空间RnR^nRn的一个p维子空间V和一个q维子空间W 则如果P+q>n,则V∩WV \cap WV∩W中有非零向量(V和W不正交) 零空间和行空间正交(并且维数之和=n,这是正交补(...



