1

我正在使用Parallel Python在多个内核上执行计算繁重的代码。我有一个i7-4600M处理器,它有 2 个内核和 4 个线程。

有趣的是,如果我使用 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使用率的简短视频:https ://www.screenr.com/1ULN当我使用2个线程时,cpu有50%的使用率,如果我使用4个线程,它使用100%。但它只是稍微快一点。使用 2 个线程,我获得了 1.8 倍的加速,使用 3 个线程获得了 1.9 倍的加速,使用 4 个线程获得了 2 倍的加速。

如果代码太快,请使用n = 10or n = 11。但要小心,复杂度是6^n. 所以n = 10将需要 6 倍的时间n = 9

4

2 回答 2

1

2 个核心和 4 个线程意味着每个核心上有两个超线程,它们不会线性扩展,因为它们共享资源并且可以相互妨碍,具体取决于工作负载。并行 Python 在幕后使用进程和 IPC。每个内核都在调度两个不同的进程,因此您可能会看到缓存抖动(内核的缓存在超线程之间共享)。

于 2014-12-15T13:30:15.337 回答
0

我知道这个线程有点旧,但我认为添加一些数据点可能会有所帮助。我在分配了 4 个虚拟 CPU(2.93Ghz X5670 xeon)和 8GB 内存的 vm 上运行它。VM 托管在 Hyper-V 上,并在 Ubuntu 14.10 64 位上运行 Python 2.7.8,但我的 PP 版本是 fork PPFT。

在第一次运行中,线程数为 4。在第二次中,我将 for 循环修改为 8。

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

再增加 4 个内核,并将内存加倍,同样的 for 循环,循环 8 个:

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

于 2015-03-02T07:17:13.243 回答