-1

我对并行编程很感兴趣。我写了一个串行基数排序算法。现在我想将其转换为并行算法。为了将其转换为并行,我可以应用什么方法?当我尝试应用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
4

1 回答 1

1

使用时,parfor您应该阅读有关变量分类的内容。对于切片变量C,迭代i只能访问C(i)(简化)。在您的情况下,您的循环迭代之间存在依赖关系,一个从前一个读取数据。这使得一个parfor不可能。

据我了解您的代码,使用并行计算工具箱并行化它不是正确的选择。假设您修复了变量索引,您可能最终会遇到代码变慢的情况。这通常是在进行简单计算时,那么parfor浪费的时间比您可能节省的时间要多。

要提高代码的性能,请查看矢量化或合适的内置函数。

代替

for i = 2:11
    X(i) = X(i) + X(i-1);
end

利用:

X=cumsum(X);
于 2015-12-13T23:14:58.983 回答