2012-08-25 30 views
3

我希望儘可能快地在矩陣上使用閾值後發現非零元素。考慮到CUDA \ Jacket,我已經瞭解到這比找到的matlab的「常規」cpu版本慢得多,可能是由於內存分配問題,因爲輸出的大小在find函數之前是未知的。然而,使用'bwlabel'和'regionprops'(都支持在Jacket中)確實可以有效地產生關於非零元素的信息,並且比MATLAB中內置的圖像處理工具箱功能快得多。有沒有辦法利用這個來獲得非零元素?有沒有辦法對每個使用bwlabel找到的標籤對象進行一些處理?Matlab的find語句使用CUDA Jacket,或者,是否有一種並行方式來查找非零矩陣元素?

+0

@nate,你能發表一些你正在做什麼以及你如何做基準測試的代碼嗎? find是夾克中更快的功能之一,你不應該有任何麻煩。另外提及您是否使用稀疏矩陣。 –

+0

@pavan,看到我對gpu的迴應如下。只要喂足夠大的基質,夾克就沒問題。我不知怎的忘了... – bla

回答

2

根據我的經驗,Jacket支持的FIND實現速度非常快,至少對於大於300x300左右的矩陣。我在我的筆記本電腦上測試了這一結果,並在下面分享了結果。我的硬件規格是:

>> ginfo 
Jacket v2.2 (build 77be88c) by AccelerEyes (64-bit Windows) 
License: Standalone (C:\Program Files\AccelerEyes\Jacket\2.2\engine\jlicense.dat) 
Addons: MGL16, JMC, SDK, DLA, SLA 
CUDA toolkit 4.2, driver 4.2 (296.10) 
GPU1 GeForce GT 540M, 2048 MB, Compute 2.1 (single,double) 
Display Device: GPU1 GeForce GT 540M 
Memory Usage: 1697 MB free (2048 MB total) 

CPU是Intel Core i7-2630QM。

我得到那件夾克在CPU的FIND功能上達到〜3X加速。下面是我使用的基準代碼:

% time Jacket vs CPU 
for n = 5:12; 
    x(n) = 2^n; 
    Ac = single(rand(x(n))); 
    Ag = gsingle(Ac); 
    t_cpu(n) = timeit(@() find(Ac > 0.5)); 
    t_gpu(n) = timeit(@() find(Ag > 0.5)); 
end 

% plot results 
plot(x, t_cpu ./ t_gpu); 
xlabel('Matrix Edge Size', 'FontSize', 14); 
ylabel('Jacket (GPU) Speedup over CPU', 'FontSize', 14); 

下面是這段代碼運行的結果:

Jacket (GPU) Speedup over CPU

我敢肯定BWLABEL和REGIONPROPS按外殼支持的功能也非常快,但你可能能夠通過查找上面的基準找到自己。

+0

我再次陷入愚蠢的想法,餵養gpu的小塊信號,達到50x50大小,並認爲這將解決它更好。所以通過計算多次[idx idy] = find(gdouble(m)> threshold);'其中m是一個連續獲得的10x10到​​50x50的信號矩陣,我使用的是'timeit'時間,每個迭代的迭代速度慢5-20倍......相反,累積一個更大的矩陣確實顯示出因子3的改進(我使用gdouble一次)。對不起,我的愚蠢,再次感謝... – bla

相關問題