2016-08-24 90 views
0

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

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是单线程应用程序吗?

在此先感谢

回答

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

+0

不要gpuArray仍然需要并行计算工具箱? – zhqiat

+0

是的,并行工具箱是gpuArray所需的 –

+0

非常感谢Airidas Korolkovas,但是我的执行时间没有得到很大的改善,pagefun的使用可以改善时间吗?我有平行的工具箱。 nvidea GT 650M – MAGNETAR

0

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

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

如果你想利用你的电脑GPU,并行计算工具箱是这样做的唯一方法。

mathworks

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

+0

这不是完全正确的,你可以打开MATLAB的几个实例,每个实例都可以在不同的核心上工作。 – EBH

+0

好点!只需要你改变你的代码并分割你的循环。 – zhqiat

+0

如果你的计划是使用'parfor'等,那么你的代码应该能够很容易地分割循环。否则,_parallel computing toolbox_将不会帮助他...... – EBH