- 博客(35)
- 收藏
- 关注
翻译 FlashAttention 01 - Fast and Memory-Efficient Exact Attentionwith IO-Awareness
Transformers在输入长序列时,因为self-attention的时间和空间复杂度是序列长度的平台,运行缓慢且内存消耗大。近似attention方法通过牺牲模型性能,减少计算复杂度解决这个问题,但是经常不能获得墙上时钟级的提速。我们认为这里缺失了一个原则是让attention算法IO-aware,即将不同层级的GPU内存的读写纳入考量。我们提出了FlashAttention,一个IO-aware的精确attention算法,使用tiling来减少GPU和HBM和SRAM间的内存读写次数。
2024-08-26 16:00:40
166
翻译 vLLM 01 - Efficient Memory Management for Large Language Model Serving with PagedAttention
作者:Woosuk Kwon1,∗ Zhuohan Li1,∗ Siyuan Zhuang1 Ying Sheng1,2 Lianmin Zheng1 Cody Hao Yu3 Joseph E. Gonzalez1 Hao Zhang4 Ion Stoica1。
2024-08-19 11:00:46
491
翻译 Sora - Open-Sora技术报告1.1
https://github.com/hpcaitech/Open-Sora/blob/v1.2.0/docs/report_02.md
2024-08-13 19:49:12
209
翻译 Sora - Open-Sora技术报告1.0
OpenAI's Sora能够生成1分钟的高质量视频,但是并没有对外批露任何实现细节。为了让AI更"open",我们致力于构建一个开源版本的Sora。这个报告描述了我们训练一个基于Transformer的视频扩散模型的初次尝试。
2024-08-12 12:01:40
83
原创 llvm libLLVMCore源码分析 25 - GVMaterializer Class
源码路径llvm\include\llvm\IR\GVMaterializer.hllvm\include\llvm\IR\AutoUpgrade.hllvm\Bitcode\BitcodeReader.hllvm\lib\Bitcode\Reader\BitcodeReader.cppllvm GVMaterializer Classllvm中使用GVMaterializer类作为加载Module的类的抽象接口,比如llvm的BitcodeReader就是该类的实体类:cla
2022-03-28 11:45:51
569
原创 llvm libLLVMCore源码分析 24 - Comdat Class
源码路径llvm\include\llvm\IR\Comdat.hCOMDAT在很多ABI中,定义了COMDAT段,这种类型的段在链接时会根据段名进行合并。链接器如何合并这些段,通过一个标志指示。llvm支持的标志的可选类型如下:enum SelectionKind { Any, ///< 链接器可以选择任意一个COMDAT ExactMatch, ///< 所有COMDAT的内容必须完全相同,否则会上报链接错误。 Larges
2022-03-28 09:55:02
634
原创 llvm libLLVMCore源码分析 23 - DINode
源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hDINode表示DWARF标签信息(DW_TAG_*),DINode继承树如下:GenericDINode泛化的类DWARF元数据类型,第一个Operand是一个MDString,其余的Operand是对其他Metadata的指针。IR示例如下:!0 = !{}!1 = !GenericDINode(tag: 3, he
2022-03-25 11:26:52
1583
原创 llvm libLLVMCore源码分析 22 - DebugInfoMetadata
源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hDebugInfoMetadataDebugInfoMetadata是特殊的元数据类型,用于调试:除了MDTuple,其余都是DebugInfoMetadata。DILocationDILocation表示源代码中的位置。用第1个Operand表示范围,类型为DILocalScope;用第2个Operand表示函数Inline.
2022-03-25 11:01:42
798
原创 llvm libLLVMCore源码分析 21 - Metadata Class
源码路径llvm\include\llvm\IR\Metadata.hllvm\include\llvm\IR\DebugInfoMetadata.hllvm Metadata classllvm IR中允许使用元数据附在指令和全局对象上,为优化器和代码生成器提供一些额外的信息(比如调试信息)。在llvm中,使用Metadata类表示元数据。Metadata类的继承树如下:为了高效的管理Metadata对象,Metadata在llvm中的存储分为3种类型:Uniqued:元数据内
2022-03-18 17:15:19
1006
原创 llvm libLLVMCore源码分析 20 - Function Class
源码路径llvm\include\llvm\IR\Function.hllvm Function class在llvm中,使用Function class表示函数,Function class的定义如下:class Function : public GlobalObject, public ilist_node<Function> {...};首先,Function继承自GlobalObject,是一个全局独立对象。其次,Function继承ilist_node&
2022-03-16 10:37:44
1192
原创 llvm libLLVMCore源码分析 19 - GlobalValue
源码路径llvm\include\llvm\IR\GlobalValue.hllvm\include\llvm\IR\GlobalIndirectSymbol.hllvm\include\llvm\IR\GlobalAlias.hllvm\include\llvm\IR\GlobalIFunc.hllvm\include\llvm\IR\GlobalVariable.hllvm\include\llvm\IR\Function.hllvm GlobalValue class在
2022-03-15 15:28:50
1376
原创 llvm libLLVMCore源码分析 18 - BlockAddress & ConstantExpr
源码路径llvm\include\llvm\IR\Constant.hllvm BlockAddress classBlockAddress用于唯一标识一组(Function F,BasicBlock B)的地址:blockaddress(@function,%block)BlockAddress常量的类型是i8 addrspace(P)*,P是包含该BasicBlock的Function所在的地址空间(通常是0)。BlockAddress只能用作indirectbr/callb.
2022-03-14 10:27:50
587
原创 llvm libLLVMCore源码分析 17 - ConstantAggregate
源码路径llvm\include\llvm\IR\Constant.hllvm ConstantAggregate classConstantAggregate是所有复合常量的基类,复合常量把子复合常量或者简单常量(ConstantData)当作操作数进行管理,继承树如下:ConstantStruct表示结构体常量,如下代码:const struct Foo f = { .a = 1, .b = 2 };int constant_struct(int b) { return
2022-03-14 09:35:21
289
原创 llvm libLLVMCore源码分析 16 - ConstantData
源码路径llvm\include\llvm\IR\Constant.hllvm ConstantData classConstantData类是所有简单常量的基类,继承树如下:ConstantData仅用于表示常量本身,使用了Flyweight设计模式,可以在不相关的Module之间共享。既比如1个的常量i32 100,可以用于所有需要表示常量i32 100的地方,仅需要1个对象实例。ConstantInt表示任意位宽的整型常量。如下代码:int constant_i.
2022-03-11 16:25:31
379
原创 llvm libLLVMCore源码分析 15 - Constant Class
源码路径llvm\include\llvm\IR\Constant.hllvm Constant class在llvm中,用Constant类作为所有常量的基类,代表值不会在运行时发生变化。Constant类定义如下,可以看到Constant类继承自User,因为Constant会引用其他Value,也会被其他Value引用。class Constant : public User {};Constant类继承树如下:ConstantData:简单常量,如int,floa
2022-03-11 10:59:00
340
原创 llvm libLLVMCore源码分析 14 - BasicBlock Class
源码路径llvm\include\llvm\IR\BasicBlock.hllvm BasicBlock class回顾一下llvm IR的组织结构。在llmv中,一个Module中可以有n个Function,Function内可以有n个BasicBlock,BasicBlock是单进单出的n条Instruction序列。因此,BasicBlock本质上是一个顺序执行的指令的容器。在源代码中,BasicBlock的定义如下:classBasicBlockfinal:pu...
2022-03-09 18:19:32
1127
2
原创 llvm libLLVMCore源码分析 11 - PHI Node Instruction
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hllvm PHI NodeLLVM IR采用SSA(Static Single Assignment)的形式,这种形式的核心要求有2点:每个变量只被赋值1次。 每个变量在使用前必须先定义。如下源代
2022-03-09 15:37:25
518
原创 llvm libLLVMCore源码分析 12 - Vector & Aggregate Operations
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hVector OperationsExtractElementInst(父类:Instruction)extractelement指令从vector从取出指定索引位置的标量。语法<re
2022-03-09 09:53:30
561
原创 llvm libLLVMCore源码分析 13 - Other Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hOther Operatorsllvm中有部分指令不能简单地归类到某一类别下,这些指令被llvm归类到Other Operators。ICmpInst(父类:CmpInst)icmp返回比较两个操
2022-03-08 18:14:42
1072
原创 llvm libLLVMCore源码分析 10 - Exception Handling Instructions
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hLLVM中的异常处理当LLVM的代码中抛出异常时,LLVM runtime会先尝试找到对应函数的异常帧(exception frame),如果是支持异常处理的语言(如C++),则异常帧中会包含异常处理表(
2022-03-08 11:08:53
725
原创 llvm libLLVMCore源码分析 09 - Cast Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hCast OperatorsTruncInst(父类:CastInst)trunc指令将操作数截断为另一个类型。语法<result> = trunc <ty> <
2022-03-01 16:48:27
1183
原创 llvm libLLVMCore源码分析 08 - Memory Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hMemory Ordering待补充Memory OperatorsAllocaInst(父类:UnaryInstruction)alloca指令用于在当前函数的栈帧上分配内存,当函数返回
2022-02-28 17:02:52
876
原创 llvm libLLVMCore源码分析 07 - Unary & Binary Operators
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hUnary Operators所有的Unary Operators在llvm中均使用类UnaryOperator实现,没有单独的子类。fnegfneg指令用于返回操作数的负值。语法&..
2022-02-26 18:25:38
868
原创 llvm libLLVMCore源码分析 06 - Terminator Instructions
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hTerminator InstructionsTerminator指令用于指示当前BasicBlock的结尾,并指示下一个要执行的BasicBlock。ReturnInst(父类:Instructio.
2022-02-26 11:32:53
779
原创 llvm libLLVMCore源码分析 05 - Instruction Class
源码路径llvm\include\llvm\IR\Instruction.hllvm\include\llvm\IR\Instruction.defllvm\include\llvm\IR\Instructions.hllvm\include\llvm\IR\InstrTypes.hInstruction和BasicBlock在分析代码前,需要先介绍一下llvm IR的组织结构。在llmv中,一个Module中可以有n个Function,Function内可以有n个BasicBloc
2022-02-25 16:42:26
1156
原创 llvm libLLVMCore源码分析 04 - Use Class
源码路径llvm\include\llvm\IR\Use.hllvm\include\llvm\IR\Value.hllvm\include\llvm\IR\User.hllvm Use class在之前的系列文章中,我们讲到Use类表示User和Value之间的关系:1)一个Value可以有多个Use,每个Use对应一个User,既def-use chain。2)一个User可以有多个Use,每个Use对应一个Value,既use-def chain。所以Use类的核心
2022-02-23 11:40:06
1242
2
原创 llvm libLLVMCore源码分析 26 - Module Class
源码路径llvm\include\llvm\IR\Module.hllvm Module Class在llvm中,Module类代表的是llvm程序(既IR编写的程序)的顶层结构。1个Module本质上就是原始程序的1个翻译单元(TU),或者是原始程序的多个翻译单元通过链接器链接而成。Module中包含了全局变量列表,函数列表,依赖的库/Module列表,符号表以及其他描述目标架构信息的数据。DataLayoutDataLayout既数据布局,是1个字符串,描述了数据在内存中的布局。
2022-02-22 18:06:58
691
原创 llvm libLLVMCore源码分析 03 - User Class
源码路径llvm\include\llvm\IR\User.hllvm User Class在llvm,User类是所有引用Value类的节点的基类,User类的继承树如下:use-def chainUser中引用的Value被称为Operands,因为llvm的IR是SSA形式的,所以User的Operands直接指向Value的定义处,这就是use-def chain。有2种方式可以遍历User引用的Value,方式1是使用索引:Value *getOperand(un
2022-02-21 21:57:24
942
原创 llvm libLLVMCore源码分析 02 - Value Class
源码路径llvm\include\llvm\IR\Value.hllvm\include\llvm\IR\ValueHandle.hllvm Value Class在llvm中,Value类是所有程序计算出的值的类(如Arguments,Instructions, Functions等)的基类。Value Type:Value都是有类型的,可以通过getType()方法获取Value的Type。Value Name:Value可以有名字,如下所示的IR中,这个Instructio
2022-02-21 21:08:53
1248
原创 llvm libLLVMCore源码分析 01 - Type Class
源码路径llvm\include\llvm\IR\Type.hllvm\include\llvm\IR\DerivedTypes.hllvm类型系统llvm类型系统是llvm IR最重要的特性之一,是llvm IR和普通的三地址码的重要区别,是一系列的基于IR的优化的基础。以下面的源代码为例:// type.cppint add1(int a, int b) { return a + b;}使用命令"clang -S -emit-llvm type.cpp -o type.
2022-02-15 17:11:50
2012
翻译 C程序中的未定义行为(Undefined Behavior)
什么是UBLLVM IR和C语言中都有UB的概念。很多在C语言中看似合理的事都可能导致UB,UB是代码中很多BUG的源泉。UB在C或类C语言中存在的原因是因为追求极致的性能。类似JAVA之类的语言为了安全和可重现行为的特性,和有意避开了UB,但损失了性能。在讲解更多的细节之前,先简单讲解一下要实现一个对大部分C程序性能友好的编译器,有哪些关键要素:a) 做好关键算法的实现:寄存器分配、调度等等。 b) 知道大量的小技巧(tricks),比如peephole optimization(将一部
2022-02-12 09:33:46
2316
原创 Google Sanitizers
Google SanitizersGoogle的sanitizers一共有5种:AddressSanitizer (检查寻址问题) :包含LeakSanitizer (检查内存泄漏问题) ThreadSanitizer:检查数据竞争和死锁问题(支持C++和Go) MemorySanitizer:检查使用未初始化的内存问题 HWASAN(Hardware-assisted AddressSanitizer):AddressSanitizer的变种,相比AddressSanitizer消耗的内存更
2022-02-12 09:25:11
2943
原创 llvm libLLVMCore源码分析 - 目录
llvm libLLVMCore由一系列类组成,主要的功能是使用IR的形式表示程序(由于历史原因,这个库被命令为libLLVMCore,其实命名为libLLVMIR更准确)。这些类的头文件都被放置在include/llvm/IR目录下,源文件放置在lib/IR目录下。本系列博客会按照如下顺序,对llvm libLLVMCore中的类进行逐个分析(更新中~~~):llvm libLLVMCore源码分析 01 - Type Classllvm libLLVMCore源码分析 02 - Value
2022-02-10 15:21:35
1905
原创 llvm pass 调试
llvm为开发者提供了2种常用的新开发pass调试方法:statistic class和debug counter。statistic classstatistic class是一个计数器,通常用于统计Transform Pass对代码进行Transform的次数。使用如下代码可以定义一个新的计数器NumXForms。#define DEBUG_TYPE "mypassname" // This goes after any #includes.STATISTIC(NumXForms,
2022-02-09 17:22:03
943
原创 llvm RTTI(Run-Time Type Identification)
llvm RTTI(Run-Time Type Identification)
2022-02-08 18:15:31
3182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人