我希望在编译时创建一个余弦表。有没有办法在没有硬编码的情况下做到这一点?
答案 0 :(得分:12)
为什么不硬编码?我不知道他们正在计划的余弦函数的结果是否有任何变化,而不是100年左右。
答案 1 :(得分:9)
我不相信预先计算正弦表会导致性能提升。我建议:
查找表,特别是大表,会增加需要保存在CPU缓存中的程序大小,从而降低其命中率。这反过来会减慢你的应用程序的其他部分。
我假设你在一个非常紧凑的循环中这样做,因为这是唯一可能无论如何都要重要的情况。
如果您确实发现使用查找表是有益的,为什么不在运行时预先计算它?它对启动时间几乎没有任何影响(除非它是一个huuuuuge)。实际上在运行时这样做可能会更快,因为你的CPU可以比你的光盘加载浮动更快地发出正弦。
答案 2 :(得分:8)
使用C ++,您可以使用模板元编程在运行时生成查找表。
现在,这是一个标准的C技巧,可能会或可能不会达到你想要的效果。
答案 3 :(得分:5)
您可以使用您喜欢的任何脚本语言生成它并包含结果。使用make可以让脚本语言随时更改源代码。它很难编码为C,但不是你,真的。
答案 4 :(得分:2)
凭借计算机的魔力,显然不可能成为可能:
#include <stdio.h>
#include <math.h>
#define MAX_ANGLE 90
double kinopiko_krazy_kosines[MAX_ANGLE];
int main ()
{
int i;
for (i = 0; i <= 90; i++) {
double angle = (M_PI * i) / (2.0*90.0);
kinopiko_krazy_kosines[i] = cos (angle);
printf ("#define cos_%d %f\n", i, kinopiko_krazy_kosines[i]);
}
}
答案 5 :(得分:2)
既然你正在瞄准Cell,你可能正在瞄准SPE吗?他们确实有适当的FP支持,实际上是矢量化的,但没有大的工作记忆。因此,使用表格实际上是一个糟糕的想法 - 你牺牲了非常有限的资源。
答案 6 :(得分:1)
我创建了一个硬编码的查找表 - 一次使用脚本语言 - 但我不确定它会比使用标准数学库更快。
我想这取决于表的大小,但我怀疑让FPU进行计算可能比访问内存更快。所以,一旦你获得了表格解决方案,我就会对它进行基准测试,看它是否比标准功能更快。
答案 7 :(得分:0)
波浪表是最佳选择。您可以按照建议进行硬编码,也可以在应用程序启动时运行它。