MatLab 并行计算工具箱:使用更多核心完成相同任务

MatLab Parallel computing toolbox: using more cores for same task

我有一台带 4 物理 内核的笔记本电脑,以及 MatLab 并行计算工具箱。我需要执行两个独立的任务(非常昂贵,假设要计算密集的大型矩阵的最大特征值)。

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

但我真的不会 understand/find 如何在 MatLab 代码中设置它。

经过大量搜索后,我知道我应该使用 spmd,但我在文档中找不到合适的示例,允许我使用 2 个核心任务

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

在 Daniel 发表评论后进行编辑: 在创建一个由 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,我会做:

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

根据各种评论,如果您设置 cluster object's NumThreads property, then each worker you launch will use that number of computational threads. You can do this through the 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