2012-08-22 55 views
1

我想使用紋理內存插值數據。我有2個數組(即A [i]和B [i]),我想在它們之間插入數據。我以爲我可以將它們綁定到紋理內存並設置插值,但我不知道該怎麼做。用CUDA插值紋理內存

CUDA附帶的例子使用A [i-1]和A [i + 1]進行插值。

有沒有辦法做我計劃的?我正在嘗試這個,因爲我認爲我可以獲得很好的加速。

回答

2

是的,你可以用紋理內存來做到這一點,而且速度很快。我個人使用ArrayFire來完成這些操作,因爲它比我希望手工編寫的代碼更快。

如果要全部手工編寫代碼自己在CUDA,這樣的事情是你想要什麼:

// outside kernel 

texture<float,1>  A; 
cudaChannelFormatDesc desc = cudaCreateChannelDesc<float>(); 
cudaArray *arr = NULL; 
cudaError_t e = cudaMallocArray(&arr, &desc, 1, length); 
A.filterMode = cudaFilterModePoint; 
A.addressMode[0] = cudaAddressModeClamp; 
cudaBindTextureToArray(A, arr, desc); 

... 

// inside kernel 
    
valA = tex1D(A,1,idx) 
valB = tex1D(B,1,idx) 

float f = 0.5; 
output  = (f)*valA + (1-f)*valB; 

如果你只想插件ArrayFire(這在我的經驗比我嘗試更快代碼手,更何況這樣更易於使用),然後你會想:

// in arrayfire 
array A = randu(10,1); 
array B = randu(10,1); 
float f = 0.5; 
array C = (f)*A + (1-f)*B; 

上述假設你想要2個不同的陣列或矩陣的相應指標之間進行插補。還有other interpolation functions也可用。

+0

tex1D只需要兩個參數吧? – Silve2611

2

如果您不習慣使用CUDA進行開發,那麼使用紋理內存並不是最簡單的事情。

我建議你嘗試在你的算法的第一個並行版本在CUDA中編寫沒有優化。然後,在您的應用程序中使用NVIDIA Visual Profiler來確定是否需要設置紋理內存來優化內存訪問。

請記住,你越早優化,更棘手的是調試

最後但並非最不重要的,最新的CUDA版本(CUDA 5,仍處於發行候選版)能夠的聲明作爲參數傳遞的輸入緩衝區的內核const restrict數據自動存儲在紋理內存只要指針。

+0

Thx爲答案。我已經有了第一個並行版本。但與CPU相比,加速並不是很令人印象深刻。這就是爲什麼我想試試這個。 – Silve2611

+0

首先運行分析器。你的問題可能只是內存訪問。 – jopasserat

+0

這不是我有問題。我只想比較結果,所以如果我知道如何做到這一點會有所幫助。 – Silve2611