7

你会认为这将是一个简单的问题,但我找不到解决方案。采取以下循环:

A = zeros(1,10000000);
parfor i = 1:length(A)
    A(i) = i;
end

这仅在我的计算机上的单个内核上运行,尽管它很容易并行化(或者至少应该是并行化的)。我正在使用 Matlab 2012b,我尝试查找有关如何创建并行循环的文档,但找不到任何文档(matlab 文档仅显示了如何创建这些循环的示例,而不是如何实际并行运行它们)。

我已经尝试查找如何修改并行计算工具箱设置,但它们都不起作用,因为它们都适用于 Matlab 2013(我使用的是 2012b)。如果有人可以提供一个实际并行运行的简单、可并行循环的示例,我将不胜感激!

注意:我已经检查并安装了并行计算工具箱,尽管我无法知道它是否已启用或如何启用它,因为文档似乎没有为我的版本提供答案(我输入preferences进入命令提示符但在那里没有看到它)。

编辑:我通过这样做使它工作:

matlabpool('open',4);
A = zeros(1,10000000);
parfor i = 1:length(A)
    A(i) = i;
end
matlabpool('close');

...但我真的不知道为什么会这样,我是否每次都关闭池,池实际上是什么(我已经阅读了文档,仍然不明白),以及matlabpoolparpool.. .

4

3 回答 3

2

就像我在评论中所说的那样,您需要启动 MATLAB 工作程序:

matlabpool open N

parpool命令替换了matlabpoolR2013b 版本中的命令。该命令创建了许多本地工作程序(假设您的默认集群是local配置文件),它们只是在没有 GUI 的情况下运行的 MATLAB.exe 进程,它们执行部分并行化代码,例如您的parfor循环。

于 2013-10-02T06:45:38.823 回答
1

不需要关闭池。在某些情况下,您可能希望将其保持打开以供以后重复使用(因为打开也需要一些时间)。测试零池大小有助于决定是否需要打开新的 matlabpool:

A = zeros(1,10000000);
if matlabpool('size') == 0 
   matlabpool('open',4) ;
end
parfor i = 1:length(A)
    A(i) = i;
end
于 2013-10-02T21:06:49.207 回答
1

由于从 更改matlabpoolparpool,有一种更简单的方法来创建池。与 不同parpool的是,如果池已经存在,它不会抛出错误。只需调用gcp(代表“获取当前池”)。

gcp();
A = zeros(1,10000000);
parfor i = 1:length(A)
    A(i) = i;
end

始终保持游泳池开放是一种很好的做法;这只是确保它在您需要时打开。

于 2014-10-03T19:28:15.847 回答