假设我有一台16核机器和一个令人尴尬的并行程序。我使用大量的numpy dot产品和添加numpy数组,如果我不使用多处理,那将是一个明智的选择:确保numpy是针对使用多线程的blas版本构建的。但是,我正在使用多处理,所有核心都在努力工作。在这种情况下,使用多线程blas有什么好处吗?
大部分操作都是(blas)类型1,有些是类型2。
答案 0 :(得分:6)
您可能需要对您的代码实际使用多线程BLAS调用的假设有点小心。相对较少的numpy运算符实际上使用底层BLAS,而相对较少的BLAS调用实际上是多线程的。 numpy.dot
使用BLAS dot
,gemv
或gemm
,具体取决于操作,但只有gemm
通常是多线程的,因为很少有这样做的O(N)和O(N ^ 2)BLAS调用的性能优势。如果您将自己限制为1级和2级BLAS操作,我怀疑您实际上正在使用任何多线程BLAS调用,即使您使用的是使用多线程BLAS构建的numpy实现,例如Atlas或MKL
答案 1 :(得分:2)
如果您已经在使用多处理,并且所有核心都处于最大负载状态,那么添加将等待处理器的线程的好处将会很少(如果有的话)。
根据您的算法和您正在做的事情,使用一种类型而不是另一种类型可能更有利,但这非常依赖。