使用gcc预处理器创建一个余弦表

时间:2009-10-19 10:44:32

标签: c gcc c-preprocessor ps3

我希望在编译时创建一个余弦表。有没有办法在没有硬编码的情况下做到这一点?

8 个答案:

答案 0 :(得分:12)

为什么不硬编码?我不知道他们正在计划的余弦函数的结果是否有任何变化,而不是100年左右。

答案 1 :(得分:9)

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

  1. 根据您的应用程序调用fcos()来确定它是否足够快。如果是,请停在这里。
  2. 如果确实太慢,请考虑使用-ffast-math,如果它可以接受您的使用。
  3. 查找表,特别是大表,会增加需要保存在CPU缓存中的程序大小,从而降低其命中率。这反过来会减慢你的应用程序的其他部分。

    我假设你在一个非常紧凑的循环中这样做,因为这是唯一可能无论如何都要重要的情况。

    如果您确实发现使用查找表是有益的,为什么不在运行时预先计算它?它对启动时间几乎没有任何影响(除非它是一个huuuuuge)。实际上在运行时这样做可能会更快,因为你的CPU可以比你的光盘加载浮动更快地发出正弦。

答案 2 :(得分:8)

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

现在,这是一个标准的C技巧,可能会或可能不会达到你想要的效果。

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

http://codepad.org/G6JTATne

答案 5 :(得分:2)

既然你正在瞄准Cell,你可能正在瞄准SPE吗?他们确实有适当的FP支持,实际上是矢量化的,但没有大的工作记忆。因此,使用表格实际上是一个糟糕的想法 - 你牺牲了非常有限的资源。

答案 6 :(得分:1)

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

我想这取决于表的大小,但我怀疑让FPU进行计算可能比访问内存更快。所以,一旦你获得了表格解决方案,我就会对它进行基准测试,看它是否比标准功能更快。

答案 7 :(得分:0)

波浪表是最佳选择。您可以按照建议进行硬编码,也可以在应用程序启动时运行它。