2009-12-06 17 views
5

または、オペレーティングシステムによって制御されていますか?私は、Googleからの新しいGo言語には、プログラマが細かく分かち書きするための機能が組み込まれている、あるいは間違って理解していると聞きましたか?スレッドが実行するマルチコアCPUのコアをプログラムで選択して選択できますか?

+2

これは可能かもしれませんが、なぜそれをやりたいのですか?通常、オペレーティングシステムは、ユーザー空間アプリケーションよりもコードを実行するCPUをより正確に判断することができます。 –

+2

@ Zach各CPUが何をするかをきめ細かく制御すれば、いくつかのアルゴリズムは本当にうまく動作します。たとえば、スレッドがプリエンプトされた場合、独自のスピンロックを使用するアルゴリズムは非常にうまくいかないため、各スレッドの特定のコアにバインドすることをお勧めします。それとも、CPUに非常に拘泥しているものと関連があると思います。それは言った...あなたが正しい、それは種類のニッチなものです。 – asveikau

+0

@asveikau確かに、あなたが稼働しているCPUは、あなたが先取りされるかどうかに影響を与えません。 NUMAのアーキテクチャでは、どこが重要かを考えることができます。しかし、私は、ユーザー空間プログラムが無作為に選択するよりも、それに恩恵をもたらす決定を下す可能性があるとは思っていません。 –

答えて

2

Linuxの場合、sched_setaffinityはあなたの答えです。これはLinuxカーネル2.5.8以降でサポートされています。

名前

sched_setaffinity、sched_getaffinity - アフィニティマスクが実際に ごとに独立して調整することができる スレッド単位の属性で設定されており、プロセスのCPUアフィニティが

#define _GNU_SOURCE 
#include <sched.h> 

int sched_setaffinity( pid_t pid, 
    size_t cpusetsize, 
    cpu_set_t *mask); 

int sched_getaffinity( pid_t pid, 
    size_t cpusetsize, 
    cpu_set_t *mask); 

をマスクしますスレッドグループ内のスレッドは です。 gettid(2)の呼び出しから返された値 は、引数pidに を渡すことができます。 0として 指定するPIDは、呼び出し側スレッドのため 属性を設定し、 スレッドグループのメインスレッドの属性 を設定します(2)GETPID呼び出し から返された値を渡します。答えはイエスである()(あなたは、代わりに sched_setaffinityの pthread_setaffinity_np(3)を使用し、POSIX スレッドAPIを使用している場合。)

3

オペレーティングシステムによって異なります。

pthread_attr_setaffinity_np()でヒントを設定できます。

しかし、オペレーティングシステムがあなたを無効にできます。上記の呼び出しは、あなたのプログラムがOSに与える示唆にすぎません。

Goについては、私はまだそれを扱っていないし、あまりにも深く見ていないが、Goの私の理解は、多くの並列性がむしろ暗黙的であるということである。あなたには共同作業があります(彼らは "忙しい"と言います)。それはCPU親和性のようであり、スレッディング自体の概念はそれとは別です。つまり、言語ランタイムは、それがベストであると判断した場合、1つのCPUですべてを実行することもできます...しかし、私はそれをあまりにも深く見ていないことを覚えています。 :-)

2

、あなたは、プログラムのプロセスが稼働たコアを選択することができます。前述のarsaneの答えは、sched_set_affinity()、pthread_setaffinity_np()です。ここで

はプロセスでこれを行う方法についてのnifty tutorialです(this質問への回答から来ている。)

は基本的に、これはビットマスクを使用して行われます。これは、整数(例えば、32ビット)が存在し、最初のビット== 1であれば、そのプロセスはプロセッサ1上で実行することができることを意味する。第2のビット== 1であれば、そのプロセスはプロセッサー2など。

したがって、デフォルトでは、アフィニティービットマスク= 1 ... 111(32回)。これは、「プロセスはプロセッサー1、2、3、...、32で実行される可能性があります。もちろん、コアが2つしかない場合は、余分な30ビットは適用されません。

ただし、そのビットマスクを0 ... 010に設定すると、「プロセッサ2」だけがそのプロセスを実行することができます。

Linuxでサポートされているプロセッサーのmaximum numberが32である理由についても説明しています(一般に見つかっているハードウェアの多くにx86、調整なしで、クラスタリングなしなど)。

関連する問題