0

我一直在运行一个程序数百次,但最近发现一个输入参数集会导致以下错误:

In DElambda at 116
  In parallel_function>make_general_channel/channel_general at 879
  In remoteParallelFunction at 31
??? Error using ==> parallel_function at 598
The session that parfor is using has shut down

Error in ==> CreateCurve at 86
parfor j=1:10

??? The client lost connection to an unknown lab.
This  might be due to network problems, or the interactive matlabpool job might have errored. This is
causing: java.lang.OutOfMemoryError: GC overhead limit exceeded

当我将参数搜索空间的最小值和最大值设置为 min[0;0] 和 max[1.5;1.5] 并将 Population size 设置为 10k(这是差分进化)时,就会发生这种情况。我在任何时候都没有触及其他参数。每当我尝试使用上述参数运行它时,都会出现上述错误。

但是,当我将人口规模降至 1k 时,它会收敛(由于搜索不足而导致答案不正确)。或者,当我使用 10k 的人口规模和我尝试过的任何其他参数集时,它是否可以完美运行并收敛到正确的解决方案?

看起来很奇怪?

我目前正在使用 for 循环而不是 parfor 循环(并且 matlabpool 已关闭)重新运行问题参数集,以查看它是否运行得更好。不幸的是,这非常耗时,所以我暂时不知道结果。

同时,任何人都可以解释导致此错误的原因吗?和/或告诉我如何调试并行代码?

只是为了添加代码在我使用 for 而不是 parfor 时使用流氓参数集运行良好!所以我真的需要在并行环境中找到某种调试方法,以便我可以隔离和修复这个错误。使用 for 而不是 parfor 太慢了!

4

2 回答 2

2

正如@Oleg 所指出的,旧版本的 Parallel Computing Toolbox 对进出 PARFOR 的传输有严格的数据大小限制。这个限制在 R2013a 中得到了修复,但不幸的是,链接到的文档页面 @Oleg 没有得到更新。如果可以,请使用 R2013a 重试。

于 2013-04-18T06:13:08.677 回答
1

为避免内存不足,您需要一个计算器并了解其局限性。

在客户端和工作人员之间的每次数据传输上,64 位操作系统的大小限制为 2GB,32 位操作系统的大小限制为 600MB。对象数据大小限制中的更多详细信息以及parfor().

然后,您需要(使用计算器)计算您在每个循环中传输的数据量,即代码创建的数组的大小。

于 2013-04-17T16:53:32.360 回答