Как преобразовать последовательный код радикальной сортировки в параллельный код в 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);
Другие вопросы по тегам