Я вычисляю большое количество гистограмм RGB. Мне нужно использовать явные петли для этого. Поэтому вычисление каждой гистограммы занимает заметное время. По этой причине использование параллельных вычислений имеет смысл. В Октаве есть (экспериментальная) функция parcellfun, написанная Ярославом Гаеком, которая может быть использована для этого.
Мой первоначальный цикл
histograms = zeros(size(files,2), bins^3);
% calculate histogram for each image
for c = 1 : size(files,2)
I = imread(fullfile(dir, files{c}));
h = myhistRGB(I, bins);
histograms(c, :) = h(:); % change to 1D vector
end
Чтобы использовать parcellfun, мне нужно изменить тело моего цикла в отдельную функцию.
function histogram = loadhistogramp(file)
I = imread(fullfile('.', file));
h = myhistRGB(I, 8);
histogram = h(:); % change to 1D vector
end
, то я могу назвать это как этот
histograms = parcellfun(8, @loadhistogramp, files);
Я сделал небольшой тест на моем компьютере. Это 4 физических ядра с поддержкой Intel HyperThreading.
Мой исходный код
tic(); histograms2 = loadhistograms('images.txt', 8); toc();
warning: your version of GraphicsMagick limits images to 8 bits per pixel
Elapsed time is 107.515 seconds.
С parcellfun
octave:1> pkg load general; tic(); histograms = loadhistogramsp('images.txt', 8); toc();
parcellfun: 0/178 jobs donewarning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
warning: your version of GraphicsMagick limits images to 8 bits per pixel
parcellfun: 178/178 jobs done
Elapsed time is 29.02 seconds.
(Результаты параллельного и последовательного варианта были одинаковы (только транспонированная).
octave:6> sum(sum((histograms'.-histograms2).^2))
ans = 0
Когда я повторил это несколько раз, время работы было почти одинаковым все время. Параллельная версия была runni нг около 30 секунд (+ - приблизительно 2с) с обоими 4, 8, а также 16 подпроцессов)
Если эта функция (особенность) октавных ISN? «Хорошо документировано, это может быть не такая хорошая идея. –
Здесь они утверждают, что это особенность Octave: http://octave.sourceforge.net/parallel/ Но, похоже, это не хорошо документировано. – db1234
Предположительно вы пытаетесь использовать параллельность для повышения производительности; если это так, вы не хотите использовать для циклов в последовательном * или * параллельно, так как для циклов в Octave (а IDL и, в меньшей степени, Matlab) медленный медленный медленный. –