【问题标题】:Why does arrayfun only use a single core?为什么arrayfun只使用单核?
【发布时间】:2017-06-14 11:08:01
【问题描述】:

我试着估计

% matlabpool open 2; % line 1
tic; arrayfun(@(x) sum(sum(rand(1000))), [1 : 100]); toc;
Elapsed time is 4.070030 seconds.

当我取消注释第一行以便创建一个由 2 个工作人员组成的池时,我得到了相同的时间结果。

为什么某些明显的系统功能不会自动在并行模式下执行? 当我们并行运行时,Matlab 是否有任何类似于 GPU 的 arrayfun 函数?

【问题讨论】:

    标签: matlab parallel-processing gpu


    【解决方案1】:

    在调用arrayfun 之前调用matlabpool 并没有提高速度的原因是,仅仅创建多个worker 的行为并不能让所有代码利用这些worker执行计算。如果你想利用工人池,你需要用parfor显式并行化你的代码(相关信息here)。

    parfor k = 1:10
        result{k} = sum(sum(a*b));
    end 
    

    一般来说,arrayfun做任何并行化或加速。事实上,它通常比简单地写出for 循环要慢,因为显式for 循环允许更好的JIT 加速。

    for k = 1:10
        result(k) = sum(sum(a * b));
    end
    

    如果您想使用 GPU 执行您展示的操作,如果 arrayfun 的输入数据是 gpuarray,那么它将在 GPU 上执行(使用 distributed version of arrayfun)。但问题是在 GPU 上使用arrayfun 必须 执行的任何操作都只能是元素操作,以便每个元素的操作独立于所有其他元素的操作(使其可并行化) .在您的情况下,它不是元素操作,因此不能使用arrayfun 的 GPU 版本。

    作为旁注,您需要使用 parpool 而不是 matlabpool,因为后者已被弃用。

    【讨论】:

    • 谢谢。我是否正确理解 GPU 仅适用于大型数组和简单操作(例如 .+、.-、.*、./)的速度非常快?不是所有来自mathworks.com/help/distcomp/… 的操作对于gpu 来说都很快?
    • @user7484269 不,所有这些功能都可以通过 GPU 加速,我明确指的是arrayfun。只有arrayfun 可以执行元素操作。但是,在计算之前将数据移动到 GPU 时,开销并不大。
    • 好的,再次感谢。作为本主题的最后一个问题:在使用 Matlab 时,您使用 gpu 实现的平均时间加速是多少?
    • @user7484269 这完全取决于数据的大小和操作。
    • 好的,如果我理解正确,“标记”我检查了你的答案。但是你对 GPU 的大概加速范围呢?
    【解决方案2】:

    Core MATLAB 确实使用线程和向量运算,但您必须自己对代码进行向量化。例如,对于您的示例,您需要编写

    A = rand(1000, 1000, 100);
    B = sum( sum( A, 1 ), 2 );
    

    B 现在是总和的 1×1×100 数组。我使用了两个总和来帮助您了解发生了什么,如果您实际上想要对矩阵中的每个数字求和,您可以使用sum(A(:)),或者对于这个批处理示例,sum( reshape(A, [], 100) )

    对于任务并行而不是数据并行,请使用 parforbatchparfeval 或其他一些并行指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2023-04-06
      • 2017-02-01
      • 2013-03-16
      • 2010-12-20
      • 2015-01-03
      • 2014-07-01
      相关资源
      最近更新 更多