MatLab 并行计算工具箱:为同一任务使用更多内核



我有一台有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,我会做:

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

根据各种注释,如果设置群集对象的NumThreads属性,则启动的每个工作线程都将使用该数量的计算线程。您可以通过群集配置文件管理器或以编程方式执行此操作。

启动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: %.3fn', numThreads, t);
delete(pool);
end

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

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