【问题标题】:How to convert radix sort serial code to parallel code in Matlab?如何在 Matlab 中将基数排序串行代码转换为并行代码?
【发布时间】:2016-03-19 08:27:01
【问题描述】:

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

【问题讨论】:

    标签: matlab parallel-processing radix-sort serial-processing


    【解决方案1】:

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

    据我了解您的代码,使用并行计算工具箱并行化它不是正确的选择。假设您修复了变量索引,you will probably end up with code beeing slower。这通常是在进行简单计算时,parfor 的开销浪费的时间比您可能节省的时间要多。

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

    代替

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

    用途:

    X=cumsum(X);
    

    【讨论】:

    • 感谢您的回复。cumsum函数也很棒。您说使用并行计算工具箱并行化它不是正确的选择,您有什么建议并行化它。我需要创建吗?从零开始的算法?。我认为必须有一种方法可以通过使用任何方法来克服。
    • 要获得快速运行的代码,您可以优化您的 m 代码或选择在 c 中实现它并通过 mex 使其可用。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2022-12-30
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多