我对c/c++的(部分)编译时评估很感兴趣(而不是像c++那样使用模板参数)。让我们考虑以下情况(摘自1):
double mypower(double x, int n) {
int i;
double ret = x;
for (i = 1; i < n; i++) {
ret *= x;
}
return ret;
}然后,在代码中的某个地方调用此函数:
mypower(x,3); // y varies all the time, 然后编译器可以对此进行优化(例如循环展开)。我经常使用的一些函数实际上可以从优化中获益(通过手动创建专用函数进行测试)。表示1表示搜索该函数并被该函数的专门版本所取代的过程。这似乎很管用。但是它似乎不是很普遍,需要为应该替换的函数编写代码。
演示似乎是从2008年开始的,我找不到比这个消息来源更多的实质性信息。那从那以后有什么改善吗?我更喜欢某种自动化,它对所有可能由属性语法控制的函数(例如__attribute__(peval).)都有同样的作用。此外,我也希望为面向对象的代码工作,为不同的对象创建专门的类(2似乎表明这是不可能的)。
此外,我希望这种专门化不仅适用于代码中的常量。我正在考虑一个编译为LLVM IR (字节码)的程序可以做以下工作:
这是我所要求的很多,只有少数的计算密集型程序才能从这样的优化中获益。但有些人肯定在研究这个问题。我可能只是不知道合适的搜索词来满足谷歌的需求。
注意:请不要建议使用非类型参数或手动专门化的模板类,我已经这样做了。我只是更喜欢编译器为我做的工作。
链接:
1
2
发布于 2011-03-21 21:46:48
这主要是在过程间优化的领域。llvm中有几个,特别是IP常量传播,只有在翻译单元中的所有呼叫站点上使用mypower(x,3)才有帮助。你所描述的是可能的,但还没有真正完成。改进IPCP通行证是你想要做的事情--让它在一个特定的呼叫站点克隆并专门化一个功能。如果你有足够的翻译单位,这可能会导致一些相当大的代码膨胀,这就是为什么人们没有真正考虑去做这件事。
当您可以查看程序中的所有调用时,这在LTO级别可能会有更多的用处。
发布于 2011-03-24 02:22:07
您可以使用源到源转换来完成此操作。
我们的DMS软件重组工具包可以用来实现这一点。DMS使用显式语言定义将源代码解析为AST,将AST打印回源代码,提供各种符号表、控制/数据流功能,并提供转换能力,使人们能够构建自定义源代码转换器。DMS有不同语言的许多前端,包括C和C++,有完整的预处理器。
要使用DMS完成任务,您需要使用C解析器来解析系统的所有代码(因为您必须检查所有调用站点以获得任何部分的专门化)。您需要定义一种方法来指定您希望的部分计算;正如您所建议的那样,一种方法是编写一个函数调用,其中参数绑定到常量,但您可以将其概括为绑定到任意表达式的参数。这样的规范可以被DMS的模式解析器解析,它可以处理任意的独立非终端,例如函数调用:-}您需要将这些规范停在某个地方;可能是作为一个额外的外部文件,或者作为在有关调用站点上或附近的注释。
通过解析部分eval规范,您需要查找函数调用名以确定感兴趣的实际函数;它位于源堆栈的某个位置,符号表将使它更容易找到。给定一个具有专门化的调用站点,可以复制标识函数的AST并替换参数;可能只使用少量的转换,但您必须小心使用函数内的词法作用域捕获参数。要解决这个问题,可能需要进行额外的转换。在为指定的函数命名新名称和缩短参数列表之后,您将重新将其AST插入到原始函数定义站点附近,适当地修改调用站点,并吐出修改后的AST。无论您想要为特殊情况下的展开循环添加额外的转换,还是其他您感兴趣的东西,都是实用的。
DMS已被用于对C和C++代码进行大规模转换;这似乎“技术上”简单。熟悉像DMS这样的工具是一个小问题;那里有一个公平的学习曲线。
https://stackoverflow.com/questions/5186134
复制相似问题