楼主: go4jobs
跳转到指定楼层
上一主题 下一主题
收起左侧

突然想学习了 - llm inference学习佛系打卡

   
🔗
 楼主| go4jobs 2026-10-8 13:30:20 | 只看该作者
全局:
今天有点过于沉迷于上班了,导致差点没进度。今天继续扒tensor-ir代码:CudaTileCompiler.cpp 和. CudaTileFrontend.cpp。主要是在给tensor/kernel按照输出的shape分grid(小blocks)去计算,这里的一个grid一个tile(在同一个sm上跑),tile就是计算的最小单位;一个tile归一个CTA管,CTA里的最小单位是一个warp线程束。
回复

使用道具 举报

🔗
fan19940919 2026-10-9 00:48:12 | 只看该作者
全局:
这坑一进去就出不来了😂 我一般先跑通一个小 demo,再回头啃 compiler,不然第一天就被术语劝退。
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-9 13:46:47 | 只看该作者
全局:
tensor-ir继续。今天撸了TensorOps.td,第一次接触描述性语言,理解了差不多70%吧,还没法徒手写个算子。描述性语言也不是我曾经以为的natural language随便写,而是固定的语法固定的单词去写的。新词汇get:mnemonic助记符,opcode二进制操作码。所以tablegen相当于把算子的一些重复性抽象动作/接口,比如打印,输入输出约束……这些用描述性语言定义,成为唯一truth,这样可以根据lowering的不同阶段生成不同的c++代码,免去大量重复性非重要的代码维护工作,而算子逻辑的具体实现是c++实现,相当于我们可以focus在重要的逻辑上,而不用管那些chores。妙啊!哪个小天才想出来的
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-10 14:15:15 | 只看该作者
全局:
今天瞄了眼LayoutAnnotation.cpp。tensor-ir提前把所有tensor的layout算好,后面再做计算。这里GPU的一个特点,shape:stride的layout中支持任意stride,也就是那些形状调整的算子,比如transpose, reshape……都可以直接通过修改layout stride(view)而省掉数据搬运,就像去图书馆按顺序拿一排书,方法一:先把书按顺序排好(需要除了“拿”之外的一个额外步骤)然后拿一排;方法二:一本一本按照顺序拿(需要很多寻址)。省了那些operation,引入一些新的问题比如寻址/向量化。不过只要硬件支持这样的任意寻址,其它的问题都能用软件解决;如果硬件不支持,那就是硬伤,软件也没法弥补。
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-11 15:34:01 | 只看该作者
全局:
Everything is possible Saturday! 秋天真好看啊,草坪上铺满了暖色的落叶毯!心灵massage的一天。
好吧,还是没忍住看了一丢丢。看了下TileAnalyzer.cpp(主要理解注释去了,nvidia大好人)。主要是具体怎样给tensor分高效的tile,开始处理随机寻址的软件部分了。也就是如何把一个tensor切分成tile给sm。sm是gpu上的最小单元了吧,每个sm上有shared memory(大概100-200KB,128x128 x4Byte的tile就是65KB),一个sm可以分到几个tile,每个tile分到自己的部分shared memory,tile/warp内共享shared memory;sm上还有寄存器,存一些中间值比如累加器,每个thread有寄存器。tile分配原则,对于row-major的存储方式来说,fastest-varying dimension先放满(连续访存优先),比如[1024,1024]的tensor,就用[1,128]tile size;[16,3,16]tensor就用[2,4,16]tile size。目标就是sm里的各种资源利用率越高越好。
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-12 16:24:43 | 只看该作者
全局:
画了一幅画,思考为什么这么丑的时候睡着了,一天就这么过去了。罢了罢了,学习毕竟是一辈子的事,急不得。
还是撸了TileCandidateGenerator.cpp,TileSelectionPass.cpp和GraphSplitting.cpp。更加细节去生成TopK个memory-efficient的tile candidates,这样后面可以直接select。措施包括直接给100,000的小tensor的shortcut,让thread对齐128Byte的cache line……咦,这不就是System Design里的必背题之一,recommendation system的设计嘛,candidate generation - score。还有graphsplit,是把graph从DAG变成适用SSA的trees,就是per op per layout一个变量(感觉图大了对同一个op都会增加很多计算,不过SSA有利有弊。)算子也只分了5大类:pointwise ops,layout ops,concat,reduce和matmul(compute-intense)。后三个的iteration space会变。
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-18 14:17:39 | 只看该作者
全局:
冒个泡,楼主兴趣目前是90%,还没放弃。不过这两周病了……好了再继续学!
回复

使用道具 举报

🔗
SunLove1989 2026-10-21 03:26:54 | 只看该作者
全局:
楼主打卡加油!看了很感触,也准备慢慢学起来。我之前试过看kernel/operating system想关的,但感觉太难了,我准备从stanford CS336开始,看看能不能更上。
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-30 14:25:04 | 只看该作者
全局:
我回来了,听说发烧时脑子好使。撸了Bufferize.cpp, Formgrid.cpp,TileReductions.cpp,OutlineKernel.cpp,TensortoCuda.cpp,OutlinedComputeOps.cpp, OutlinedKernelImpl.cpp,TileIRAssembly.cpp,CudaTileRuntimeKernel.cpp. 把tensor-based ops转换成tile-based的destination-passing style。至此,一直是在把一个个op不断加各种attribute生成(transform,或者说lower)最接近cuda的tile ir,然后conversion转换成cuda可以认识的Dialect(cuda ir)。看得越多问题越多越糊涂…代码也没太看懂…frontend理解了大概20%吧……没事儿,有问题总是好事,加油!
回复

使用道具 举报

🔗
 楼主| go4jobs 2026-10-31 13:46:50 | 只看该作者
全局:
有了大概的理解之后,终于开始实践了。跑了个1024x1024x1024 MatMul不同tile size下的的profiling。用tileiras和cuobjdump看了resource usage。在4090上sweep了很多tile size,32x32的tile size性能最好,大概是4.1TFLOPS(reported peak for 4090 is 82.6TFLOPS)。原因有几个:(1)大点的tile size可以省搬运data的时间;(2)但是太大的tile size会导致register和L1/L2 cache spill,导致数据会放在DRAM里,大大增加数据搬运时间;(3)太大的tile size会导致block不够128个sm分,也就是可能部分sm空闲,负载不均,时间变长。还有MatMul维度太小的时候,修改size似乎影响不大,基本上等于kernel的启动时间(所以小size的计算最好是合并kernel省去启动时间?)
BTW:我前面刷源码是先跑了示例里的8x8x8的Matmul mlir,然后用CC给我画了个学习的roadmap出来,这样只学习相关的文件,并不是一股脑随便找个文件就看的。学习相关文件也是用CC一路print出同一个matmul当前mlir的lower输出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表