1

我有一个遗传算法,它的适应度函数是一个繁琐的模拟环境。该代码绝对受 CPU 限制,在 64 位 python 3.3 上运行,因此我实现multiprocessing.starmap_async了并行化。

而且它工作得很好,比串行效率大大提高。在我的处理器上,Intel i7 CPU @ 2.40 GHz(16GB RAM):我注意到 4 个进程的运行时间为 8 到 9 秒(2 个进程更慢,串行更慢)。

但是,这仅使用了我的处理器的 65% 到 73%。
将进程计数增加到 6 会利用 95% 到 100% 的处理器,但运行时间为 11 秒。内存仍然在 20% 左右

将此计数增加到 8,处理器始终保持在 100%,但运行时间现在为 12 秒。内存刚刚好。

我不能发布所有内容,但下面是多处理调用(删除了参数)。我有什么办法可以在不减速的情况下利用更多的处理器吗?我也很感激任何帮助理解为什么会发生这种现象。

多处理调用:

        step = np.int8(pop_size/4)
        pol = Pool(processes=4)

        res = pol.starmap_async(SimWorker, ((i, i+step,pop,"a bunch of other arguments") for i in range(0, pop_size, step)))
        fitnessdict = res.get()
        fitnessdict = np.asarray(fitnessdict)
        for i in range(0,pop_size,step):
            for p in range(i,i+step):
                fitness[p] = fitnessdict[i/step,p]

模拟工人:

def SimWorker(start, stop, pop, "a bunch of other arguments"):
    """
    Run a batch of sims
    """

    for p in range(start, stop):
        fitness[p] = Sim_T(pop[p],"a bunch of other arguments")
    return(fitness)
4

0 回答 0