我想在CUDA中的設備上存儲背景圖像數據。後來,當我從視頻源中讀取新場景時,我想將新場景作爲前景圖像發送到GPU,並將其從背景圖像中減去。我不希望爲每個場景重新發送背景圖像到GPU。我怎樣才能做到這一點?CUDA:我如何存儲持久性數據?
2
A
回答
3
存放在設備的存儲器陣列的背景圖像(即在GPU)。然後當您讀取前景圖像時使用cudaMemcpy
將其複製到另一個設備存儲器陣列。然後啓動一個內核,將兩個設備內存數組作爲參數並執行圖像減法。應該很簡單。
假設你使用默認的上下文創建,這是所有在同一個CPU線程中運行,你不必擔心做具體,讓您的CUDA上下文「完整」的巴特評論什麼。但是,如果你做任何CPU多線程,你將需要做一些上下文管理。
1
下面是一個簡單的例子..
int main(int argc, char **argv) {
uint *hostBackground, *hostForeground; //new uint[]..
uint *background, *foreground;
首先初始化背景和前景數據..
cudaMalloc(background, ..);
cudaMalloc(foreground, ..);
然後加載後臺數據
cudaMemCpy(background, hostBackground, ..); //copy to device..
然後讀取前景數據
while (applicationRuns) {
readImage(hostForeground); //read image..
cudaMemcpy(foreground, hostForeground, ..); //copy to device
//operate on foreground..
substruct_kernel<<<threads, blocks>>>(foreground, background, width, height);
cudaMemcpy(hostForeground, foreground, ..); //copy to host
//use hostForeground
}
釋放他們,
cudaFree(foreground);
cudaFree(background);
}
下面是一個簡單substruct內核..
__global__ void substruct_kernel(uint *foreground, uint *backgroung, int width, int height)
{
int idx = threadIdx.x + threadDim.x * blockIdx.x;
int idy = threadIdx.y + threadDim.y * blockIdx.y;
if (idx < width && idy < height)
foreground[idx + idy * width] -= background[idx + idy * width]; //clamp may be required..
}
我不建議使用庫這種簡單的操作。 Blas庫或Thrust庫可能是選項。
相關問題
- 1. Firebase數據庫持久性存儲
- 2. Android,如何保存持久性數據?
- 3. 如何在Amazon上託管持久性數據存儲系統
- 4. C++ win32如何存儲持久性數據
- 5. 如何刪除核心數據持久性存儲
- 6. 如何使用JavaScript存儲域名持久性數據?
- 7. 在持久性存儲中存儲數據
- 8. BlackBerry持久性存儲
- 9. 如何在持久性存儲上創建兩個持久存儲協調器
- 10. 無法將我的頭圍繞appengine數據存儲持久性
- 11. Firebase持久性如何存儲我的Android應用程序的本地數據
- 12. CoreData持久性存儲何時創建?
- 13. 圖形數據庫如何將數據存儲到持久存儲?
- 14. 數據持久性
- 15. 持久性數據
- 16. 關係數據的持久存儲
- 17. 對象數據的持久存儲
- 18. AngularJS - 投入持久數據存儲
- 19. 在會話中存儲持久數據
- 20. SQLite持久性存儲作爲緩存
- 21. 如何將緩存存儲持久化到關係數據庫
- 22. 在TFDMemTable數據的內存持久性
- 23. 何處/如何使用tomcat存儲持久數據?
- 24. 將JSON傳遞到持久性數據存儲(CoreData等)
- 25. 數據輸出中的R有光澤的持久性存儲
- 26. 數據存儲的持久性是後面的一個
- 27. 密碼保護核心數據持久性存儲
- 28. 的AppEngine數據存儲持久性的經理讓所有除
- 29. 與RMS的問題存儲持久性數據
- 30. 核心數據 - 更新持久性存儲不工作
感謝您的回覆。我正在使用C#接口並將其綁定到CUDA dll。我必須存儲哪個GPU內存?我首先想到的是存儲在不斷的記憶中,但我無法在其他框架中找到它。 – 2012-04-24 05:33:17
常量應該沒問題,但它只有在塊中的所有線程同時訪問相同地址時纔有效。你可能想使用cudaMalloc的設備內存,並傳遞指針,然後cudaFree它,當你完成。如果你不能在另一個框架中訪問常量內存,那麼你必須以某種方式破壞你的上下文,這是不好的。 – harrism 2012-04-24 06:16:14