簡體   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