2016-08-24 125 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