Как преобразовать последовательный код радикальной сортировки в параллельный код в Matlab?
Я заинтересован в параллельном программировании. Я написал последовательный алгоритм сортировки по основанию. Теперь я хочу преобразовать его в параллельный алгоритм. Какую методологию я могу применить к нему, чтобы преобразовать его в параллель? Когда я пытался подать заявку parfor
вместо for
Я получил ошибку: "допустимые индексы для" C "ограничены в циклах PARFOR". Как это можно преодолеть?
Вот код, который я написал:
function array = radixSort(array)
maxx = max(array);
base = 1;
while maxx/base > 0
array = counting_sort(array,base);
base = base * 10;
end
function W = counting_sort(array,base)
X = zeros(1,11);
W = zeros(1,numel(array));
for j = 1:numel(array)
X(rem(floor(array(j)/base),10)+1) = X(rem(floor(array(j)/base),10)+1) + 1;
end
for i = 2:11
X(i) = X(i) + X(i-1);
end
for j = numel(array):-1:1
W(X(rem(floor(array(j)/base),10)+1)) = array(j);
X(rem(floor(array(j)/base),10)+1) = X(rem(floor(array(j)/base),10)+1) - 1;
end
end
end
1 ответ
Когда используешь parfor
Вы должны прочитать о классификации переменных. Для нарезанной переменной C
итерация i
может только доступ C(i)
(Упрощенный). В вашем случае у вас есть зависимости между итерациями вашего цикла, один из которых читает данные из предыдущего. Это делает parfor
невозможно.
Насколько я понял ваш код, распараллеливать его с помощью инструментария параллельных вычислений - неправильный выбор. Предполагая, что вы исправили свои переменные индексы, вы, вероятно, будете работать с кодом медленнее. Обычно это происходит при простых вычислениях, а затем parfor
тратит больше времени, чем вы можете сэкономить.
Чтобы улучшить производительность вашего кода, вместо этого взгляните на векторизацию или подходящие встроенные функции.
Вместо
for i = 2:11
X(i) = X(i) + X(i-1);
end
Использование:
X=cumsum(X);