Performance 如何将嵌套循环转换为parfor循环
这是我的MATLAB脚本中的一部分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;
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;