【发布时间】: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