1

複数のコアで計算量の多いコードを実行するためにParallel Pythonを使用しています。2 コアと 4 スレッドのi7-4600Mプロセッサを使用しています。

興味深いことに、2 つまたは 4 つのスレッドを使用すると、計算にほぼ同じ時間がかかります。この現象を示す小さなコード例を書きました。

import itertools
import pp
import time

def cc(data, n):
    count = 0
    for A in data:
        for B in itertools.product((-1,0,1), repeat=n):
            inner_product = sum(a*b for a,b in zip(A,B))
            if inner_product == 0:
                count += 1
    return count

n = 9

for thread_count in (1, 2, 3, 4):
    print("Thread_count = {}".format(thread_count))
    ppservers = ()
    job_server = pp.Server(thread_count, ppservers=ppservers)

    datas = [[] for _ in range(thread_count)]
    for index, A in enumerate(itertools.product((0,1), repeat=n)):
        datas[index%thread_count].append(A)
    print("Data sizes: {}".format(map(len, datas)))

    time_start = time.time()
    jobs = [job_server.submit(cc,(data,n), (), ("itertools",)) for data in datas]
    result = sum(job() for job in jobs)
    time_end = time.time()
    print("Time = {}".format(time_end - time_start))
    print("Result = {}".format(result))
    print

プログラムの実行とCPU使用率の短いビデオを次に示します。しかし、それはわずかに高速です。2 つのスレッドを使用すると 1.8 倍のスピードアップが得られ、3 つのスレッドを使用すると 1.9 倍のスピードアップが得られ、4 つのスレッドを使用すると 2 倍のスピードアップが得られます。

コードが速すぎる場合は、n = 10またはを使用しますn = 11。しかし、注意してください、複雑さは6^n. したがってn = 10、 の 6 倍の時間がかかりn = 9ます。

4

2 に答える 2

1

2 コアと 4 スレッドは、各コアに 2 つのハイパースレッドがあることを意味します。これらはリソースを共有し、ワークロードによっては互いの邪魔になる可能性があるため、直線的には拡張されません。Parallel Python は、プロセスと IPC を舞台裏で使用します。各コアは 2 つの異なるプロセスをスケジュールしているため、キャッシュのスラッシングが発生している可能性があります (コアのキャッシュはハイパースレッド間で共有されます)。

于 2014-12-15T13:30:15.337 に答える
0

このスレッドが少し古いことは知っていますが、追加されたデータポイントが役立つかもしれないと考えました. 4 つの仮想 CPU (2.93Ghz X5670 xeon) と 8GB の RAM が割り当てられた VM でこれを実行しました。VM は Hyper-V でホストされ、Ubuntu 14.10 64 ビットで Python 2.7.8 を実行していますが、PP の私のバージョンはフォーク PPFT です。

最初の実行では、スレッドの数は 4 でした。2 回目の実行では、for ループを変更して 8 にしました。

出力: http://pastebin.com/ByF7nbfm

さらに 4 つのコアを追加し、RAM を 2 倍にします。同じ for ループ、8 のループ:

出力: http://pastebin.com/irKGWMRy

于 2015-03-02T07:17:13.243 に答える