2017-06-07 135 views
2

慢这是我的处理器: 2.3 GHz英特尔的Core i7在MacOS塞拉利昂Nd4j:使用多线程比单线程

(SO 4芯与超线程) 这是我的程序:

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秒。

任何想法,为什么这是?谢谢。

+0

只是一个猜测 - 也许你的数据是(相对)小,所以没有parallelizarion的好处(因为我知道自动并发只适用于向量/基因/张量如点积,总和操作) – dk14

+0

这只是一个在MNIST数据集上利用786个元素的50000个矢量训练786x30x10的神经网络的程序的提取。我认为这应该足以提供4个线程。在4个线程上训练单个时间需要48秒,而在1个线程上训练需要22秒。 – botkop

+0

@botkop我只是 - 谢谢。删除了我的多余评论。 – diginoise

回答

0

我无法找到此澄清。所以我转移到了Breeze,这个速度快了6倍,没有多少变化。