2011-12-14 51 views
0

我有一個曲線如下:Cuda的線性內插

float points[] = {1, 4, 6, 9, 14, 25, 69}; 
float images[] = {0.3, 0.4, 0.7, 0.9, 1, 2.5, 5.3}; 

爲了內插假設F(3)I將使用線性內插1和4 之間爲了內插假設F( 15)我會應用二進制搜索點的數組,並得到lowerBound這是25,並考慮插值在區間[14,25]等。

我發現這種方法是我的設備功能非常慢。我聽說我可以使用紋理內存和tex1D來做到這一點!是否有可能,即使點[]不是我們說的統一(通過不斷增加的步長)

任何想法?

回答

1

它看起來像這樣的問題可以被分成兩個部分:

  1. 使用點陣列,以在F中的x值轉換(X)爲0到7之間的浮點指數(需要二進制搜索上點[])
  2. 使用浮點指數從圖像陣列

Cuda的紋理存儲器可以使第2步中非常快的得到一個線性內插值。然而,我猜測你內核中的大部分時間都花在了第1步上,而且我不認爲紋理內存可以幫助你。

如果您尚未充分利用共享內存,將陣列移動到共享內存將比使用紋理內存提供更大的加速比。在最近的硬件上有48K共享內存,所以如果你的陣列少於24K(6K元素),它們都應該放在共享內存中。步驟1可以從共享內存中獲益很多,因爲它需要非連續讀取點[],這在全局內存中非常慢。

如果你的數組不適合共享內存,你應該把你的數組分成6個元素的相同大小的塊,並將每塊分配給一個塊。讓每個塊讀取所有正在引用的點,並且如果它不在存儲在其共享內存中的points []數組的部分內,則忽略該點。