処理そのものに並列性がある場合、SMP(対称型マルチプロセッサ)を有効に使う事は難しくなく、プロセッサの数だけスレッドを立ち上げれば良い。
けれども、OS が CPU にスレッドを振る過程で、時折同じ CPU に複数のスレッドを振ってしまう事があるらしい。通常、数十〜数百ミリセカンドという短い間隔でタイムスライスしているので、同じ CPU に複数のスレッドを振ってしまったとしても、すぐに振り直されるので問題ない。
今回はそれすらも許したくない、シビアに速度を要求する場合の話。
結論から言うと、Windows では SetThreadAffinityMask を使用し、Linux では sched_setaffinity を使用する。
sched_setaffinity は説明を読めば下位のビットから CPU の個数だけビットが続く事が分るので、すぐに対応出来るはず。
SetThreadAffinityMask も、まずそのはず。しかし明言はされていないようなので、ビットの途中に利用禁止のプロセッサがあるかもしれないと仮定して、GetProcessAffinityMask で利用可能なマスクを得ておくと完璧。
なんでこんな事を書いているかというと、Mac OS X で affinity を設定したかったから。
ところが このメール を読むと、Darwin は affinity を設定出来なさそう。ホントかなあ。