【发布时间】:2012-06-14 19:17:23
【问题描述】:
我编写了一个遗传算法,为了优化它的性能,我决定对个人进行并行化的适应度测试。为了了解这对我的算法产生了什么样的改变,我重新进行了在并行化之前完成的测试运行,在该运行中我测试了 GA 在不断增长的人口规模下的性能。
GA 的并行版本实际上比原始版本长了大约 50%。我意识到有时并行化的开销实际上可能比它节省的时间更多,但我怀疑这是否应该适用于这种情况——我的适应度测试正在寻找 Sheckel 的 Foxholes 函数的全局最小值(http://extreme.adorio-research.org/download/mvf/html/node51.html),而我的人口规模从 10 到 1000 不等。我希望在并行执行 1000 次 sheckel 散兵坑时,节省的时间将大大超过并行化的开销。
所以我的问题是:为什么并行化会减慢算法的速度(并且如此显着)?
为了记录,我正在使用 Java 进行编码,并且我正在使用 CountDownLatch 进行并行化,该 CountDownLatch 在继续之前等待所有线程(适应性测试)执行。
【问题讨论】:
-
你用的是什么CPU芯片?如果它是旧的单核,并行化将无济于事。也就是说,我发现英特尔 I3 上的良好并行确实可以提供几乎 2 倍的性能,正如人们所期望的那样。
-
哈,我想到了它受到硬件限制的想法。我在一个较旧的双核上,所以我意识到并行化不会像我在更强大的机器上那样有效,但它仍然应该比串行执行更快。另外,我只是在双核上对其进行编程,当我完成后它实际上将被移至八核。
-
听起来你应该提高一些速度。好的,还有两个“明显”的问题。你在做很多 I/O 吗?是否有任何资源同步/锁定?
-
您是否同时运行 100 个线程?或者一些合理的东西,比如一次 4-8 个线程,例如使用 ExecutorService?
-
创建一个新线程是一项昂贵的操作。如果您在每一代中重新创建线程,您将乞求性能降低。您应该只使用合理数量的线程(取决于内核数量)并重用您创建的线程。
标签: java performance parallel-processing genetic-algorithm