GPU上的加速图像处理算法,并行处理Matlab

时间:2016-08-24 18:18:26

标签: performance matlab image-processing vectorization gpgpu

我想加速我的算法,因为我需要在数百个图像上运行它,所以我尝试使用未经过滤波的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仅使用我20%的CPU?我如何利用我的CPU来加速我的处理

Matlab是单线程应用吗?

提前致谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

来自mathworks

  

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