Nd4j:使用多线程比单线程慢

时间:2017-06-07 10:32:07

标签: scala nd4j

这是我的处理器: 2.3 GHz Intel Core i7(4核,超线程) 在MacOs Sierra

这是我的计划:

package nn

import org.nd4j.linalg.api.ndarray.INDArray
import org.nd4j.linalg.factory.Nd4j.randn
import org.nd4j.linalg.ops.transforms.Transforms._
import org.nd4s.Implicits._

object PerfTest extends App {

  val topology = List(784, 30, 10)
  val biases: List[INDArray] =
    topology.tail.map(size => randn(size, 1))

  val weights: List[INDArray] =
    topology.sliding(2).map(t => randn(t(1), t.head)) toList

  (1 to 100000).foreach { i =>
    val x = randn(784, 1)
    biases.zip(weights).foldLeft(List(x)) {
      case (as, (b, w)) =>
        val z = (w dot as.last) + b
        val a = sigmoid(z)
        as :+ a
    }
  }
}

当我使用默认线程运行上面的程序时(对于nd4j和此处理器,这将是4),大约需要28秒。

当我在1核心(export OMP_NUM_THREADS=1)上运行时,则需要18秒。

知道为什么会这样吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我无法为此找到澄清。 所以我迁移到了Breeze,这个速度快了6倍,没有太多的麻烦。