在Python中,是否值得使用多线程BLAS实现和多进程?

5
假设我有一台16核机器和一个尴尬的并行程序。我使用大量的numpy点积和numpy数组加法,如果我不使用多进程,那么这将是一个简单的问题:确保numpy构建在使用多线程的blas版本上。但是,我正在使用多进程,所有核心都在工作。在这种情况下,是否有任何好处可以从使用多线程blas中获得?
大多数操作都是(blas)类型1,一些是类型2。
2个回答

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

如果您知道一些关于此行为的互联网文档,我很感兴趣了解相关资料。 - Simon Bergot
显然的信息源是numpy代码本身。除此之外,Clint Whaley(Atlas的作者,曾在UTK工作)和Kazushige Goto(GotoBLAS的作者,曾在TACC工作)都撰写并发表了许多设计文档和学术论文,介绍了他们的BLAS实现及其性能。 - avidday

2

如果您已经在使用多进程,并且所有核心都处于最大负载状态,那么添加等待处理器的线程将几乎没有任何好处。

根据您的算法和所做的事情,使用一种类型可能比另一种更有益,但这非常依赖于具体情况。


也许我误解了一些事情,但我认为一个处理器核心可以有效地使用多个线程。因此,在单核机器上可以获得加速。 - Ian Langmore
我并不是多进程/多线程方面的专家(还不是!),但据我理解,如果单个处理器已经达到最大负载,增加更多线程只会导致它们之间频繁切换而增加额外开销。除非有特殊的架构来帮助处理其他线程,而不是在一个工作时阻塞(例如,另一个核心?),否则不会出现性能提升。如果所有内核都处于最大负载状态,并且如果你将相同的任务分成小块,则它们仍然会处于最大负载状态。在单核机器上添加线程非常有用,当核心闲置时等待某些事件发生。 - TorelTwiddler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接