我如何 'tell' 每个 CPU 核心在 MATLAB 中做什么?
How can I 'tell' each CPU core what to do in MATLAB?
而不是 parfor
循环我想创建 4 个线程并分别为每个线程写出代码。它的语法是什么?
我建议使用 Edric 的答案或 this 解决方案
(我在这里留下答案以供评论。)
忘掉核心吧,你想在你的工作进程之间分配你的任务。
简单"hack"解决方案:
n=4
result=cell(4,1)
parfor idx=1:n
switch idx
case 1
r=f()
case 2
r=g(1)
case 3
r=g(2)
case 4
r=h()
end
result{idx}=r
end
对于更高级的解决方案,我建议创建单独的作业并提交它们。对此有详细解释here。在您的情况下,您创建了一个包含四个任务的作业,然后提交它。此解决方案的最大优点是,您可以避免不必要的变量广播。
在这两种解决方案中,您都无法控制哪个工作人员处理哪个任务,但您通常不想这样做。
这里有两种选择。第一种是使用 parfeval
,您可以在其中请求多个独立的函数求值,如下所示:
% The following line executes
% out = a(a1, a2, a3) on a worker. (The number 1 is the
% the number of outputs requested from the function evaluation)
% The results can be obtained using
% out = fetchOutputs(f_a);
f_a = parfeval(@a, 1, a1, a2, a3);
% and so on...
f_b = parfeval(@b, 1, b1, b2);
f_c = parfeval(@c, 1, c1);
f_d = parfeval(@d, 1, d1, d2);
您可以使用 fetchOutputs(f_a)
等检索结果。
另一种选择是像这样使用 spmd
:
spmd
switch labindex
case 1
a();
case 2
b();
...
end
end
一般来说,对于独立任务,我会建议 parfeval
,因为这种方法不依赖于并行池中的工作人员数量,而 spmd
方法是。
而不是 parfor
循环我想创建 4 个线程并分别为每个线程写出代码。它的语法是什么?
我建议使用 Edric 的答案或 this 解决方案
(我在这里留下答案以供评论。)
忘掉核心吧,你想在你的工作进程之间分配你的任务。
简单"hack"解决方案:
n=4
result=cell(4,1)
parfor idx=1:n
switch idx
case 1
r=f()
case 2
r=g(1)
case 3
r=g(2)
case 4
r=h()
end
result{idx}=r
end
对于更高级的解决方案,我建议创建单独的作业并提交它们。对此有详细解释here。在您的情况下,您创建了一个包含四个任务的作业,然后提交它。此解决方案的最大优点是,您可以避免不必要的变量广播。
在这两种解决方案中,您都无法控制哪个工作人员处理哪个任务,但您通常不想这样做。
这里有两种选择。第一种是使用 parfeval
,您可以在其中请求多个独立的函数求值,如下所示:
% The following line executes
% out = a(a1, a2, a3) on a worker. (The number 1 is the
% the number of outputs requested from the function evaluation)
% The results can be obtained using
% out = fetchOutputs(f_a);
f_a = parfeval(@a, 1, a1, a2, a3);
% and so on...
f_b = parfeval(@b, 1, b1, b2);
f_c = parfeval(@c, 1, c1);
f_d = parfeval(@d, 1, d1, d2);
您可以使用 fetchOutputs(f_a)
等检索结果。
另一种选择是像这样使用 spmd
:
spmd
switch labindex
case 1
a();
case 2
b();
...
end
end
一般来说,对于独立任务,我会建议 parfeval
,因为这种方法不依赖于并行池中的工作人员数量,而 spmd
方法是。