2016-01-19 45 views
-1

這是我的MATLAB腳本。如何將嵌套循環轉換爲parfor循環

function [ Im ] = findBorders(I) 


Im = false(size(I)); 

I = padarray(I, [1, 1], 1); 
[h w] = size(Im); 

bkgFound = false; 
for row = 1 : h 
    for col = 1 : w 
     if I(row + 1, col + 1) 

      bkgFound = false; 
      for i = 0:2 
       for j = 0:2 
        if ~I(row + i, col + j) 
         Im(row, col) = 1; 
         bkgFound = true; 
         break; 
        end; 
       end; 

       if bkgFound 
        break; 
       end; 
      end; 
     end; 
    end; 
end; 

所以,我需要將其轉換爲parfor循環,碰上GPU。

我需要幫助。我閱讀了一些文章,但不知道如何將其轉換。

+2

只執行順序操作,GPU比CPU慢。沒有目的在GPU上運行該代碼,除非您首先進行矢量化。 – Daniel

+0

'parfor'!= GPU處理。我甚至不確定你可以平行對待GPU代碼,就像@Daniel所說的那樣,它更適合矢量化代碼。 – Adriaan

+0

@Adriaan:您可以在工作人員上使用gpu陣列並行處理gpu,通常每個gpu使用一個工作人員。 – Daniel

回答

3

在MATLAB中,parfor不允許在GPU上運行。通過MATLAB與GPU進行交互的最佳方式是將數據轉換爲gpuArray,然後對那些針對GPU優化的數據執行的所有操作都將在此處進行優化。

正如@Daniel所述,您發佈的代碼1)對於任何類型的並行處理都不理想,並且2)只能通過向量化加速。

我不完全確定你想要做什麼,但它似乎像你試圖找到一個圖像中的「非背景」包圍的像素。爲此,我通常會使用鄰域內核的2D卷積來計算像素具有給定值的鄰居數量。

例如,下面的代碼定位其本身false和由false值完全包圍(假設你的輸入圖像是logical

I = [... 
    1 1 1 1 0; 
    1 0 0 0 0; 
    0 0 0 0 0; 
    0 0 0 0 0; 
    0 0 0 1 1; 
    0 0 0 1 0; 
]; 

surrounded_by_zeros = conv2(double(I), ones(3), 'same') == 0 

surrounded_by_zeros = 

    0 0 0 0 0 
    0 0 0 0 0 
    0 0 1 1 1 
    1 1 0 0 0 
    1 1 0 0 0 
    1 1 0 0 0 

我個人喜歡這個解決方案的任何像素,但如果有圖像處理工具箱,您也可以使用imerodeimdilate基本上做同樣的事情。

surrounded_by_zeros = ~imdilate(I, ones(3)); 
surrounded_by_zeros = imerode(~I, ones(3)); 

如果由於某種原因,你真的需要這個計算移到GPU(你不這樣做),你可以施放此爲gpuArray,然後執行相同的操作,它會在後臺使用的GPU

I = gpuArray(I); 
surrounded_by_zeros_on_gpu = conv2(double(I), ones(3), 'same') == 0; 

請記住,這有轉移到GPU這爲足夠大的圖像可以是顯著性能命中複製I的開銷。