MATLAB:使用大型数据集进行parfor循环冻结

时间:2017-10-01 03:27:20

标签: matlab for-loop parallel-processing freeze

我在 * Extract data, month, and year. compute day = number(char.substr(...),F2.0). compute month = number(char.substr(...),F2.0). compute year = number(char.substr(...),F4.0). * Compute date variable. compute Version = date.mdy(month,day,year). formats Version (adate10). execute. 循环中处理了大量图片。

图像集大约有1000个图像,parfor循环工作得很好,如果我只在它的一小部分(100左右)上运行它,但当我在整个集合上运行它时,它会冻结MATLAB (物理内存接近96%,CPU降至0-1%)。

我是parfor循环的新手,我敢肯定我是以一种不聪明的方式做这件事。

必须有一种方法可以运行它,我不必在每个parfor次迭代中加载完整的imageset

parfor

我猜测MATLAB正在创建完整imageset=load(imagefile); parfor i = 1:length( imageset ) imagesetP = imageset; image = imagesetP(:,:,i); % bunch of functions performed on an image; end 的多个版本,这会占用太多内存并冻结。

不知道为什么当我在较小的子集上运行时不会出现这种情况 ( imageset )。

我认为有一些东西比分裂它更好:

parfor i = length( imageset ) / 10

2 个答案:

答案 0 :(得分:2)

imageset变量的大小/类型是多少?如果它是一个3D数字数组,它可能只是为了确保您slice但不要广播数组,即

imageset=load(imagefile);

parfor i = 1:length( imageset )
    image = imageset(:,:,i);
    % ...  
end

如果您在循环内没有索引的情况下访问它,则数组broadcast进入parfor循环。这会导致在每个worker上创建一个数组副本。

答案 1 :(得分:-2)

  

序幕
关于Edric的反对意见: OP&#39; < strong>代码表示将使用1000名工人。 正确,这些信息不包含在MATLAB代码中,但是这个本地环境存储在里面另一个地方,集群配置文件(正如本文底部明确说明的那样)

该帖子的其余部分将保持不变,以证明过度订阅资源的问题如同可能。奥术鹰队可能会用心脏替代术语&#34; 1000&#34;使用&#34;几个&#34;。
不考虑底层架构的用户可能类似地(并且确实)试图在仅仅2通道内存子系统中移动4数据流流或付费零注意缓存友好索引,(非)​​合并的内存访问模式,并可能会提出类似的问题,而不试图支付应有的兴趣和适当关心非统一内存架构如何实际工作。
并行代码执行是一种非常精细的利用和平衡技术{multi- |许多 - } - 核心CPU资源+实际缓存 - 层次结构+物理内存 - 子系​​统架构功能,如果一个人努力获得更高的性能,而不是只需输入SLOC的语法选项。

这不是冻结,

这是在MATLAB并行池中同时运行~1000个进程的显式指令的结果,这在语法上是正确的,但除非有人操作具有1000多个CPU内核的系统,否则操作系统会发疯尽一切可能公平地安排所有O / S内核+用户空间进程以及那些新请求的MATLAB处理的1000多个并行池复制品。

结果?一个完全一致的交通问题(除非1000+ CPU主机/操作系统)

(+通过所有相关的上下文切换,移动内存工作集增加,交换得像地狱......不用告诉你在桌面上看到的故事)

解?

不要&#34;过度订阅&#34;任何&#34;长&#34; - 和&#34;密集&#34;计算任务的资源

为什么呢? &#34;只是&#34; - [CONCURRENT] - 调度将立即停止提供任何可能被视为非负载系统状态的方便,其中资源共享有足够的备用容量,以便有效地掩盖共享成本和所有上下文切换附加开销(而任何&#34;胖&#34; -calculus肉将总是增加开销,并将几乎 - &#34;冻结&#34;,如果过载水平如上所述那么狂野。

鉴于实际上并不需要以真正的 [PARALLEL] 调度方式执行代码,而是(假定遗嘱)一次运行多个任务纯粹[SERIAL]时尚,而不是尝试使用硬件容量感知设置,类似:

M = 3;                                 %%% M: specifies maximum number of workers
parfor ( i = 1:length( imageset ), M ) %%% M < parcluster('local').NumWorkers;
       %% whatever bunch of functions performed in [SEQ] schedule on an image;
       %% 

确实有HPC处理的其他步骤和措施,超出了这篇文章。通常的做法是在HPC平台上禁用HT线程切换,以消除耗尽的L1 / L2 / L3伪像,并使所有CPU核心平滑地驱动连续,不间断的处理流。

feature('numcores')
MATLAB detected: 4 physical cores.
MATLAB detected: 8 logical cores.
MATLAB was assigned: 8 logical cores by the OS.
MATLAB is using: 4 logical cores.
MATLAB is not using all logical cores because hyper-threading is enabled.

ans =

       4
相关问题