Performance 如何将嵌套循环转换为parfor循环

Performance 如何将嵌套循环转换为parfor循环,performance,matlab,gpu,vectorization,bsxfun,Performance,Matlab,Gpu,Vectorization,Bsxfun,这是我的MATLAB脚本中的一部分 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;

这是我的MATLAB脚本中的一部分

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
loop,以运行到GPU中


我需要帮助。我读了一些文章,但不知道如何转换它。

在MATLAB中,
parfor
不允许在GPU上运行。通过MATLAB与GPU接口的最佳方式是将数据转换为a,然后针对GPU优化的数据执行的所有操作都将在那里进行优化

正如@Daniel所说,您发布的代码1)不适合任何类型的并行处理,2)可能只有通过矢量化才能加快速度

我不完全确定你想做什么,但似乎你想在图像中找到被“非背景”包围的像素。为此,我通常使用2D卷积和邻域核来计算一个像素有多少个给定值的邻域

例如,以下代码定位自身为
false
且完全被
false
值包围的任何像素(假设输入图像为
逻辑

我个人喜欢这个解决方案,但如果你有图像处理工具箱,你也可以使用或基本上做同样的事情

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
复制到GPU的开销,对于足够大的图像,这可能会对性能造成重大影响。

仅执行顺序操作,GPU比CPU慢。在GPU上运行该代码没有任何意义,除非首先对其进行矢量化。
parfor
!=GPU处理。我甚至不确定你能不能并行化GPU代码,因为正如@Daniel所说,它更适合矢量化代码。@Adrian:你可以在worker上使用GPU阵列并行化GPU处理,通常每个GPU使用一个worker。
I = gpuArray(I);
surrounded_by_zeros_on_gpu = conv2(double(I), ones(3), 'same') == 0;