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


17

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


2
<不機嫌-コメント>ファイル名を指定して実行OS Xは、仮想マシンで、仮想マシンの親和性を設定する</不機嫌-コメント>
zildjohn01

なぜあなたはこれをしたいのですか?一般的に、マルチコアシステムで動作しないようにコーディングされた古いプログラムを実行しようとしない限り、悪い考えです。
jalf

2
@jalf:プロセッサー親和性は、場合によってはキャッシュの無効化とトラッシングを減らすため、パフォーマンスを改善できます。

1
それは残念です。Macはリアルタイムソフトウェア開発にとって理想的なプラットフォームになることはないようです。
エヴァンプライス

1
@jweyrich Mac ProのようなQPI(IntelのNUMA)を搭載したCPUでは、CPUアフィニティ設定するとメモリアフィニティが無効になり、パフォーマンスが低下します。ただし、これはモバイルプロセッサには適用されません。
ヤノ

回答:


14

OS Xは、バージョン10.5以降、スレッドアフィニティAPIをサポートしています。リンク先のWebページの関連資料を以下に示します。

アフィニティセット

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

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

個別のアフィニティタグを設定する効果

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

使用例

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

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

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

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


このAPIに加えて、コマンドラインユーティリティはありますか?
ビクターエイクハウト

11

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

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


2
OS Xは、バージョン10.5以降、スレッドアフィニティAPIをサポートしています。詳細については私の答えをご覧ください。
ボイドポインター14年

4

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

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


2

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.