В 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
к ГПУ, которые при достаточно больших изображений может быть значительным падение производительности.
Выполняя последовательные операции, графический процессор работает медленнее, чем процессор. На этом графическом процессоре нет цели, если вы сначала не векторизовать его. – Daniel
'parfor'! = Обработка GPU. Я даже не уверен, что вы можете parallellise GPU-код, как есть, как говорит @Daniel, лучше подходит для векторизованного кода. – Adriaan
@Adriaan: Вы можете распараллеливать обработку gpu с использованием массивов gpu на рабочих, обычно используя одного рабочего на gpu. – Daniel