我想使用紋理內存插值數據。我有2個數組(即A [i]和B [i]),我想在它們之間插入數據。我以爲我可以將它們綁定到紋理內存並設置插值,但我不知道該怎麼做。用CUDA插值紋理內存
CUDA附帶的例子使用A [i-1]和A [i + 1]進行插值。
有沒有辦法做我計劃的?我正在嘗試這個,因爲我認爲我可以獲得很好的加速。
我想使用紋理內存插值數據。我有2個數組(即A [i]和B [i]),我想在它們之間插入數據。我以爲我可以將它們綁定到紋理內存並設置插值,但我不知道該怎麼做。用CUDA插值紋理內存
CUDA附帶的例子使用A [i-1]和A [i + 1]進行插值。
有沒有辦法做我計劃的?我正在嘗試這個,因爲我認爲我可以獲得很好的加速。
是的,你可以用紋理內存來做到這一點,而且速度很快。我個人使用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也可用。
如果您不習慣使用CUDA進行開發,那麼使用紋理內存並不是最簡單的事情。
我建議你嘗試在你的算法的第一個並行版本在CUDA中編寫沒有優化。然後,在您的應用程序中使用NVIDIA Visual Profiler來確定是否需要設置紋理內存來優化內存訪問。
請記住,你越早優化,更棘手的是調試。
最後但並非最不重要的,最新的CUDA版本(CUDA 5,仍處於發行候選版)能夠的聲明作爲參數傳遞的輸入緩衝區的內核const restrict
數據自動存儲在紋理內存只要指針。
Thx爲答案。我已經有了第一個並行版本。但與CPU相比,加速並不是很令人印象深刻。這就是爲什麼我想試試這個。 – Silve2611
首先運行分析器。你的問題可能只是內存訪問。 – jopasserat
這不是我有問題。我只想比較結果,所以如果我知道如何做到這一點會有所幫助。 – Silve2611
tex1D只需要兩個參數吧? – Silve2611