2010-05-11 93 views
0

这个想法有点类似于Apple has done in the OpenGL stack。我想要更一般一点。确定在什么情况下什么变量是常数

基本上,我想对某些特定情况有一些代码的专门和优化的变体。

换句话说:我已给定了算法/代码的函数(让B = {0,1})

f : B^n -> B^m 

现在,我通过特殊的功能的特定情况(其预先定义的一部分的˚F输入)

preset : {1..n} -> {0,1,unset} 

predefinitions(∈的量{0..N})然后通过

pn := |preset⁻¹({0,1})| 
给定

规范地,我们现在得到一个专业功能

f_preset : B^(n-pn) -> B^m 

同时规范地,我们得到这个特殊函数的代码/算法。当然,f_preset的代码将比pk> 0的f更快。然后,您还可以进一步优化此代码(现在可能会有一些死代码,现在可能会有一些循环解压缩,一些计算可以预先计算等)。在某些情况下,它可以有显着的改进。

苹果公司为他们的OpenGL堆栈做了大致的工作(从我已经阅读/了解的内容):他们试图在运行时找到一个好的预设,然后为不会改变的变量设置一个优化版本专门的功能,只使用那个而不是原来的功能。

最初,我想到了一种方法来优化一些自己的游戏的物理模拟。在那里我有很多粒子对象和一组粒子类型(这在编译时是未知的)。粒子类型是一组属性。一旦它们被加载,粒子类型是固定的并且是恒定的。每个粒子对象都是其中一种粒子类型。粒子对象的物理模拟是许多分支代码的非常重要的和平,并且非常依赖于粒子类型。我的想法是现在为每个粒子类型都有一个优化的物理模拟功能。

思考了一下这个之后,我想去远一点:

我希望在运行时自动计算一组这样的预设和维护每个优化的代码。我想在环境发生变化时自动添加或删除预设。

现在有几个问题:

  • 有一种简单的方法来计算一个好的预置?我怎么知道哪些变量对于一个给定的情况是不变的?
  • 有没有简单的方法来检查一个预设有多好? “好”是指所得优化代码的性能。
  • 如何比较两种算法/代码的性能?通过一些启发式?或通过随机输入测试?
  • 应该有多少预设(和优化的代码变体)?所有功能的固定限制?或者每个功能都有所不同?它甚至可能取决于当前的计算机状态?
  • 如何维护不同的优化代码变体?一个包装函数大约f它自动选择最佳优化变体似乎不是很好,因为这可能不是那么容易检查将需要每一个电话。这个问题的解决方案也可能与如何找到好的预设集合/数量有关。 (在粒子类型的情况下,优化的代码将与粒子类型一起附加/保存,粒子类型的数量也定义了预设的数量。)

对于我的第一种情况,大多数这些问题有点过时了,但我现在对如何以更一般的方式做到这一点非常感兴趣。当然,大多数/所有这些问题都是不可计算的,但我想知道你在多大程度上仍然可以获得好的结果。

这整个主题对于JIT编译器的优化也非常重要。他们是否已经进行了这种优化?到什么程度?

有没有很好的最近的研究工作,回答我的一些问题?或者,也许还有一些结果表明,以这种普遍的方式做这件事实在太难了?

+0

苹果在那里做了什么是一个非常明智的技术,已经在图形和其他领域使用了数十年(但从未教过,我知道)。例如,贝尔实验室* Blit *终端(http://doc.cat-v.org/bell_labs/blit/)使用这种技术。他们可以生成机器语言并在堆栈上运行它。 – 2010-05-11 14:27:22

回答

0

在我看来,你在问关于partial evaluation

我实际上对这个概念有点问题,因为它通常是过度学术和过度困难的术语。

它通常表达的方式是,你有一些通用函数F(Islow, Ifast)具有可以在不同时间取不同值的参数。参数Islow很少发生变化,并且Ifast参数在每次调用时都会有所不同。

那么问题是写某种局部评估函数G(F, Islow) -> F1(Ifast)的该取功能FIslow参数,并产生一个新的(简单的)函数F1即只在该Ifast参数。

问题在于:1)有人必须编写一般功能F,以及2)有人必须编写通用部分评估程序G

什么更有意义,我是从头功能H(Islow) -> F1(Ifast)写,就是写具体代码生成器为F1,而不是写两个功能FG,特别是在G是很难写。

H通常比F更容易编写,而G也不需要写!结果函数F1通常比F更小,性能更高,所以这是一个双赢的局面。

当人们编写代码生成器时,这就是他们正在做的事情,它是一种非常有效的编程技术。

+0

感谢您的信息!虽然这不完全是我所要求的。我不希望被迫首先生成专用版本来调用该函数。如果我应该保留生成的代码,我也不想亲自做决定。我主要关心如何自动确定我应该生成的专用版本。它应该在不改变一行代码的情况下工作。无论如何,你提出的方法仍然很有趣。 – Albert 2010-05-11 14:55:27

+0

@Albert:我知道,你想让它成为一个普通的G.我试图做的一点是,这不一定是一件好事情要。即使你能找到一个好的G,你也必须将它应用到F.(这很难向我的象牙塔朋友解释)。在实际的现实情况下,一般的F比H更难写。打印出特定的F1。我可以举一个例子,说明开发工作减少了一个数量级,当然,这个表现并不是竞赛。 – 2010-05-11 17:30:42

+0

啊,我明白你的意思了。问题是,我想将其应用于已有的代码。所以我已经有F了。我的应用程序已经适用于它所设计的所有情况。我只是想让它在特殊情况下自动优化。 - 基本上苹果公司在OpenGL堆栈中做的是同样的事情。 – Albert 2010-05-11 18:04:39

相关问题