2012-08-25 1 views
3

Я хотел бы найти ненулевые элементы после максимально возможного использования порога на матрице. Имея в виду CUDA \ Jacket, я узнал, что это намного медленнее, чем «регулярная» версия matlab find, из-за проблем с распределением памяти, поскольку размер вывода неизвестен до функции find. Однако использование «bwlabel» и «regionprops» (оба поддерживаются в Jacket) действительно дает информацию об ненулевых элементах и ​​намного быстрее, чем встроенные в Matlab функции Image Processing Toolbox. Есть ли способ использовать это для получения ненулевых элементов? вместо этого есть способ сделать некоторую обработку на каждом из меченых объектов, которые найдены с помощью bwlabel?Вывод выражения Matlab с использованием CUDA Jacket, или существует ли параллельный способ поиска ненулевых матричных элементов?

+0

@nate, можете ли вы опубликовать код того, что вы делаете и как вы сравниваете? find - одна из более быстрых функций в Jacket, и у вас не должно быть никаких проблем. Также укажите, используете ли вы разреженные матрицы. –

+0

@pavan, см. Мой ответ на gpu ниже. Куртка прекрасна, пока вы кормите ее достаточно большими матрицами. Я как-то забыл об этом ... – bla

ответ

2

По моему опыту реализация FIND, поддерживаемая Jacket, очень быстрая, по крайней мере, для матриц размером более 300x300 или около того. Я протестировал это на своем ноутбуке и поделился результатами в дальнейшем. Мои спецификации HW:

>> 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) 

Процессор - это Intel Core i7-2630QM.

Получаю, что куртка достигает ~ 3X ускорений на функции FIND над процессором. Вот код тестов я использовал:

% 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 функции, поддерживаемые Jacket, также очень быстро, но вы, возможно, сможете обойтись с FIND, учитывая приведенные выше тесты.

+0

Я смущенно снова упал в глупую мысль о подаче маленьких блоков сигнала gpu размером до 50x50 и думал, что это решит его лучше. Поэтому, вычисляя много раз [idx idy] = find (gdouble (m)> threshold); где m - матрица сигналов 10x10-50x50, которая получается серийно, я использовал время «timeit», которое было в 5-20 раз медленнее на каждую итерацию ... Вместо этого накопление большей матрицы действительно показывает улучшение фактора 3 (и я использую gdouble один раз). Извините за мою глупость, и еще раз спасибо ... – bla

 Смежные вопросы

  • Нет связанных вопросов^_^