本文主要是记录在WSL2 Ubuntu22.04上搭建Flutter Engine编译环境的整个过程。
flutter概述
回望2023
劈里啪啦、劈里啪啦的声音已经远去,过节的气氛也已在忙碌的工作中慢慢消散了。在节日的尾巴来到了首都出差,吃了14块钱但只有两块牛肉的牛肉面。闲暇时刻,写一些去年的总结。
扩展到超级块的摇摆模调度的实现
摘要
本论文详细介绍了摇摆模调度的实现,这是一种软件流水技术,在编译时间和生成代码质量上具有有效性和高效性。软件流水致力于挖掘循环中的指令级并行度,这往往有助于科学和图形应用程序。
模调度是一类尝试重叠单基本块循环的迭代和基于优先级(来自一组启发式)调度指令的算法。摇摆模调度使用的方法被设计用于取得高度优化的调度,保持低寄存器压力,以及在取得两者的同时有个合理的编译时间。
摇摆模调度的一个缺点,(以及所有的模调度算法)是只处理单基本块循环会导致失去更多指令级平行度的优化机会。这篇论文详细介绍了将摇摆模调度算法扩展成以超级块的方式处理多个基本块循环。超级块是一组基本块,其单入口多出口的。将摇摆模调度扩展成能处理这种类型的循环,可以增加摇摆模调度可以应用的循环的数量。此外,它允许模调度应用到热点路径上(也是单入多出的),根据 profile 信息可以离线或者在运行时进行优化。
我们的摇摆模调度实现以及扩展到超级块循环的算法都进行了评估,发现它们是既有效又高效。对于原始算法,测试集被转换了有 10-33% 的性能收益,同时扩展的算法增加了测试集 7-22% 的性能收益。
生产环境中生命周期敏感的模调度
CHESS:嵌入式 DSP 处理器的可变目标代码代码生成
超长指令字架构和ELI-512
摘要
用激进的称为轨迹调度的技术编译普通的科学应用程序,我们为并行机器生成代码,其运行这些程序将会比等价的顺序机器来得快 – 我们期望是 10 到 30 倍快。
轨迹调度为称为超长指令字架构的机器生成代码。在超长指令字机器中,许多静态调度,紧密耦合,和细粒度的操作都是在单指令流里并行执行的。VLIW 是一些当前架构的并行扩展。
这些现存的架构从未突破基本的性能屏障。它们能从并行中获得的加速比从没有超过 2 到 3 倍。并不是说我们不能建造这种更高并行类型的机器;而是在轨迹调度之前,我们不知道如何为为它们生成代码。轨迹调度会在普通代码中发现足够多的并行性,从而可以证明考虑高并行度的 VLIW 是合理的。
在耶鲁,我们正在建造一个这种类型的机器。我们的机器,ELI-512,有超过 500 位的水平指令字,每个周期会执行 10 到 30 条 RISC 级别的操作 [Patterson 82]。ELI 表示极大长字指令;512 表示我们希望达成的指令字大小。(当前的设计已经有 1200 位指令字了。)
一旦清楚了我们可以为 VLIW 编译代码,一些新的问题就会出现,本文会给出这些问题的答案。我们如何在不使得机器太大的情况下,在每个周期里放入足够多的测试?我们如何在不使得机器太慢的情况下,在每个周期里放入足够多的内存依赖?
ASIPs 的指令集定义和指令选择
指令选择的调查
自动存储优化
简介
高级语言的大部分优化技术研究关注于改善生成的程序的执行时间,通常以增加储存为代价。当解决了存储优化之后,通常也会影响到时间类的优化,例如指令减少相关的代码转换。在 Bliss 编译器(WJWHG75) ,这样一个存储优化编译器中,也会执行降低寄存器临时存储的转换,但是没有解决程序变量自动覆盖的问题。
微型计算机和微处理器的日益普及表明,到了全面检验自动存储优化问题的时候了。因为在小型系统的环境下,缺少空间总会是一个问题,小型机器的普及意味着这个问题的重要性日益增加。虽然内存成本的下降会减缓这个趋势,但是墨菲定理的一个变体确保了程序大小的增长总是快于可用内存的增长。换句话说,程序员总是写不合适的程序,因此,随着时间的推移,他们会做得更多。