2016-03-19 16 views
1

私は私の以前の記事Processing array in Go parallelに関する追加の質問があります。たとえば、他の言葉で並行処理での配列の処理:多くのスレッドのリスクはありますか?

a1 := []int{0, 1, 2, 3, 4...1000} 
a2 := []int{10, 20, 30, 40, 50...10000} 

and I have only 4 cpus : 

runtime.GOMAXPROCS(4) 
var wg sync.WaitGroup 

Is the following code still correct ? 

for i := 1; i < 1000; i++ { 
    wg.Add(1) 
    go func(i int) { 
     defer wg.Done() 
     x := process_array(a1[i], a2[i]) 
     fmt.Println(a1[i], "+", a2[i], "=", x) 
    }(i)  
} 
wg.Wait() 

ため、runtime.GOMAXPROCSは(4)スレッドの数を制限することができるようになります、私の配列が非常に大きいことを想像4にするか、1000スレッドの「蓄積」という問題がありますか?コメントしてくれてありがとう !

+0

ところでGoで起こる並列プログラミングではありません。並行プログラミング - パラレルプログラミングも可能にします(たとえば、複数のスレッドを使用する場合など)。 –

答えて

0

あなたのforループは、使用可能なCPUの数を設定すると、runtime.GOMAXPROCS(4)に1000個のゴルーチンを作成します。

GOMAXPROCSは、 を同時に実行できるCPUの最大数を設定し、以前の設定を返します。 n < 1の場合は、現在の設定を変更しません。 ローカルの マシン上の論理CPUの数は、NumCPUで照会することができます。このコールは、 スケジューラが改善されたときに消えます。

GOMAXPROCS

と同じページ:

GOMAXPROCS変数が同時にユーザレベルゴーコードを実行できるオペレーティング・システム・スレッド の数を制限します。 Goコードの の代わりにシステムコールでブロックできるスレッド数には制限がありません。 です。それらはGOMAXPROCSの制限には数えられません。この パッケージのGOMAXPROCS関数は、制限を照会して変更します。

+0

ありがとう!だから私は4つのスレッドで1000のgoroutinesを持っている場合、それは効率的な並列プログラミングですか?または1つのループで1000の代わりに4でゴルーチン4を作成する方が良いですか? – Fred

+1

@Fred、もしgoroutineが常に仕事をしているのであれば、goroutineの数をcpusの数に制限する方が良いでしょう。待ち時間(例えば、単純なスリープ機能)がある場合、より多くのgoroutinesとその後のcpusを持つことが理にかなっています。どうして遊んで見ない? – Akavall

+0

私の場合、各goroutineは短い作業(相関計算)を行い、結果を出力します:) – Fred

0

速度を向上させるためにパラレルコードを書くときは、常にAmdahl's Lawを覚えておいてください。彼の法則は、迷惑をかけないようにするための非常に有用なルールを示しており、「順次ビットがボトルネックになる」と言い換えることができます。

アムダールの法則を無視すると、不可能な目的を追うのに時間が浪費される可能性があります。パフォーマンスの問題を複数の場所で、または複数の方法で解決するために、並行性の問題を考える必要があります。

一般的に、使用しているアプローチは、複数のプロセスにわたるデータ構造の独立したセグメントの「幾何学的」分解です。

また、異なるステージで異なる作業が行われる関数分解(本質的にパイプライン)も考えられます。

次に、並列性を達成する方法として、マスターワーカーまたは「データ農業」を使用して、特別な一時的ケースがあります。

これらはすべて真に有用なハードウェアを必要とする傾向があります。これらのテクニックを使ったマルチプロセッシングの良い、しかし古い要約は、Tidmus/Chalmers 実用並列処理:並列問題解決の手引き(ISBN 1850321353)にあります。

関連する問題