【问题标题】:MatLab Parallel computing toolbox: using more cores for same taskMatLab 并行计算工具箱:为同一任务使用更多内核
【发布时间】:2020-08-27 05:19:54
【问题描述】:

我有一台具有 4 个物理内核的笔记本电脑和 MatLab 并行计算工具箱。我需要执行两个独立的任务(真的很昂贵,比如说计算一个密集的大矩阵的最大特征值)。

所以,我想通过以下方式将任务分配给我的核心:

  • 第一个任务有 2 个核心
  • 第二个任务有 2 个核心

但我真的无法理解/找到如何在 MatLab 代码中设置它。

经过大量搜索,我发现我应该使用spmd,但我在文档中找不到允许我使用2 个核心来完成同一任务的合适示例。

非常感谢 MatLab 中的任何最小工作示例!

在丹尼尔发表评论后编辑: 在创建了 4 个工作人员的并行池后,我可以这样做:

 spmd
     if labindex == 1 
        %first worker, do something             
     elseif labindex == 2
         %second worker, do sometihng
     end   
 end

编辑(2)

我可以设置NumThreads=2,所以每个工人会做两个任务(对吧?)。现在的问题是:我是否必须用 4 个工人创建一个 parpool,所以每个工人做 2 个线程?更明确地说:

parpool(4); %set NumThreads = 2 via Parallel computing toolbox %define matrix A1, A2 of size 1000x1000 parfor i=1:2 x(i) = max(abs(eigs(A(i)))); end

我现在希望前两个内核在 x(1) 上工作,而另外两个在 x(2) 上工作


最后编辑

使用 cmets 中所写的 parfor,我会这样做:

c = parcluster('local');
A = {rand(2000), rand(2000),rand(2000), rand(2000),rand(2000), 
rand(2000),rand(2000),rand(2000)};
c.NumThreads = 2;
pool = parpool(c, 2); %2 workers
parfor i=1:8
   x(i) = max(abs(eig(A{i})));
end

【问题讨论】:

  • 你说的是相当高级的并行代码。让 一些 核心协作而其他核心不协作并非易事。您可能需要有针对性的消息传递和信号传递。也许您可以通过精心设计的parfor 来做到这一点。
  • @AnderBiguri afaik,这应该可以通过spmd 命令实现。你知道如何用 parfor 做到这一点吗?会很棒!
  • 首先忽略 2 个核心,您能否使用 spmd 将代码分发给 2 个工作人员?
  • @Daniel 是的,我已经用我的能力编辑了我的答案
  • @Daniel 我刚刚根据您的建议编辑了我的帖子。你认为我错过了什么吗?

标签: matlab parallel-processing distributed-computing spmd


【解决方案1】:

从各种 cmets 开始,如果您设置 cluster object's NumThreads 属性,那么您启动的每个工作人员都将使用该数量的计算线程。您可以通过Cluster Profile Manager 或以编程方式执行此操作。

当你启动parpool时,你指定的数字就是你要启动的worker进程的数量,每个worker都会有对应集群对象的NumThreads属性的线程数.

综合起来,我们得到:

% Use the local cluster
c = parcluster('local');
% Make 2 'A' matrices
A = {rand(2000), rand(2000)};
for numThreads = 1:2
    % Set up cluster NumThreads property for this iteration
    c.NumThreads = numThreads;
    % Build a pool with 2 worker processes
    pool = parpool(c, 2);
    tic
    spmd
        % Each worker operates on a separate element of A
        out = max(abs(eig(A{labindex})));
    end
    t = toc();
    fprintf('Time with NumThreads = %d: %.3f\n', numThreads, t);
    delete(pool);
end

在我的机器上,相关的时间是:

Time with NumThreads = 1: 4.693
Time with NumThreads = 2: 3.636

【讨论】:

  • 谢谢!我有两个问题。首先,由于我有 4 个物理内核,并且在您的代码中使用 2 个工作人员,那么说每个工作人员是由 2 个内核“制造”是否正确?
  • 另外,我想知道在以下情况下该怎么做:假设我有 8 个矩阵(又是 4 个核心)。因为labindex 只假设两个值,所以在spmd 中我将只计算两个光谱半径。在这种情况下,没有办法使用spmd来完成任务,所以我应该使用parfor,对吧?
  • 是的,当集群NumThreads为2时,那么每个worker进程各有2个线程。如果您的矩阵比内核多,parfor 可能是更好的选择。 (您可能会发现使用NumThreads == 1 会更好 - 值得测试)
  • 非常感谢,我学到了很多。最后一件事:我在关于 8 个矩阵的计算的问题中添加了一个编辑。我写了parfor 循环,请您确认一下是否正确?我的意思是,通过这种方式,我使用 2 个核心来计算每个矩阵的每个光谱半径,对吗?
  • 是的,没错,2个工作进程,每个进程有2个计算线程。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多