基于静电场模拟的Global Placement技术及其优化(FFTPL,ePlace,DreamPlace,Xplace论文阅读笔记)

本文是一篇论文阅读笔记,介绍一下一种全局布局的技术,即把待布局单元当成电荷,利用电场力优化布局的论文(FFTPL),其后续优化及用GPU实现的技术(ePlace,DreamPlace,Xplace)。

用静电力来优化布局的方法

最先提出使用静电力来做全局布局的貌似是这篇论文:
FFTPL: An Analytic Placement Algorithm Using Fast Fourier Transform for Density Equalization
意为使用快速傅里叶变换来对密度这个量进行优化。那么傅里叶变换和静电力有什么关系呢?
先看优化目标:
在这里插入图片描述
其中 v ⃗ \vec{v} v 代表当前布局的所有单元的位置。 W ~ \tilde{W} W~就是HPWL了(HPWL是半周长线长,一种估计线长的方法,这篇博客中有介绍:https://blog.csdn.net/kkkjfg/article/details/128877914), N ( v ⃗ ) N(\vec{v}) N(v )则代表势能,在这里插入图片描述
λ \lambda λ则代表这两个目标之间的比例。
优化目标是这个,但我们其实也并不需要知道具体的线长与势能,因为在优化过程中我们只需要对当前的布局算一个导数优化目标的导数就可以了,然后挪动各单元的位置,这个过程类似于梯度下降。
那么其实问题就在于每一步得把目标函数对各单元位置的导数求出来。首先这个导数是:
∇ f = ∇ W + λ ⋅ q ⋅ E \nabla f=\nabla W+\lambda·q·E f=W+λqE
∇ W \nabla W W等下再说,先说后面这项,即势能对电荷的导数,即 λ ⋅ q ⋅ E \lambda·q·E λqE,其实很有道理,在电场中,想使势能最小,当然就是沿着电场走,且电场力越大,电势变化得越快。 q ⋅ E q·E qE就是电场力。那么,如何求电场力呢?这里标题的“Fast Fourier Transform”,快速傅里叶变换就出用场了,它利用一个叫泊松等式(Poisson’s equation)的东西进行求解:
在这里插入图片描述
它的数值解是:
在这里插入图片描述
( w u = π u n w_u=π\frac{u}{n} wu=πnu w v = π v n w_v=π\frac{v}{n} wv=πnv)
在这里插入图片描述
在这里插入图片描述
按这个解对(x,y)求导就是电场了。
在这里插入图片描述
没看懂?我也没看懂。想看证明的FFTPL的参考论文[17]有详细证明:
G. Skollermo. A Fourier Method for the Numerical Solution of Poisson’s Equation. Mathematics of Computation, 29(131):697–711, 1975.(https://www.ams.org/journals/mcom/1975-29-131/S0025-5718-1975-0371096-4/S0025-5718-1975-0371096-4.pdf)

当然我刚刚说的是已知电荷分布,那么电荷分布是怎么求的呢?按面积来,面积越大电荷越大,所以一个单元格的density定义为所有与之相交的单元的面积和。(下图截图于Xplace,A代表面积, A b A_b Ab代表一个bin,即一个单元格的面积,V是全体标准单元、宏单元。)

总之我们知道这是一个用电荷分布求电场的手段就行了。虽然我挺纳闷的有电荷分布了为什么不直接拿E=kQ/r^2这种公式算,chatgpt说可能拿快速傅里叶变换会更快更精准。
在这里插入图片描述

以下是一个电荷分布、电场分布和电势的例子,可以看到这种方案确实会把电荷向四周推开去(电势中间高周围低,势能想低就得往低走)
在这里插入图片描述
以下是算法流程:
在这里插入图片描述
这图已经比较清楚了,就是在初始化之后,计算线长损失,密度损失,然后求梯度更新各单元的位置就完了,可能不太清楚的就是CG(Conjugate Gradient)Optimization是什么,我查了一下貌似是类似SGD,Adam这类的优化器,可以规划更新步长等策略。

还有就是前面一直没提的线长的问题,由于HPWL不好求导:
在这里插入图片描述
这里采用了一个平滑策略:
在这里插入图片描述
这里 λ \lambda λ越小越接近于HPWL。

线长与运行时间的结果:
在这里插入图片描述

总结一下,如何用静电力来优化布局的方法?把各单元的位置当作一组参数,不断求线长损失和密度损失,其中密度损失用静电力建模,即把密度损失视为势能,先用各单元位置、面积求出不同bin的电荷密度,得到一个电荷密度map,然后使用快速傅里叶变换求出电场分布,最后就可以用电荷乘以电场得到电场力了,电场力就是密度损失的梯度。看上去就是提出了一种新的非线性目标函数罢了,而且把单元建模成电荷似乎很straightforward,但看上去就是有效果,质量和速度有着不错的结果。

ePlace

这里ePlace指ePlace-MS: Electrostatics-Based Placement for Mixed-Size Circuits
ePlace原文中说这篇工作是基于FFTPL这篇工作做的。看上去ePlace还进行了一定的扩展和微小的优化。
从流程上来说,ePlace把算法扩展到了detailed placement阶段。但在“Mixed-Size Global Placement”ePlace允许把宏单元无差别地一起进行计算,然后它有一个“Macro Legalization”阶段固定标准单元无视填充单元使用模拟退火优化宏单元位置,最后再插入填充单元,优化填充单元、同时优化填充单元与标准单元。
在这里插入图片描述
另外的一些优化包括ePlace使用了Nesterov’s method进行优化,而不再使用FFTPL的Conjugate Gradient优化策略了。

GPU的实现

这里介绍的是“DREAMPlace: Deep Learning Toolkit-Enabled GPU Acceleration for Modern VLSI Placement”这篇。这篇的原理是基于ePlace的,但是做了一些额外的优化。
在这里插入图片描述
这张图解释了DreamPlace怎么使用pytorch加速placement,

正常的神经网络的用法在左边,网络权重w是与输入无关的参数,会对输入(比如各种坐标)做处理和变换,预测出一组值f,再与标签y比对做loss,最后反向传播更新权重。

而DreamPlace更像是利用了这个GPU的框架做反向传播而已。DreamPlace里,各单元的x,y坐标就是神经网络的可学习参数w,对每个布局来说都要重新初始化。输入是各单元的特征信息e,可能是面积,引脚位置之类的信息,损失函数就是线长,反向传播的时候更新各单元位置即可。DreamPlace中,密度损失作为正则项出现(虽然感觉好像线长也可以作为正则项)。

总而言之,就是把单元位置当作权重不断更新,最后得到解。

然后DreamPlace有一些优化,比如作者发现算线长的时候有一些中间变量会重复计算。
先定义一个表,定义如下。
在这里插入图片描述
这里面规定了一些 a + , a − , b + , b − a^+,a^-,b^+,b^- a+,a,b+,b之类的值,然后这些值会在前向然后自动求导的过程中被重复计算。
在这里插入图片描述
其中前向与反向的一些依赖关系如下 :
在这里插入图片描述

可以看到WL的前向反向基本上大部分值都是需要算的,那么理清楚关系之后,可以先把中间变量a,b,c算出来,然后一起得到前向反向的结果,也可以在线长这项上直接算反向,反正前向算了也没用。改完之后的算法流程如下:
在这里插入图片描述
第二个优化是在算密度损失的时候引入了多线程和负载均衡。
在这里插入图片描述
如图是算密度损失的时候各元件和各区域的相互关系,首先要让各单元与每个区域算重叠面积并累积,然后得到密度图,由密度图算出电场图后,各区域再根据重叠面积和场强对它上面重叠的单元施加一个作用力。

由于不同大小的单元能重叠的区域数不尽相同(10-1000),所以如果单纯的一个线程做一个cell的模拟是会造成负载不均衡,而影响性能的,所以这里作者使用了排序,让负载相近的模块一起计算,以平衡各线程的计算量。最后线程数作者是选择了32。

对于一些较大cell,这么做似乎还是不够,作者又尝试使用多个线程更新一个cell,发现22的配置是最好的(这里22与1*4有什么区别?可能是同时计算的区域的相对位置不一样?)在这里插入图片描述
再后面就是介绍快速傅里叶变换求电场相关的优化了,这里没有看太懂。

GPU上进一步的优化

这里介绍:Xplace: An Extremely Fast and Extensible Global Placement Framework这篇文章。
Xplace在DreamPlace之上又做了更多优化。

  • Xplace采用了合并操作符的操作,把线长相关工作量的三个运算符WA线长、WA梯度和HPWL组合成一个运算符。

  • Xplace为了减少内核启动次数,采用了以下两点优化:

    • 直接计算前向反向结果,不调用autograd进行计算(这点和DreamPlace似乎很像)。
    • 尽可能使用PyTorch的“in-place operators”直接在张量内存上操作避免复制内存。
    • 把同步操作放在操作队列队尾防止对GPU执行的中断。
  • “操作跳过”的优化,在密度损失和线长损失的梯度比 r = λ ∣ ∇ D x , y ∣ ∣ ∇ W l x , y ∣ r=\frac{\lambda |\nabla D_{x,y}|}{|\nabla Wl_{x,y}|} r=∣∇Wlx,yλ∣∇Dx,y过小或者是线长损失的梯度占主导地位的时候,所以直接不算了,节省计算量。
    一套组合下来加速效果还是不错的:
    在这里插入图片描述
    能节省38%的时间。

Xplace还提出了一个架构:
在这里插入图片描述
在图下方的框里,求密度梯度 ∇ D p \nabla_Dp Dp的地方可以替换成一个神经网络算电场,而不是使用快速傅里叶变换进行运算。而且这个架构里求梯度的过程也能换成用户自定义的损失函数+自动求导的模式,相当于这里是一个可替换模块,这体现了这个工作的可扩展性。

图中的神经网络是“pixel-wise”的和输入密度图等大小的预测,且中间使用了pytorch自带的快速傅里叶变换和逆变换的算子,根据FNO(https://zhuanlan.zhihu.com/p/533488795)的介绍,这种操作可以提高模型在不同分辨率下的泛用性。

从上面的结果图来看,使用这个神经网络使得线长有些许的提升,虽然运行时间变长了,但这说明了使用神经网络代替某些操作提升精度的可行性,若后续还能有更好的网络还可以在这里进行替换以达到更好的效果。

总结

  • 用静电力来建模单元之间的关系可行度很高
  • global placement涉及很多优化,比如CG,Nesterov’s Method等,以及建模的时候涉及一些比如快速傅里叶变换之类的操作,对于数学功底不好的人来说(比如我)这些内容会有些吃力,不知道我碰到这些问题的时候是否还能一下子把正确快速的解给想出来。
  • 机器学习在global placement上似乎还大有可为,不仅可以用GPU并行计算和加速已有的建模方法(DreamPlace,XPlace只是加速ePlace,不知其他的先进方法是否也适合使用gpu加速?),而且从混乱到有序的过程看起来挺像扩散模型的,感觉以后有可能会出现直接用模型预测global placement的作品?
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是MATLAB基于模拟退火的圆形放置在矩形中的算法代码: ```matlab function [x, y, r] = simulated_annealing_circle_placement(W, H, N, T0, alpha, T_min) % W: 矩形宽度 % H: 矩形高度 % N: 圆形数量 % T0: 初始温度 % alpha: 降温速率 % T_min: 终止温度 % 初始化随机圆形位置和半径 x = rand(N,1)*W; y = rand(N,1)*H; r = min(W,H) / 4; % 初始半径为矩形长宽较小值的1/4 % 计算初始能量 E = energy(W, H, x, y, r); % 模拟退火过程 T = T0; while T > T_min % 随机扰动圆形位置和半径 x_new = x + randn(N,1)*r/10; y_new = y + randn(N,1)*r/10; r_new = r + randn(N,1)*r/10; r_new = max(r_new, 0.01); % 半径不能为负数 r_new = min(r_new, min(x_new,y_new)); % 半径不能超过最小距离 % 计算新的能量 E_new = energy(W, H, x_new, y_new, r_new); % 判断是否接受新的状态 if E_new < E || exp((E-E_new)/T) > rand() x = x_new; y = y_new; r = r_new; E = E_new; end % 降温 T = T * alpha; end end function E = energy(W, H, x, y, r) % 计算圆形放置的能量 N = length(x); E = 0; for i = 1:N % 判断圆形是否越界 if x(i)-r(i) < 0 || x(i)+r(i) > W || y(i)-r(i) < 0 || y(i)+r(i) > H E = Inf; return; end % 判断圆形是否重叠 for j = i+1:N d = sqrt((x(i)-x(j))^2 + (y(i)-y(j))^2); if d < r(i)+r(j) E = Inf; return; end end % 计算圆形与矩形边缘的距离 d_left = x(i) - r(i); d_right = W - x(i) - r(i); d_top = y(i) - r(i); d_bottom = H - y(i) - r(i); d = min([d_left, d_right, d_top, d_bottom]); E = E + d^2; end end ``` 该算法使用模拟退火优化圆形的位置和半径,使得所有圆形都在矩形内部且不重叠,并且能量函数为圆形与矩形边缘的最小距离的平方之和。算法的输入参数为矩形宽度W、矩形高度H、圆形数量N、初始温度T0、降温速率alpha和终止温度T_min。函数的输出为圆形的位置x和y以及半径r。 ### 回答2: 以下是基于模拟退火算法的 MATLAB 代码,用于在矩形中放置圆形。 ```MATLAB function [best_x, best_y, best_radius] = simulatedAnnealing(rectangle_width, rectangle_height, initial_temperature, cooling_rate) % 设置变量初始值 best_energy = inf; best_x = 0; best_y = 0; best_radius = 0; current_temperature = initial_temperature; % 循环直到温度降为0 while current_temperature > 0 % 随机生成候选圆形的半径、圆心位置 candidate_radius = rand * min(rectangle_width, rectangle_height) / 2; candidate_x = rand * (rectangle_width - 2 * candidate_radius) + candidate_radius; candidate_y = rand * (rectangle_height - 2 * candidate_radius) + candidate_radius; % 计算候选圆形的能量 candidate_energy = computeEnergy(candidate_x, candidate_y, candidate_radius, rectangle_width, rectangle_height); % 判断是否接受候选圆形 if candidate_energy < best_energy best_x = candidate_x; best_y = candidate_y; best_radius = candidate_radius; best_energy = candidate_energy; elseif rand < exp(-(candidate_energy - best_energy) / current_temperature) best_x = candidate_x; best_y = candidate_y; best_radius = candidate_radius; best_energy = candidate_energy; end % 降低温度 current_temperature = current_temperature * cooling_rate; end end function energy = computeEnergy(x, y, radius, rectangle_width, rectangle_height) % 判断圆形是否超出矩形范围 if x - radius < 0 || x + radius > rectangle_width || y - radius < 0 || y + radius > rectangle_height energy = inf; else % 计算圆形与边界之间的距离之和作为能量 energy = distanceToBoundary(x, radius, rectangle_width)... + distanceToBoundary(x, rectangle_width - x, rectangle_width)... + distanceToBoundary(y, radius, rectangle_height)... + distanceToBoundary(y, rectangle_height - y, rectangle_height); end end function distance = distanceToBoundary(center, length, max_length) if center <= length distance = center; elseif center >= max_length - length distance = max_length - center; else distance = length; end end ``` 本算法根据给定的矩形的宽度、高度和初始温度,使用模拟退火算法找到最佳的圆形在矩形中的放置位置。算法采用随机生成的圆形位置和半径作为候选解,并根据能量函数评估候选解的质量。在一系列迭代中,根据温度和能量差异的比较,选择是否接受候选解。随着迭代的进行,温度逐渐降低,最终找到最优的圆形放置位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值