假设我有一台16核机器和一个尴尬的并行程序。我使用大量的numpy点积和numpy数组加法,如果我不使用多进程,那么这将是一个简单的问题:确保numpy构建在使用多线程的blas版本上。但是,我正在使用多进程,所有核心都在工作。在这种情况下,是否有任何好处可以从使用多线程blas中获得?
大多数操作都是(blas)类型1,一些是类型2。
大多数操作都是(blas)类型1,一些是类型2。
numpy.dot
使用BLAS dot
、gemv
或gemm
,具体取决于操作,但其中只有gemm
通常是多线程的,因为在执行O(N)和O(N^2) BLAS调用时很少有性能优势。如果您限制自己使用1级和2级BLAS操作,即使您使用了使用mulithreaded BLAS构建的numpy实现(例如Atlas或MKL),我怀疑您实际上没有使用任何多线程BLAS调用。如果您已经在使用多进程,并且所有核心都处于最大负载状态,那么添加等待处理器的线程将几乎没有任何好处。
根据您的算法和所做的事情,使用一种类型可能比另一种更有益,但这非常依赖于具体情况。