MacBook ProのSnow Leopardでプロセッサアフィニティを設定するにはどうすればよいですか?Windowsでは、タスクマネージャで切り替えることができます。
MacBook ProのSnow Leopardでプロセッサアフィニティを設定するにはどうすればよいですか?Windowsでは、タスクマネージャで切り替えることができます。
回答:
OS Xは、バージョン10.5以降、スレッドアフィニティAPIをサポートしています。リンク先のWebページの関連資料を以下に示します。
アフィニティセットは、メモリリソースを共有し、L2キャッシュを共有するスレッドのコレクションです。異なるアフィニティセットは個別のアフィニティを表します。つまり、異なるセットに属するスレッドは個別のL2キャッシュを使用する必要があるため、異なる論理プロセッサで実行する必要があります。
アフィニティセットは「タグ」によって識別されます。スレッドは、特定のアフィニティセットに、そのセットを識別するタグを割り当てることで割り当てられます。スレッドは最大で1つのアフィニティセットに属することができます。つまり、アフィニティタグが1つあります。
たとえば、別々のL2キャッシュで2つのスレッドを実行したいアプリケーションは、異なるアフィニティタグでスレッドを設定します。デュアルコアマシンでは、このアフィニティは事実上無視されます。ただし、4コアMacProでは、スケジューラーは個別のパッケージでスレッドを実行しようとします。同様に、8コアのMacProでは、スケジューラはこれらのスレッドを別々のダイ(同じ物理CPUパッケージに含まれている場合と含まれていない場合があります)で実行しようとします。
使用可能なすべてのプロセッサにスレッドを配置するアプリケーションは、次のことを行います。
- sysctl(3)を使用して、システム上のプロセッサの数を取得します。
- その数のスレッドを作成します。
- 各スレッドに個別のアフィニティタグを設定します。
- すべてのスレッドを開始します。
デフォルトのアフィニティポリシーを持つスレッドは、任意のプロセッサでより自由にスケジュールされます。これらのスレッドは、アイドルプロセッサで実行されるように優先的に移行されます。アフィニティタグを使用したスレッドは、そのまま残る傾向があります。
コードリスト、および親プロセスと子プロセス間でのアフィニティタグの共有、CPUキャッシュ構成の取得などについては、ソースを参照してください。
http://developer.apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/
Mac OS Xは、プロセッサを識別するインターフェイスまたはスレッドの配置を制御するインターフェイスをエクスポートしません。明示的なスレッドからプロセッサへのバインドはサポートされていません。代わりに、カーネルはすべてのスレッドの配置を管理します。アプリケーションは、ほとんどの場合、スケジューラがキャッシュアフィニティに関して適切なプロセッサ配置を使用してスレッドを実行することを期待しています。
http://images.apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdfから
•効率的なカーネルスレッド。各POSIXスレッドは特定のCPUのキューに入れられ、ロックの競合を減らしながらプロセッサーの親和性とスケーラビリティを向上させます。スレッドはPOSIX(1c)に準拠しており、キャンセルおよび共有ミューテックスのサポートが含まれます。
私には広告のように見えますが、Lionを実行している私のiMacはほとんどの場合それを尊重しているように見えますが、プロセスをコアに「固定」しません。
とにかく、ダーウィンのプロセスアフィニティを制御するAPIが見つかりませんでした。