お世話になっております。
現在、VS 2005 C++/MFCで開発を行っています。
Windowsでは「_beginthreadex()」などの関数を使用してマルチスレッド処理を
作成することができますが、この方法で作成した複数のスレッドは
マルチコアのCPUで実行した場合に自動的に別々のコアに振り分けられる
のでしょうか?
それとも同じコアで処理されているのでしょうか?
せっかく複数のスレッドを作成しても、それらが1つのコアで処理されている
としたら、マルチコアの真の性能を引き出せていないことになります。
マルチコアの性能を引き出すためには、OpenMPなどの専用のライブラリ(?)などを
使用する必要があるのでしょうか?
また、素朴な疑問なのですが、マルチコアCPUの場合には、
1つのコアでワープロソフトを使用中に、別のコアで円周率を永遠と
計算させていても、ワープロのパフォーマンスにはまったく影響を
与えない、と考えていいのでしょうか?
Win32SDKのSetThreadAffinityMask()などを使って明示的に割り当てない限り、
スレッドが実行されるコアを指定することはできません。CPUは開始された
スレッドを「何らかの理屈により」「どれかの論理コア」に割り当てるでしょう。
>1つのコアでワープロソフトを使用中に、別のコアで円周率を永遠と
>計算させていても、ワープロのパフォーマンスにはまったく影響を
>与えない、と考えていいのでしょうか?
当然影響があります。根拠としては、マルチコアCPUであっても
1.メモリー用のバスは1系統しかないので、全ての論理コアが
これを使用する。
ですよね。円周率スレッドの全てがキャッシュに乗っている場合でも、
2.ワープロのどれかのスレッドが円周率スレッドの論理コアを使うの
を禁止できない。
ので、必ず影響はあると考えるべきではないでしょうか。
アドバイスありがとうございました。
なるほど、そういうことだったのですね。
ということは普通にマスチスレッドでプログラミングをしているのなら、
あえてOpenMPなどを利用するメリットは少ないようですね。