[英]Make a cosine table with the gcc preprocessor
我希望在编译时制作一个余弦表。 有没有一种方法可以在不进行任何硬编码的情况下做到这一点?
为什么不硬编码呢? 我不知道他们正在计划的余弦函数的结果会发生任何变化,最好不要再持续100年左右。
我不相信预先计算正弦表会导致性能提高。 我建议:
查找表(特别是大的查找表)将增加需要保留在CPU高速缓存中的程序的大小,从而降低其命中率。 反过来,这会使应用程序的其他部分变慢。
我假设您正在一个难以置信的紧密循环中执行此操作,因为这是无论如何都可能很重要的唯一情况。
如果实际上DID发现使用查找表是有好处的,为什么不只在运行时对其进行预先计算呢? 它几乎不会对启动时间产生任何影响(除非这是一个很大的挑战)。 实际上,在运行时这样做可能会更快,因为您的CPU可能比磁盘加载浮点的速度更快。
使用C ++,您可以使用模板元编程在运行时生成查找表。
现在,这是一个标准的C技巧,可能会或可能不会实现您想要的。
您可以使用任何喜欢的脚本语言来生成它,并包含结果。 每当更改源时,都可以使用make来使脚本语言执行其操作。 确实,它是硬编码到C的,但不是硬编码的。
借助计算机的魔力,似乎不可能的事情成为可能:
#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]);
}
}
由于您以Cell为目标,因此您可能以SPE为目标? 他们确实有适当的FP支持,实际上是矢量化的,但没有很大的工作记忆。 因此,使用表实际上是一个糟糕的想法-您牺牲了非常有限的资源。
我将使用脚本语言创建一个硬编码的查找表,但是我不确定它会比仅使用标准数学库更快。
我猜这取决于表的大小,但是我怀疑让FPU进行计算可能比访问内存更快。 因此,一旦您有了表解决方案,就对其进行基准测试,看看它是否比标准功能要快。
波浪表是必经之路。 您可以按照建议对它进行硬编码,或者在应用程序启动期间运行它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.