我正在使用MATALB parfor
进行并行计算。代码结构看起来非常像
%%% assess fitness %%%
% save communication overheads
bitmaps = pop(1, new_indi_idices);
porosities = pop(2, new_indi_idices);
mid_fitnesses = zeros(1, numel(new_indi_idices));
right_fitnesses = zeros(1, numel(new_indi_idices));
% parallelization starts
parfor idx = 1:numel(new_indi_idices) % only assess the necessary
bitmap = bitmaps{idx};
if porosities{idx}>POROSITY_MIN && porosities{idx}<POROSITY_MAX
[mid_dsp, right_dsp] = compute_displacement(bitmap, ['1/' num2str(PIX_NO_PER_SIDE)]);
mid_fitness = 100+mid_dsp;
right_fitness = 100+right_dsp;
else % porosity not even qualified
mid_fitness = 0;
right_fitness = 0;
end
mid_fitnesses(idx) = mid_fitness;
right_fitnesses(idx) = right_fitness;
fprintf('Done.\n');
pause(0.01); % for break
end
我遇到了以下奇怪的错误。
Error using parallel.internal.pool.deserialize (line 9)
Bad version or endian-key
Error in distcomp.remoteparfor/getCompleteIntervals (line 141)
origErr =
parallel.internal.pool.deserialize(intervalError);
Error in nsga2 (line 57)
parfor idx = 1:numel(new_indi_idices) % only assess the necessary
我该如何解决?快速Google搜索无法解决问题。
更奇怪的是,以下代码段在完全相同的设置和相同的HPC下完美运行。我认为它们之间可能存在一些微妙的差异,导致一个工作而另一个工作失败。工作片段:
%%% assess fitness %%%
% save communication overheads
bitmaps = pop(1, new_indi_idices);
porosities = pop(2, new_indi_idices);
fitnesses = zeros(1, numel(new_indi_idices));
% parallelization starts
parfor idx = 1:numel(new_indi_idices) % only assess the necessary
bitmap = bitmaps{idx};
if porosities{idx}>POROSITY_MIN && porosities{idx}<POROSITY_MAX
displacement = compute_displacement(bitmap, ['1/' num2str(PIX_NO_PER_SIDE)]);
fitness = 100+displacement;
else % porosity not even qualified
fitness = 0;
end
fitnesses(idx) = fitness;
%fprintf('Done.\n', gen, idx);
pause(0.01); % for break
end
pop(3, new_indi_idices) = num2cell(fitnesses);
怀疑[mid_dsp, right_dsp] = compute_displacement(bitmap, ['1/' num2str(PIX_NO_PER_SIDE)]);
会给我带来麻烦,我将其替换为
mid_dsp = rand();
right_dsp = rand();
然后,它的作品!这证明这确实是由这条特定的线引起的。但是,我确实已经测试了这个函数,它正确地返回了两个数字!由于函数返回值就像rand()
那样,我看不出任何区别。这让我更加困惑。
答案 0 :(得分:1)
我遇到了同样的问题,Matlab 2015为parfor中的每个循环保留了所有必要的内存资源,导致内存中断不足。 错误消息很棘手。在微调循环中的代码并通过Windows 10中的Pagefile中的系统设置从SSD提供120GB的RAM后,parfor执行得非常好。
答案 1 :(得分:0)
在我自己的类似代码块上工作了一段时间之后,我认为这实际上是一个内存问题。
当我将工作人员数量设置为高时,我正在使用6核4GHz CPU和8 GB RAM并且看到了这个问题(在MATLAB 2014b上),并且没有任何低工人数的问题。
当我使用6个或更多工作者时(我知道这不是理想的),内存消耗很高,而且这个错误消息偶尔会弹出。此外,我在测试中看到了各种内存不足错误。
到目前为止,当我使用5个或更少的工作程序时,我还没有看到错误,我很确定一些内存限制(可能在java代码块中)通过阻止某些结果的完整性(或存在)导致此问题)
希望您可以通过减少工人数量来解决此问题。