Я хотел бы найти ненулевые элементы после максимально возможного использования порога на матрице. Имея в виду CUDA \ Jacket, я узнал, что это намного медленнее, чем «регулярная» версия matlab find, из-за проблем с распределением памяти, поскольку размер вывода неизвестен до функции find. Однако использование «bwlabel» и «regionprops» (оба поддерживаются в Jacket) действительно дает информацию об ненулевых элементах и намного быстрее, чем встроенные в Matlab функции Image Processing Toolbox. Есть ли способ использовать это для получения ненулевых элементов? вместо этого есть способ сделать некоторую обработку на каждом из меченых объектов, которые найдены с помощью bwlabel?Вывод выражения Matlab с использованием CUDA Jacket, или существует ли параллельный способ поиска ненулевых матричных элементов?
ответ
По моему опыту реализация 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);
Вот результаты выполнения этого кода:
Я уверен, что BWLABEL и REGIONPROPS функции, поддерживаемые Jacket, также очень быстро, но вы, возможно, сможете обойтись с FIND, учитывая приведенные выше тесты.
Я смущенно снова упал в глупую мысль о подаче маленьких блоков сигнала gpu размером до 50x50 и думал, что это решит его лучше. Поэтому, вычисляя много раз [idx idy] = find (gdouble (m)> threshold); где m - матрица сигналов 10x10-50x50, которая получается серийно, я использовал время «timeit», которое было в 5-20 раз медленнее на каждую итерацию ... Вместо этого накопление большей матрицы действительно показывает улучшение фактора 3 (и я использую gdouble один раз). Извините за мою глупость, и еще раз спасибо ... – bla
@nate, можете ли вы опубликовать код того, что вы делаете и как вы сравниваете? find - одна из более быстрых функций в Jacket, и у вас не должно быть никаких проблем. Также укажите, используете ли вы разреженные матрицы. –
@pavan, см. Мой ответ на gpu ниже. Куртка прекрасна, пока вы кормите ее достаточно большими матрицами. Я как-то забыл об этом ... – bla