并行Python:4个线程与2个线程具有相同的速度

时间:2014-12-14 20:26:24

标签: python multithreading python-2.7 parallel-python

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

有趣的是,如果我使用2个或4个theads,计算几乎需要相同的时间。我写了一个示例代码,它演示了这种现象。

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.8x的加速,使用3个线程加速1.9x,使用4个线程加速2x。

如果代码太快,请使用n = 10n = 11。但要小心,复杂性为6^n。因此,n = 10的使用时间为n = 9的6倍。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我知道这个帖子有点旧,但我认为一些额外的数据点可能有所帮助。我在一个带有4个virtual-cpus(2.93Ghz X5670 xeon)和8GB ram的虚拟机上运行了这个。 VM托管在Hyper-V上,在Ubuntu 14.10 64位上运行Python 2.7.8,但我的PP版本是fork PPFT。

在第一次运行中,线程数为4.在第二次运行中,我修改了for循环以转到8.

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

再添加4个内核,并将ram加倍,对于循环相同,循环为8:

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