繁体   English   中英

用gcc预处理器制作余弦表

[英]Make a cosine table with the gcc preprocessor

我希望在编译时制作一个余弦表。 有没有一种方法可以在不进行任何硬编码的情况下做到这一点?

为什么不硬编码呢? 我不知道他们正在计划的余弦函数的结果会发生任何变化,最好不要再持续100年左右。

我不相信预先计算正弦表会导致性能提高。 我建议:

  1. 对调用fcos()的应用程序进行基准测试,以确定它是否足够快。 如果是,请在此处停止。
  2. 如果确实太慢,请考虑使用-ffast-math(如果您的用法可以接受)。

查找表(特别是大的查找表)将增加需要保留在CPU高速缓存中的程序的大小,从而降低其命中率。 反过来,这会使应用程序的其他部分变慢。

我假设您正在一个难以置信的紧密循环中执行此操作,因为这是无论如何都可能很重要的唯一情况。

如果实际上DID发现使用查找表是有好处的,为什么不只在运行时对其进行预先计算呢? 它几乎不会对启动时间产生任何影响(除非这是一个很大的挑战)。 实际上,在运行时这样做可能会更快,因为您的CPU可能比磁盘加载浮点的速度更快。

使用C ++,您可以使用模板元编程在运行时生成查找表。

现在,这是一个标准的C技巧,可能会或可能不会实现您想要的。

  1. 编写一个生成余弦表C语句(即所需代码)的程序(例如cosgen)。
  2. 运行cosgen并将输出(C代码)转储到文件中,例如cos_table.c
  3. 在主程序中,使用#include“ cos_table.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]);
    }
}

http://codepad.org/G6JTATne

由于您以Cell为目标,因此您可能以SPE为目标? 他们确实有适当的FP支持,实际上是矢量化的,但没有很大的工作记忆。 因此,使用表实际上是一个糟糕的想法-您牺牲了非常有限的资源。

我将使用脚本语言创建一个硬编码的查找表,但是我不确定它会比仅使用标准数学库更快。

我猜这取决于表的大小,但是我怀疑让FPU进行计算可能比访问内存更快。 因此,一旦您有了表解决方案,就对其进行基准测试,看看它是否比标准功能要快。

波浪表是必经之路。 您可以按照建议对它进行硬编码,或者在应用程序启动期间运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM