2016-08-24 23 views
2

golangちょうどruntime.GOMAXPROCS(1)のアプリケーションを1つ実行するように設定するにはgoroutineを同時に実行しますが、アプリケーションを特定のCPU上で実行させたいのですか?あなたがバイナリ行く起動するには1つのゴルーチンではなく特定のCPUで実行しますか?

+1

start/affinity 1 gobinary.exe –

+0

プロセッサアフィニティの設定は、OS固有であり、プロセス自体の外で行うのが最適です。 Linux上の 'taskset'のようなコマンドラインツールは、通常これを行うために使用します。 – JimB

答えて

2

、それはWindows上でのみCPU 0で実行されるように、あなたは「親和性」パラメータでstartコマンドを使用することができますexample.exe言う:

start /affinity 1 example.exe 

私はまさにあなたが何であるかを知りません実現しようとしていますが、this document describing GOMAXPROCSを参照してください - Goランタイムが同じことをより効率的に行う場合があります。 GCコンパイラ複数のOSスレッドを利用するためのランタイム・サポートを可能にするために、デフォルト値1以上にをGOMAXPROCSを設定する必要があります(6グラムまたは8グラム)の下で

0

は、それがすべてですGOMAXPROCSが1より大きい値に設定されていない限り、goroutinesは同じスレッドを共有します。

GOMAXPROCSが1より大きい場合、スレッド数が多いスレッドプール上で実行されます。 gccgoコンパイラGOMAXPROCSは、実行中のゴルーチンの数と事実上同じです。 nがマシン上のプロセッサーまたはコアの数であるとします。環境変数GOMAXPROCS >= nを設定するか、またはruntime.GOMAXPROCS(n)を呼び出すと、n個のプロセッサーの間でゴルーチンが分割され(配布され)、 になります。

しかし、プロセッサの数が増えると、パフォーマンスが線形に向上することは必ずしも必要ではありません。主に、より多くの通信が必要になるためです。

number of goroutines > 1 + GOMAXPROCS > 1

だから、実行する唯一のゴルーチンがある場合:親指の体験ルールは、最高のパフォーマンスが得られ、そして次も従うべきn個のコアのためのn-1GOMAXPROCSを設定していることのようですある時点で、GOMAXPROCSを設定しないでください!

ゴルーチンを特定のOSスレッドにロックする場合は、runtime.LockOSThreadでこれを行うことができます。

LockOSThreadは呼び出し元のゴルーチンを現在の操作 システムスレッドに接続します。呼び出し元のgoroutineが終了するか、または UnlockOSThreadを呼び出すまで、スレッドは常にそのスレッドで実行され、他には のゴルーチンが実行できません。

詳細については、https://golang.org/pkg/runtime/を参照してください。

+1

私はOPの質問に全く答えないと思います。また、OSスレッド!= CPUコア、私はOPが求めているものと信じています。 – syntagma

関連する問題