我想加速我的算法,因为我需要在数百个图像上运行它,所以我尝试使用未经过滤波的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是单线程应用吗?
提前致谢
答案 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,并行计算工具箱是唯一的方法。
这实际上取决于你在做什么。对于某些代码,MATLAB只能使用单个处理器的单个内核,对于其他代码,MATLAB将自动利用所有可用内核(可能还有处理器)。这实际上取决于底层功能。有些东西不容易并行化。有时您可以使用parfor循环等方式帮助MATLAB。其他时候你可能需要像MPI这样的东西。还有一些时候你真的无能为力。