OpenCV 的 GpuMat 類別, 可以在 device 的 global memory 建立 Mat 物件, 可以被 kernel 函數直接存取, 以下以 sobel 運算子為例, 將 srcMat (位於host memory) 載入影像後, 轉換至 srcGMat (位於device memory), 經處理後放至 destGMat (位於device memory), 然後下載回 destMat (位於host memory)再顯示出來.
程式中使用 OpenCV 定義於 cuda_types.hpp 的 PtrStep 的樣板結構, 代入定義於 WIndows.h 的 byte, 這樣比較方便. 如果要用 cuda 編譯器 nvcc 內建的 uchar1 , 查看 vector_types.h, 它是一個結構 (向量):
2018年8月31日 星期五
2018年8月30日 星期四
[CUDA] 與 OpenCV 共舞
取得 CUDA 版的 OpenCV 後, 使用 OpenCV 前, 先建立環境變數 OPENCV_DIR, 使其指向 opencv 目錄 ( C:\opencv\build\ ):
[CUDA] OpenCV CUDA 程式庫
2018年8月29日 星期三
[CUDA] 更新Visual Studio後無法編譯的問題
由於 CUDA 對 Visual Stidio 的 Integration 會檢查版本, 如果安裝 CUDA 之後更新升級 Visual Stdio, 可能導致因版本錯誤而出現以下訊息:
#error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
#error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
2018年8月25日 星期六
[CUDA] 平行化之 Scan 演算法
影像處理
histogram 等化處理時,
把
histogram 視為機率分布函數
(pdf), 經常將其積分為累積分布函數
cdf, 例如:
pdf
= { 1, 2, 3, 4, 5, 6, 7, 8}
cdf
= { 1, 3, 6, 10, 15, 21 28, 36}
程式碼為:
2018年8月24日 星期五
[CUDA] 多重讀取與寫入的互斥問題
如果 kernel 執行時, 不同的 thread 對同一個變數進行讀取與寫入, 會發生甚麼事呢? 當不同thread被同時執行時, 同時去讀取同一個變數, 得到相同的值, 如果把此值運算後同時又寫回去, 最後的值就不一定是多少了, 以下程式開啟 BlockSize*ThreadSize 個 thread 去執行把 global memory 陣列變數加1的動作,程式碼如下 :
訂閱:
文章 (Atom)