2016-01-19 4 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 цикла, чтобы работать в ГПУ.

Мне нужна помощь. Я прочитал несколько статей, но понятия не имею, как это сделать.

+2

Выполняя последовательные операции, графический процессор работает медленнее, чем процессор. На этом графическом процессоре нет цели, если вы сначала не векторизовать его. – Daniel

+0

'parfor'! = Обработка GPU. Я даже не уверен, что вы можете parallellise GPU-код, как есть, как говорит @Daniel, лучше подходит для векторизованного кода. – Adriaan

+0

@Adriaan: Вы можете распараллеливать обработку gpu с использованием массивов gpu на рабочих, обычно используя одного рабочего на gpu. – Daniel

ответ

3

В MATLAB parfor не позволяет запускать вещи на графическом процессоре. Лучший способ взаимодействия с GPU через MATLAB - преобразовать ваши данные в gpuArray, а затем все операции, выполняемые над этими данными, оптимизированными для GPU, будут оптимизированы там.

Как сказал @ Даниэль, код, который вы опубликовали 1), не идеален для любой параллельной обработки и 2) может быть ускорен только путем векторизации.

Я не совсем уверен, что вы пытаетесь сделать, но похоже, что вы пытаетесь найти пиксели внутри изображения, окруженного «нефоном». Для этого я обычно использовал двумерную свертку с ядром окрестности, чтобы выяснить, сколько соседей заданного значения имеет пиксель.

Например, следующий код находит любой пиксель, который сам 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 

Я лично нравится это решение, но если у вас есть Image Processing Toolbox, вы также можете использовать imerode или imdilate, чтобы в основном сделать то же самое.

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; 

Имейте в виду, что это имеет накладные расходы на копирование I к ГПУ, которые при достаточно больших изображений может быть значительным падение производительности.

Смежные вопросы