[英]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.