Multithreading 我怎么能';告诉';每个CPU核心在MATLAB中做什么?

Multithreading 我怎么能';告诉';每个CPU核心在MATLAB中做什么?,multithreading,matlab,optimization,parallel-processing,Multithreading,Matlab,Optimization,Parallel Processing,我想创建4个线程并分别写出每个线程的代码,而不是parforloop。语法是什么?我建议使用Edric的答案或解决方案 (我在这里留下答案供评论。) 忘记核心,您希望在工作进程之间分配任务 简单的“黑客”解决方案: 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)

我想创建4个线程并分别写出每个线程的代码,而不是
parfor
loop。语法是什么?

我建议使用Edric的答案或解决方案

(我在这里留下答案供评论。)

忘记核心,您希望在工作进程之间分配任务

简单的“黑客”解决方案:

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
对于更高级的解决方案,我建议创建单个作业并提交它们。对此进行了详细解释。在本例中,您创建了一个包含四个任务的作业,然后提交它。此解决方案的最大优点是,可以避免不必要的变量广播


在这两种解决方案中,您无法控制哪些工作人员处理哪些任务,但您通常不想这样做。

这里有两个选项。第一种方法是在可以请求几个独立函数求值的地方使用,如下所示:

% 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
方法则是。

您真的想控制哪个线程在哪个核上运行吗?在matlab中使用并行计算,您通常会在工作线程之间分配作业,而不是指定哪个或多少个内核来完成作业。@Daniel46好吧,我有4件不同的事情要独立完成,所有4件事情都需要相同的时间,我能不能将它们分配到4个内核上?或者假设我有3件不同的事情要并行完成,我该怎么做呢?好吧,它是有效的,但结果证明我的问题不足以从中受益,无论如何谢谢你!我相信改天我会用这个黑客。顺便说一下,
result{idx}=r
应该在
开关之外,对吗?在
结束后
Ah,修复结果。在使用并行计算工具箱时,请记住它使用通过(本地主机)网络连接的进程间通信。这取决于增加了大量开销的问题。这是一个不可取的解决方案,因为您假设每个工人都将获得一次要操作的
parfor
循环的迭代-这不是保证的情况。@Edric:没错,两种解决方案都使用工人之间的作业自动分配。使用
parfeval
的解决方案也是如此。这不太正确
parfor
出于效率的考虑,对迭代进行批处理,而
parfeval
则没有。我不清楚如何将变量传递给
parfeval
中的那些句柄函数。我在
parfeval
示例中添加了更多的解释-我链接到的文档页面中也有这些内容。