【问题标题】:Accelarating image processing algorithm on GPU, parallel processing MatlabGPU上的加速图像处理算法,并行处理Matlab
【发布时间】:2016-08-24 18:18:26
【问题描述】:

我想加速我的算法,因为我需要在数百张图像上运行它,所以我尝试使用未矢量化的 GPU 代码,在 GPU 上运行相同的代码,我的 PC 上有 2 GB 的 nvidia Geforce GT 650M,但是它比 CPU 版本慢很多。搜索后,我确信使用批处理(pagefun,bsxfun)传递给矢量化 GPU 代码,我尝试了很多方法来解决这个问题而没有解决方案。有人可以帮我解决一下这段代码吗:

Q=100;
       for i=3:n-2
        for j=3:m-2 
         A(i,j)=0;
            for c=1:Q
                        if B(i,j,c)~=0
                        A(i,j)=A(i,j)+(-(B(i,j,c)).*log(B(i,j,c)));
                        end
            end
        end
       end

另一个问题 为什么 Matlab 只使用了我的 CPU 的 20%?我如何利用我的 CPU 来加速我的处理速度

Matlab 是单线程应用吗?

提前致谢

【问题讨论】:

    标签: performance matlab image-processing vectorization gpgpu


    【解决方案1】:

    矢量化版本是这样的:

    BB = B(3:(n-2),3:(m-2),:);
    cutoff = 10^(-6);
    logBB = log(BB);
    logBB(BB<cutoff) = 0; % remove divergent terms
    A = -sum(BB.*logBB,3);
    

    即使在 CPU 上,它也应该已经运行得更快了。如果你有 GPU,你需要做的就是输入数组

    BB = gpuArray(BB);
    

    存储在 GPU 上,然后收集结果

    A = gather(A);
    

    回到CPU

    【讨论】:

    • 难道gpuArray还不需要并行计算工具箱吗?
    • 是的,gpuArray需要并行工具箱
    • 非常感谢Airidas Korolkovas,但是我的执行时间并没有很大的改善,使用pagefun可以改善时间吗?我有并行工具箱。英伟达 GT 650M
    • 不幸的是 gpuArray() 方法有相当多的开销,对于您的问题类型,您可能会看到只有超过 10^5-10 的大型输入可能会加速 2-3 倍^6 个元素。使用 arrayfun() 可以加快速度,但只有在很多元素为零时才有效,因此可以在 B=0 检查后中止。我猜最快的方法是编写自定义 CUDA 内核,这里有一个教程:mathworks.com/help/distcomp/examples/…
    • 不幸的是,这个矢量化版本不起作用,因为 B(i,j,c) 的每个元素都不能为零,以避免在计算日志时出现 NaN 情况。我尝试将 epsilon 添加到 BB 而不是消除负号数
    【解决方案2】:

    您需要购买parallel computing toolbox。 (使用 parfor)。

    这是 matlab 的一个众所周知的限制,其中一些底层函数不会跨多个内核(不是线程)并行化。一个快速的大致方法是查看 matlab 使用了多少 CPU,然后将其乘以你电脑中的核心数量(这应该会让你达到 100% 左右)。

    如果您想利用您的计算机 GPU,并行计算工具箱是唯一的方法。

    来自mathworks

    这真的取决于你在做什么。对于某些代码,MATLAB 只能利用单个处理器的单个内核,而对于其他代码,MATLAB 将自动利用所有可用内核(可能还有处理器)。这实际上取决于底层功能。有些事情不能轻易并行化。有时您可以帮助 MATLAB 处理 parfor 循环之类的事情。其他时候你可能需要像 MPI 这样的东西。还有一些时候,你真的无能为力。

    【讨论】:

    • 这并不完全正确,您可以打开多个 MATLAB 实例,每个实例都将在不同的内核上工作。
    • 好点!只需要您更改代码并拆分循环。
    • 如果一个人打算使用parfor 之类的,那么他的代码应该以一种能够让他很容易地拆分循环的方式编写。否则,并行计算工具箱帮不了他……
    • 尝试使用parfor时的另一个问题是将循环内的变量更改为切片数据
    • 假设你没有并行计算工具箱,你会推荐什么来并行化 matlab
    猜你喜欢
    • 2020-03-16
    • 2011-04-20
    • 2012-06-07
    • 2010-09-30
    • 2016-07-18
    • 1970-01-01
    • 2016-12-23
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多