2015-04-23 81 views
1

我想優化我的C++代碼,我不知道是否有方法在GPU中使用CUDA-C存儲表格。在表中的C++當前代碼是:如何在CUDA中實現壓縮表?

double m_alpha = 0.5; 
unsigned char* compressionTable = new unsigned char[65536]; 
double denom = exp(m_alpha * log(65535.0))/255.0; 
for (unsigned int i = 0; i < 65536; ++i) 
    compressionTable[i] = exp(m_alpha * log(i))/denom; 

後我訪問這個表在一個循環爲:

bmode[i][j] = compressionTable[round(abs(sH[i][j]))]; 

SH是希爾伯特變換(複雜數組)的數組的獲得短int類型數據(壓縮表2的存儲器)。訪問的循環不是一個小問題,但我的主要問題是快速實施壓縮表。我會感謝任何幫助。

+1

爲什麼不在主機CPU上創建表格,然後將其放入GPU常量內存中(假設您沒有在常量內存中存儲其他任何內容?)。 –

+2

或者預計算並將其綁定到紋理或表面? – talonmies

回答

3

如果您真的需要使用查找表,在SM 2.0或更高版本的GPU上,您應該將它放在設備內存中並讓緩存處理內存流量。對於查找表,其他內存空間不會比L1/L2更好。

但是,這看起來像是一種在CPU上運行良好的優化,在GPU上根本不需要。 CUDA硬件可以計算單精度對數和指數,延遲時間僅爲4個時鐘週期。重寫您的算法,以執行內聯計算而不是使用查找表。由此產生的代碼將具有較少的依賴於數據的性能,並且內存子系統將被釋放以服務實際運行內核所需的內存流量。