2011-10-14 28 views
5

假设我有一台16核心机器和一个令人尴尬的并行程序。我使用了大量的numpy点积和numpy数组,如果我不使用多处理,这将是一件不容易的事情:确保numpy是针对使用多线程的blas版本构建的。但是,我正在使用多处理,并且所有内核都在努力工作。在这种情况下,使用多线程blas有什么好处吗?是否值得在Python中使用多线程blas实现和多处理?

大多数操作是(BLAS)1型,有些是2型

回答

2

如果您已经使用多,所有的核心都在最大负载,则会有非常少,如果有的话,好处添加将等待处理器的线程。

根据你的算法和你在做什么,使用一种类型比另一种类型更有好处,但这非常依赖。

+0

也许我误解了一些东西,但我的印象是一个处理器内核可以有效地使用多个线程。所以你可以在单核机器上加速。 –

+0

我不是多处理/线程方面的专家,但就我的理解而言,如果单个处理器处于最大负载状态,则添加更多线程只会导致更多开销在它们之间进行交换。除非有特殊的体系结构来帮助处理其他线程(例如,另一个核心?),否则不会增加性能。如果所有内核都处于最大负载,并且如果将相同的作业分成小块,则它们仍将处于最大负载。当核心等待发生某些事情时,向单个核心机器添加线程很有用。 – TorelTwiddler

6

对于您的代码实际上使用多线程BLAS调用的假设,您可能需要小心谨慎。 numpy运算符相对较少实际使用底层BLAS,而相对较少的BLAS调用实际上是多线程的。 numpy.dot使用BLAS dot,gemvgemm,具体取决于操作,但在那些操作中,只有gemm通常是多线程的,因为O(N)和O(N^2)BLAS调用几乎没有任何性能优势。 。如果您将自己限制为1级和2级BLAS操作,那么即使您正在使用由mulithreaded BLAS构建的numpy实现(如Atlas或MKL),我怀疑实际上是否正在使用任何多线程BLAS调用。

+0

我有兴趣解释这种行为的来源,如果你知道关于它的一些互联网文档... – Simon

+0

明显的来源是numpy代码本身。除此之外,Clint Whaley(以前来自UTK的Atlas的作者)和Kazotoge Goto(以前来自TACC的GotoBLAS的作者)已经撰写并发表了许多关于BLAS实现及其性能的设计文档和学术论文。 – avidday