我一直在运行一个程序数百次,但最近发现一个输入参数集会导致以下错误:
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' s关闭),以查看它是否运行得更好。不幸的是,这非常耗时,所以我暂时不知道结果。
同时有人可以解释导致此错误的原因吗? 和/或告诉我如何调试并行代码?
在我用来代替parfor时,只需添加代码就可以使用恶意参数设置了! 所以我真的需要在并行环境中找到一些调试方法,这样我就可以隔离并修复这个bug。使用for而不是parfor太慢了!
答案 0 :(得分:2)
正如@Oleg指出的那样,旧版本的Parallel Computing Toolbox对PARFOR的转移有限制性的数据大小限制。这个限制在R2013a中得到了修复,但遗憾的是链接到的文档页面@Oleg没有得到更新。如果可以,请使用R2013a再试一次。
答案 1 :(得分:1)
为了避免内存不足,您需要一个计算器并了解其局限性。
在客户端和工作人员之间的每次数据传输中,64位操作系统的大小限制为2GB,32位操作系统的大小限制为600MB。 Object Data Size Limitations中的更多详细信息以及parfor()
中提到的更多详细信息。
然后,您需要计算(使用计算器)每个循环中传输的数据量,即代码创建的数组大小。