web-dev-qa-db-ja.com

OS Xでプロセッサアフィニティを設定する方法

MacBook ProのSnow Leopardでプロセッサアフィニティをどのように設定しますか?Windowsでは、タスクマネージャで切り替えることができます。

17
MarshallBananas

OS Xは、バージョン10.5以降 スレッドアフィニティAPI をサポートしています。ここに私がリンクしたウェブページからいくつかの関連資料があります。

アフィニティセット

アフィニティセットは、メモリリソースを共有し、L2キャッシュを共有したいスレッドのコレクションです。異なるアフィニティセットは、個別のアフィニティを表します。つまり、異なるセットに属するスレッドは、個別のL2キャッシュを使用する必要があるため、異なる論理プロセッサで実行する必要があります。

アフィニティセットは「タグ」で識別されます。スレッドは、特定のアフィニティセットに、そのセットを識別するタグを割り当てることによって割り当てられます。スレッドは最大で1つのアフィニティセットに属することができます。つまり、アフィニティタグが1つあります。

異なるアフィニティタグを設定する効果

たとえば、別々のL2キャッシュで2つのスレッドを実行したいアプリケーションは、異なる親和性タグでスレッドを設定します。デュアルコアマシンでは、このアフィニティは事実上無視されます。ただし、4コアのMacProでは、スケジューラは個別のパッケージでスレッドを実行しようとします。同様に、8コアMacProでは、スケジューラーはこれらのスレッドを別々のダイ(同じ物理CPUパッケージにある場合とない場合がある)で実行しようとします。

使用例

使用可能なすべてのプロセッサにスレッドを配置したいアプリケーションは、次のことを行います。

  • Sysctl(3)を使用して、システム上のプロセッサの数を取得します。
  • その数のスレッドを作成します。
  • 各スレッドに異なるアフィニティタグを設定します。
  • すべてのスレッドを開始します。

デフォルトのアフィニティポリシーを持つスレッドは、どのプロセッサでもより自由にスケジュールされます。これらのスレッドは、アイドル状態のプロセッサで実行されるように優先的に移行されます。アフィニティタグの付いたスレッドは、そのまま残る傾向があります。

コードリスト、および親プロセスと子プロセス間でのアフィニティタグの共有、CPUキャッシュ構成の取得などについては、ソースを参照してください。

14
void-pointer

http://developer.Apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/

Mac OS Xは、プロセッサを識別したり、スレッドの配置を制御したりするインターフェイスをエクスポートしません。明示的なスレッドからプロセッサへのバインドはサポートされていません。代わりに、カーネルがすべてのスレッド配置を管理します。アプリケーションは、ほとんどの状況下で、スケジューラーがキャッシュ親和性に関して適切なプロセッサー配置を使用してスレッドを実行することを期待しています。

11
ta.speot.is

これまで、XNU(1504.3.12)スケジューラは、プロセスやスレッドのプロセッサアフィニティを実装していません。

そのため、MacOSXはそのための手段を提供していません。

4
jweyrich

から http://images.Apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdf

•効率的なカーネルスレッド。各POSIXスレッドは特定のCPUのキューに入れられ、ロックの競合を減らしながらプロセッサーの親和性とスケーラビリティーを向上させます。スレッドはPOSIX(1c)に準拠しており、キャンセルや共有ミューテックスのサポートが含まれています。

それは私には広告のように見えますが、Lionを実行している私のiMacはほとんどの場合それを尊重するように見えますが、プロセスをコアに「固定」しません。

とにかく、ダーウィンのプロセスアフィニティを制御するAPIが見つかりませんでした。

2
Alan Baldo