0

私は現在、グラフと元のノードを入力として受け取り、グラフ内のすべてのノードとツリー (各ノードの先例) のコストを返す最短経路アルゴリズムを持っています。グラフは辞書であり、コストとツリーも同様です。

すべてのノードに起点を持つ最短パス ツリーを計算する必要があるため、(ツリーは互いに独立しているため) 並列で実行するのが自然です。

マルチプロセッシングを使用し、結果をリストに追加するワーカーのプールを使用してそれを行っています(辞書のリストが必要です)。

エラーなしで実行されますが、興味深いのは、処理時間がワーカーの数によって変化しないことです (まったく変化しません)。

なぜそれが起こるのかについての洞察は、ほとんど高く評価されます。コードは以下のとおりです。

from LoadData import *
from ShortestPathTree import shortestPath
from time import clock, sleep
from multiprocessing import Pool, Process, cpu_count, Queue


def funcao(G,i):
    costs, pred=shortestPath(G,i)
    return pred


def main():

    #loads the graph
    graph="graph.graph"
    G = load_graph(graph)

    # loads the relevant nodes (CENTROIDS)
    destinations="destinations.graph"
    DEST = load_relevant_nodes(destinations)

    f = open('output_parallel.out','w')
    start=clock()


    pool=Pool()

    resultados=[]
    def adder(value):
        resultados.append(value)


    #for i in range(len(DEST)):
    for i in range(486):
        pool.apply_async(funcao, args=(G,DEST[i]), callback=adder)

    pool.close()
    pool.join()


    print clock()-start
    print >> f, resultados
    print >> f, 'seconds: '+ str(clock()-start)
4

1 に答える 1

0

@abarnert は、各通話にどれくらいの時間がかかるかを尋ねたところ、頭を悩ませていたことが判明しました。入力されるデータに問題があったため、各呼び出しに非常に簡単に応答できたため、複数のワーカーにタスクを送信するオーバーヘッドがパフォーマンスの向上を相殺しました.

The results I get now that the input data was corrected are:

1 コア: 185.0 秒 2 コア: 111.2 秒 3 コア: 96.6 秒 4 コア: 87.5 秒

デュアル コア ハイパースレッド i7 620M Lenovo T410 ラップトップ (Win 7 64 ビット、Python 2.7.3) で実行

素晴らしい洞察をくれた @abarnert に感謝します!

于 2012-11-09T20:01:07.867 に答える