zoukankan      html  css  js  c++  java
  • 基于模拟退火的FPGA布局方法

    1 布局问题的定义
    现在有一个电路的一组模块,模块之间有确定的连线关系。每个模块可以对应FPGA上的一个CLB或者其他资源块,问如将这些模块分配到FPGA的资源块上,才能使得电路的性能最佳?

    图1 网格型的FPGA的布局示意图(布局时只关注大致的连线关系,即连到哪个模块即可,不需要具体到模块的哪个引脚)

    2 需要做什么事情才能完成一个布局?
    首先需要指定什么样的布局是一个好的布局。通常的做法是,提出一个目标函数(或者叫成本),这个目标函数表示了当前这种布局下,预估的走线长度(对应于时延)、占用的总面积、布线通道的拥挤程度等。一个好的目标函数不是能够很随便的设计出来。

    其次需要确定如何表示一个布局。这里针对的是FPGA的布局,FPGA内部大多采用网格型的资源块分布,因此只需要确定一个模块对应哪个资源块即可,也就是给出资块的坐标。

    3 如何才能得到一个好的布局?
    一个简单的思维就是,先算便布局,把这些模块随意地放,只要重叠就好了,这样就能得到一个初始布局了。为了得到一个更好的布局,再随便猜一个,然后计算一下目标函数(或者叫成本),看看这个布局是不是要好一点,如果好一点就把这个布局记下来,然后再猜新布局用来比较。如果没有更好一点,也无所谓,继续猜就好了。通过这个简单的方法,只要我猜足够多次,一定能够得到一个在这样的目标函数下的最好的布局。

    图2 通过不断地猜新的布局,一定可以找到一个最优布局
    这种方法虽然很蠢,但是我们有100%的把握,通过这种方式一定可以找到一个最优布局。问题的关键在于要花多少时间,如果只有几个模块需要布局,那自然可以很块得到答案,然而当模块很多时(数以万计甚至是十万计,对于ASIC则比这个规模还大很多),这种方案肯定让人难以接受,花几个月甚至几年得到一个布局?显然不行。

    4 为何使用模拟退火方案进行布局?
    为了解决当规模变大时,仍然可以通过瞎猜获得更好的布局,可以使用很多启发式或者概率方法。遗传算法、模拟退火就是两种常见的优化算法。针对布局应用,模拟退火的作用就是加速通过瞎猜找到更好布局的过程。
    第一个策略是,限制完全瞎猜。东一榔头西一棒槌的瞎猜,也就是完全随机的瞎猜,不用思考也知道肯定会很慢,因为这完全没有利用到上一次瞎猜的结论。现在的瞎猜方式改为,在上一次的瞎猜基础上做一些随机改动,看这些改动能不能够得到更好的效果。这样的前后两次瞎猜是有关联的,能够提供一定的方向。
    第二个策略是,不完全计算每个布局下的成本。因为当模块很多的时候,计算成本也是一件比较耗时的事情。有第一个策略可以知道,新猜出的布局与前一个布局只有很少一部分不同,因此,可以只计算有这些不同部分引起的布局成本变化。

    第三个策略是,提供一定的爬坡能力。所谓的得到最好的布局可以理解成为成本最小的布局。按照之前的策略,我们会不断得到好更好的布局,然而一个问题是,目标函数不一定只有一个极小值点(也就是不一定为凸函数),所以如果不提供爬坡能力,也就是跳出极小值点的能力,那么得到的布局很可能不是真正接近最优的布局。
    第四个策略是,随着温度的下降,逐渐降低爬坡能力。模拟退火方案是一个迭代过程,为了控制迭代过程有一个参数温度T,每一次迭代温度都按照某种方式下降一点。当温度比较高的时候,要求有比较强的爬坡能力,也就是我猜到了一个不如之前布局的布局,但是我不一棒打死,二十按照这个温度下的概率来接受这个布局,也就是我在(0,1)区间随便去一个数,如果大于这个温度下的概率我就认为这个布局要保存下来,用来产生新的布局。随着温度逐渐下降,这种爬坡能力也要逐渐下降。这就是所谓的Metropolis准则,即按照下面的式子接受差的布局

    当温度低到一个预先设定的值的时候,就不继续猜了,把当前的布局作为最终的布局。这四个策略保证了,通过乱猜,能够在比较短的时间内,猜出一个非常接近最优布局的布局,当然只能说接近,因为毕竟是猜的,没有严格的最优证据。

    5 使用模拟退火的难点在哪里?
    使用模拟退火的关键在于提供了一定的爬坡能力,同时给出了一定的瞎猜方向,但是难度在于如何控制温度:
    (1) 如果温度下降很慢,那么就相当于一直在瞎猜,因为好的坏的解没有区别;
    (2) 如果温度下降很快,那么相当于没有爬坡能力,得到的解不一定接近全局最优;
    另外,可以很明显地看到,整个迭代过程,也就是猜了多少布局是间接受温度T的控制的,因为温度T小于某个预先设定的阈值时,就结束迭代了。因此,(3)温度T的初值和终值的设定是很有讲究得。上面的三个问题即是所谓退火表。因可以这样说,使用模拟退火得到的布局好坏,很大一部分受退火表的控制。

    6 总结
    FPGA布局是将网表得到的模块映射到FPGA的具体资源块上,在网格型的FPGA中即确定每个模块的网格坐标。可以通过随机乱猜的方式得到最好的布局方式,但是随机乱猜十分耗时,可以使用模拟退火的方法来加速乱猜。使用模拟退火的难点除了实现文中的几个策略外,在于退火表的设计。

  • 相关阅读:
    Intersection(计算几何)
    Happy Matt Friends(DP)
    Dire Wolf(区间DP)
    Black And White(DFS+剪枝)
    最大子矩阵
    Largest Rectangle in a Histogram (最大子矩阵)
    City Game(最大子矩阵)
    Zipper (DP)
    QQpet exploratory park(DP)
    C++程序设计(第4版)读书笔记_指针、数组与引用
  • 原文地址:https://www.cnblogs.com/vector1234/p/13227112.html
Copyright © 2011-2022 走看看