2017-02-21 3 views
1

だから、私は並行しているコードを持っており、それは各CPU /コア上で実行されることを意図しています。golangで使用されている複数のコアを防止する方法を検出するにはどうすればよいですか?

入力/出力値を有する2つの大きなベクトル

var (
    input = make([]float64, rowCount) 
    output = make([]float64, rowCount) 
) 

は、これらが充填され、Iは各入出力ペアの間の距離(誤差)を計算したいがあります。

var d float64 // Error to be computed 
// Setup a worker "for each CPU" 
ch := make(chan float64) 
nw := runtime.NumCPU() 
for w := 0; w < nw; w++ { 
    go func(id int) { 
     var wd float64 
     // eg nw = 4 
     // worker0, i = 0, 4, 8, 12... 
     // worker1, i = 1, 5, 9, 13... 
     // worker2, i = 2, 6, 10, 14... 
     // worker3, i = 3, 7, 11, 15... 
     for i := id; i < rowCount; i += nw { 
      res := compute(input[i]) 
      wd += distance(res, output[i]) 
     } 
     ch <- wd 
    }(w) 
} 
// Compute total distance 
for w := 0; w < nw; w++ { 
    d += <-ch 
} 

アイデアは、各CPU /コアのための単一の労働者を持つことであり、各労働者が行のサブセットを処理します。ペアが独立している、可能な同時バージョンは次のようです。

私が抱えている問題は、このコードがシリアルコードより高速ではないということです。

ここでは、runtime.GOMAXPROCSはすでにruntime.NumCPU()に設定されていますので、Go 1.7を使用していますが、明示的に設定してもパフォーマンスは向上しません。

  • 距離はちょうど(a-b)*(a-b)です。
  • 計算はもう少し複雑ですが、再入可能でグローバルデータを使用してください。math.Powmath.Sqrt関数を使用しています)。
  • 他のゴルーチンが実行されていません。だから、

、読書のためのグローバルデータ(入力/出力)にアクセスする以外にも、私は(例えば、math/randを使用していない)を認識していはロック/ミューテックスはありません。

-raceとコンパイルされていて、何も出現しませんでした。

私のホストには4つの仮想コアがありますが、このコードを実行すると(htopを使用して)CPU使用率は102%になりますが、過去にはすべてを使用する他のgoコードコア。

私は調査したいと思いますが、ランタイムがスレッドを割り当ててどのようにゴルーチンをスケジュールするのか分かりません。

このような問題をどのようにデバッグできますか?この場合、pprofは私を助けますか? runtimeパッケージはどうですか?

+1

実際には、 'ch'チャンネルの後ろに1つの隠れたミューテックスがあります。 – nvartolomei

+0

はい、ありがとう!しかし、ミューテックスは、処理されるデータと比較して通常は低い数である「nw」時間だけ使用され、チャネルは計算プロセス全体で非常に遅く使用される。それが問題なのかどうかはわかりませんが、たとえそれがあったとしても、私の疑問は残っています。私のコードがCPUをそれ以上使用していないというミューテックスが原因であることはどうしてわかりますか? – AkiRoss

+0

あなたは正しいです。私はちょうどあなたのものに似たサンプルを試しました、そして、それはすべての利用可能なコアを使います。私は完全なコードの例がより有用であると思います。 – nvartolomei

答えて

1

申し訳ありませんが、事前に

おかげで、しかし最後に、私は測定が間違っていました。 @ JimBは正しかった。私はマイナーなリークがあったが、この程度の減速を正当化するほどのものではなかった。

私の期待は高すぎました。私が同時に作成していた機能は、プログラムの初めにのみ呼び出されたため、パフォーマンスの改善はほんのわずかでした。

プログラムの他のセクションにパターンを適用した後、私は期待される結果を得ました。評価が間違っていた部分が最も重要でした。

とにかく、興味深いことをたくさん学んだので、助けようとしているすべての人に感謝します!

関連する問題