2017-06-07 440 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倍,沒有多少變化。