【问题标题】:How to convert a nested loop into parfor loop如何将嵌套循环转换为 parfor 循环
【发布时间】:2016-04-24 20:01:21
【问题描述】:

这是我的 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 循环,以运行到 GPU。

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

【问题讨论】:

  • 只是执行顺序操作,GPU 比 CPU 慢。除非您先对其进行矢量化,否则在 GPU 上运行该代码是没有意义的。
  • parfor != GPU 处理。我什至不确定您是否可以并行化 GPU 代码,正如@Daniel 所说,它更适合矢量化代码。
  • @Adriaan:您可以在工作人员上使用 gpu 数组并行化 gpu 处理,通常每个 gpu 使用一个工作人员。

标签: performance matlab gpu vectorization bsxfun


【解决方案1】:

在 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;

请记住,这会产生将I 复制到 GPU 的开销,这对于足够大的图像可能会对性能造成重大影响。

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 2014-06-10
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多