Re: [讨论] GPU加速Transistor层的模拟器

楼主: expiate (夜露死苦)   2021-01-04 04:30:06
monkey大大说你只是想用GPU加速MOS 6502的电路模拟
我觉得就单你的例子是可行的,我分析如下:
你的电晶体数目不大,我们就用实际数目估计吧
- 3510 transistor
- 在NmosFet.py里有5个变量记录状态变化
所以整个chip的模拟需要3510x5=17550个状态来表示chip在每个cycle装态
我们取整数20K好了,然后每个状态用1 byte来表示(int8_t or char)
然后我们需要两个阵列分别代表目前chip的状态与chip下一个状态
所以总共是
20K*2 =40K byte = 40 KB
int8_t cur_arr[40000];
int8_t next_arr[40000];
每个cycle更新状态就是按照电路接线与数个cur_arr[i]的值来计算next_arr[j]
算完整个next_arr,到下一个cycle把next_arr所有值复制到cur_arr
我假设对于这40K的状态变量,你都有对应的表可以查,例如
if(cur_arr[0] = LOW && cur_arr[256] = HIGH && cur_arr[87] = LOW)
next_arr[3] = HIGH;
else
next_arr[3] = LOW;
然好写死在code里,每次launch cuda kernel就根据array的index去查表更新状态就可以
原理跟矩阵乘法用cuda kernel写几乎一模一样。
麻烦的就是要把每个状态怎么更新的规则要了解
这思路很简单很暴力,但是对于MOS 6502绰绰有余,甚至你可以用变量控制cuda kernel
一次更新多少cycle来减少memory之间资料传递的时间
我假设你查表是用2个unordered_map<int8_t,string>,一个是查HIGH,另一个是查LOW
每个状态有10个对应的相关状态要查:
2*40000*(1+5*10+10) = 4880000 约 5MB
2: 两个map
40000: 总共的状态数
1: int8_t
5*10: worst情况会有十个表示四位数的字串加上inv,例如 1234_~2356_3333_....
~: 表示这个状态是LOW
10: 用来区别的字符(_),其实最多只会有九个
基本上不用担心GPU memory装不下,甚至你可以多算好几个cycle的结果再一次回来
拿NV GPU 3080里面的10GB memory,假设每次cycle更新需要10MB (好算而已)
你可以储存1000个结果了,throughput上一定可以有显著的改善
这次总该有回答到你的问题上了吧?
※ 引述《expiate (弯曲屎壳郎)》之铭言:
: 感谢你提供的网站http://www.visual6502.org
: 这提供非常多的讯息与实作的细节,也让我有机会能更理解你的想法
: 我先称它为virtual chip来做区别。
: 我看了FAQ与slide,里面大致就回答这群作者能做到什么程度,
: 我把我认为重要的条件列在下面:
: - if it has only one or two metal layers and was made before about 1985
: - Before ~1980, chip design was a very manual process
: - MOS 6502: there are "3510" trnsistors
: - The simulator is running an idealized "digital" circuit based on our
: model of the chip's network of transistors and wires.
: - It does not account for "analog" behavior
: (resistance, capacitance, leakage), has no propagation delays, and
: transistors switch on and off instantaneously.
: 综上所述,我觉得你会混用transister-level与gate-level真的不能怪你
: 因为这真的是时空背景不同,但照历史脉络来看也能稍微理解为什么
: TSMC/UMC晶圆代工与EDA产业的兴起了:因为制程发展与电晶体数量大增
: 那如果你要照这群作者的方法做逆向工程在现今的芯片可行吗?
: 我觉得人眼要识别现今的polygon(网页所用的词)及连接,可能要有写轮眼
: 不过我layout学得很差,也许真的有能人可以做到,但那个数量级太大了
: 这网页有提到他们想要自动化但是失败(How did automatic vectorization fail?)
: 所以我推论目前人必须很大程度参与到这逆向工程中。
: 对这我有个想法,这个project是在2010左右的成果,而CNN(卷积神经网络)在
: ImageNet 2012比赛取得压倒性的胜利,时至今日computer vision已经很成功了
: 也许在这部分,CNN可以做到很好,然后把比较难辨识的再交给人类来做
: 可是呢,这又会需要foundry厂的know how了,因为你需要训练用的资料与标签
: 所以你想继续这条路,我给的建议是看看有没有人在做半导体的computer vision。
: 我知道S家有在做P&R的那方面的,也许C家做更多
: 然后拿他们的模型来做逆向工程并请专家帮你做最后的验证
: 之后的工作基本都可以用程式来解决了
: 至于有无法律问题就看看有没有人在你写程式时来查水表了XD
: 我写到这,我大概也能理解为什么没人做virtual chip emulator了
: 如果chip简单人类可能还可以做,但是现在的chip真的太大太复杂了
: 还有3D IC这种多一个维度的,加上公司求快。除非是要偷设计,
: 不然成本太高了太不经济了。
: 希望能给你一些帮助。
: ※ 引述《expiate (弯曲屎壳郎)》之铭言:
: : 我有把你下面推文的两个连结看了以确定我尽量能理解你的目的。
: : 文中你提到transistor-level与逻辑闸层(gate-level)模拟,
: : 这两个用词在你的语境下所代表的意思有点模糊,
: : 我用我的理解以及上篇crossbar的观点来定义一下:
: : - transistor-level:
: : 我认为你指的是电晶体电路,也就是layout或是spice
: : 模拟用来跑电气特性,像是增益,匹配或是SNR
: : 里面的基本元素就是半导体的材料物理模型(非我专长请专家补充)
: : - gate-level:
: : 逻辑闸电路,我这边理解的话就会指cell-based design
: : 里面的电路表示会由boolean operator或是更复杂的像是
: : AOI (And-Or-Inverter),基本上世界上的IC design house
: : 的design flow主要都是走这条。
: : /*** 我假设你有unlimited resources,要多快有多快的CPU,GPU和memory ***/
: : 然后我只就数位电路作为我的目标,类比电路我是觉得更难就不深入了
: : 基本上transistor-level的模拟我觉得要行得通,必须半导体物理材料模型要准
: : 以及RC (resistance capacitance) model要准。也就是内部电气特性与外部
: : routing的特性都要有准确的模型去计算才有可能实现。
: : 如果你只是对于前几代制程的产品,我猜也许会有已经很成熟及准确的模型可以使用
: : 但我很怀疑是否有公开的资讯你可以拿到,因为基本上这都是foundry的know how。
: : 也许学校有资源可以让你接触,或是真的有很老亦或教学的的模型供你使用
: : 假设你有了,其实就是把transistor-level的电路用这些模型表示
: : 然后把彼此的输入/输出 接好跑模拟即可。最后在针对电气数值判断0/1
: : 这是我觉得最困难的部分,完成后就都是0/1世界了。
: : Gate-level的模拟跟对应的library有很深的相依性,也就是foundary所提供。
: : 而且所需的电气特性都包含在每个cell里的table,所以像是slack或是slew
: : 都可以快速查表得知。而EDA公司提供的sign-off product就是保证他们的验证
: : 结果跟foundry厂生产出来的芯片会是一样的。
: : 这就间接的指出其实可以透过gate-level模拟来实现你的目标。
: : 然后这也是为什么FPGA会作为验证工具的原因。只要在FPGA功能验证完成,
: : 剩下的就是跑flow然后tapeout,不用太担心会不一样。而且跟模拟比起来快太多了
: : 你可以试试用VCS或是NCVerilog跑个一百万cycle就可以感觉为什么唯快不破了
: : 通常IC design house在tapeout之前都可以估自己只能跑几次模拟。
: : 也就是说bug或是timing issue如果不能在这几次模拟中解决就等著被X吧
: : 以上是我觉得可以实现你目标的方法,如果真的能reverse回来的话。
: : 下面是我觉得为什么GPU无法帮助太多的理由。
: : 就我所知,目前没有EDA公司的产品里有使用GPU做加速,也许有功能但可能卖不出去XD
: : 大部分都还是仰赖CPU及memory作为计算的主力。
: : 这是因为GPU主要的计算典范是SIMD (Single Instruction Multiple Data)。
: : 拿现今最流行的深度学习做例子,训练的步骤很明确feedforward,backpropagation
: : 底下的计算主要都是矩阵运算,只是每次要做运算的data不一样。
: : 回过头看gate-level电路模拟,如果把电路看成神经网络不也可以用GPU加速?
: : 嗯其实GPU加速电路模拟真的是很容易想到,cuda已经出来十几年了,所以我想
: : 肯定有人尝试但是没成功或是效果不如预期。这也是大家喷这么凶的原因。
: : 不过我觉得大家太严苛了,难得有人正经问问题其实可以多点耐心分享所学的。
: : 所以问题就该是为什么GPU不能像神经网络一样很好地加速电路模拟?
: : 我个人思考的结果是:大部分的电路模拟不是线性的
: : 我的思路是把combinational logic电路当作是神经网络,
: : 而暂存器就是神经网络的layer。我能用矩阵来表示combinational logic吗?
: : 我觉得光是处理gate个数与gate该在矩阵哪个位置我就觉得不好处理
: : 当然你可能有别的思路,可是本质上你还是会受限于GPU计算的本质:
: : 不擅长做复杂(heavy control dependency)的计算。
: : 这也是我觉的目前EDA公司还是以cpu为主要算力的原因。
: : 如果你有兴趣,你可以试着朝high performance computing/parallel computing
: : 做更深入的理解。
: : 最后,我只是抛砖引玉吸引炮火。
: : 大家不要为难原po,我其实很欣赏这样愿意花时间苦干的人了
: : 所以欢迎大家来喷我吧!最好发战文,大家一起学习!
: : 也期许原po日后有什么进展欢迎分享给大家。
作者: mmonkeyboyy (great)   2021-01-04 04:32:00
这就是我叫他自己算数学算算就好了XD 您人真好这也是我昨天说的可以用上tensor core的方法至于能多快....不知道 XD
作者: erspicu (.)   2021-01-04 09:39:00
感谢 细节我还要稍微多看再了解一下 但初步看起来很类似先把结果算出来使用查表的方式去拿结果?反正可以当成解法之一当可行作法参考"自己算数学算算就好了" 我是不知道这回答在说啥如果要这种回答 我也会说 自己算数学算算就好了
作者: mmonkeyboyy (great)   2021-01-04 10:00:00
算一下要用多大ram去计算这种都不会我也不知道该说什么 什么都不太懂 回应到是挺爱战的反正就算这么跟你讲 你也不一定知道这中间问题在那你根本就没心也不想好好理解为什么gate-level 要这样做 简单说就是个什么都不想懂的伸手牌而已大概你想人家把code 都送上让你去嘴别人这样?
作者: erspicu (.)   2021-01-04 10:08:00
需要用多大的RAM跟算法有关系 你连用啥方法都没说
作者: mmonkeyboyy (great)   2021-01-04 10:08:00
想做gate-level东西 ram不会算 人家当你是来闹的先你想做这个东西连基本知识都没有@[email protected]~
作者: erspicu (.)   2021-01-04 10:09:00
js那份project就循环在跑而已 也只是加载一些节点定义所耗的内存根本不大 我是根本不知道你是要我算啥
作者: mmonkeyboyy (great)   2021-01-04 10:11:00
呵呵呵呵呵 所以你还是不懂XD就当我没讲 你加油 好棒!
作者: erspicu (.)   2021-01-04 10:12:00
作法可能不只一种 谁知道你是要算哪一种?你连一个确定的命题或方式都没说 是要算啥?
作者: mmonkeyboyy (great)   2021-01-04 10:16:00
这篇回文的e大就懂得怎么算了不是?
作者: erspicu (.)   2021-01-04 10:19:00
前面有说 细节我还要再稍微了解一下 但大概知道策略方向要算好歹要知道是要算啥用啥大概方式才能评估
楼主: expiate (夜露死苦)   2021-01-04 12:15:00
没事,希望你能顺利完成你的梦想顺便造福大家
作者: javatea (齁齁)   2021-01-06 18:11:00
array cell的查找用gpu跑 不会有啥好处吧真的tensor core的硬件也不是这样搞的 = =a....
作者: mmonkeyboyy (great)   2021-01-07 07:18:00
不是这样搞没错啊....查找可能没有 用点数学运算可能有好处点还要再插多蛮多层的 我也不能说太多 但方式有点像step-function 的做法 不过做下去搞刚又没啥好处就是了 而且电路没办法scale只做一个可能可以吧 啊灾另一个电路的层级要先分出来才知道怎样让tensor-core跑就是了@[email protected]~ 这概念大概十年前就有人做了为了让原文主可以找到文章 免得说找不到 这类文章UMICH下去找 找不找得到就看命了
作者: tomap41017 (绝梦)   2021-01-15 11:32:00
人真的很好。

Links booklink

Contact Us: admin [ a t ] ucptt.com