9

我正在使用 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

我应该如何解决它?快速的谷歌搜索没有返回任何解决方案。

更新 1

更奇怪的是,以下代码片段在完全相同的设置和相同的 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);

更新 2

怀疑会给[mid_dsp, right_dsp] = compute_displacement(bitmap, ['1/' num2str(PIX_NO_PER_SIDE)]);我带来麻烦,我将其替换为

mid_dsp = rand();
right_dsp = rand();

然后,它起作用了!这证明这确实是由这条特定的线路引起的。但是,我确实测试了该函数,它正确返回了两个数字!由于函数返回值一样rand(),我看不出有任何区别。这让我更加困惑。

4

2 回答 2

1

我遇到了同样的问题,结果表明 Matlab 2015 为 parfor 中的每个循环保留了所有必要的内存资源,导致内存中断短缺。错误信息很棘手。在对循环中的代码进行微调并通过 Windows 10 中的 Pagefile 中的系统设置从 SSD 提供 120GB 的 RAM 之后,parfor 执行得很漂亮。

于 2017-08-31T18:48:59.063 回答
0

在我自己的类似代码块上工作了一段时间后,我认为这实际上是一个内存问题。

我使用的是 6 核 4GHz CPU 和 8 gigs 的 RAM,当我将工人数量设置为高时(在 MATLAB 2014b 上)看到了这个问题,并且工人数量少时没有任何问题。

当我使用 6 个或更多工作人员(我知道这并不理想)时,内存消耗很高,并且偶尔会弹出此错误消息。我还在测试中看到了各种内存不足错误。

到目前为止,当我使用 5 个或更少的工作人员时,我还没有看到该错误,而且我很确定某些内存限制(可能在 java 代码块内)通过阻止某些结果的完整性(或存在性)导致了这个问题

希望您可以通过减少工人数量来解决此问题。

于 2015-04-16T06:40:26.100 回答