因此,我正在研究CUDA程序,並且在索引塊和線程時遇到了一些問題。基本上,我試圖在CUDA中實現Pixel Sort算法。針對CUDA中的圖像行/列的線索索引
我被可視化它是簡單地與每個1級的線程中運行的N個塊(對於行數的方式(有一個修改中,我們只,而不是兩個同時處理要麼行或列),或列),並讓每個塊獨立處理該行/列。
所以,如果我們要進行排序列,我們推出這樣的內核(也有一對額外的參數僅僅是我們的具體處理相關的,所以我離開了出來爲簡單起見)
pixel_sort<<<cols, 1>>>(d_image, d_imageSort, rows, cols, ...);
然後在內核中,我訪問與
int tid = blockIdx.x;
塊索引這使我每塊一個行/列中的數據的工作,但仍存在一些問題。它的運行速度比我們對較小圖像的算法的串行執行速度要慢,並且在圖像尺寸變得過大時直接崩潰。
我正在考慮的替代線程方案是將每個圖像的像素映射到一個線程,但是我有幾個關於這個問題的問題。
- 如果我們要用M個線程(用M行表示N個col)來啓動N個塊,我們應該如何避免每個塊的線程數512(或1024?)。在這個例子中,我們可以讓每個線程在列中處理多個像素嗎?索引在內核中的外觀如何?
- 該算法基本上要求我們在整個列上工作,因此每個線程都不能只是對該像素做了一些工作,他們必須進行通信,可能使用共享內存。如果每塊有一個「主」線程,實際的排序計算,然後讓所有其他線程參與共享內存,這是否是一種有效的策略?
其他註釋:
- 我們的圖像數據通過OpenCV的讀入,並具有存儲在
uchar4
陣列