0

我有一台有 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)


最后编辑

使用parfor评论中写的 a ,我会这样做:

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
4

1 回答 1

2

根据各种评论,如果您设置集群对象的 NumThreads属性,那么您启动的每个工作人员都将使用该数量的计算线程。您可以通过Cluster Profile Manager或以编程方式执行此操作。

当你启动parpool时,你指定的数字就是你要启动的工作进程的数量,每个工作人员都会有多个线程对应集群对象的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
于 2020-05-12T05:53:11.240 回答