我在 * 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
答案 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多个并行池复制品。
(+通过所有相关的上下文切换,移动内存工作集增加,交换得像地狱......不用告诉你在桌面上看到的故事)
不要&#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