NUMA システムで作業する場合、メモリは現在の NUMA ノードに対してローカルまたはリモートにすることができます。メモリをよりローカルにするために、「ファーストタッチ」ポリシー (デフォルトのメモリからノードへのバインディング戦略) があります: http://lse.sourceforge.net/numa/status/description.html
デフォルトのメモリバインディング ユーザープログラムのメモリは、それらが実行されている CPU を含むノードに近いノードに割り当てられることが重要です。したがって、デフォルトでは、ページ フォールトは、ページ フォールト CPU を含むノードのメモリによって解決されます。ページに最初にタッチした CPU がページに障害を起こした CPU になるため、このデフォルト ポリシーは「ファースト タッチ」と呼ばれます。
デフォルトのポリシーはファーストタッチと呼ばれます。このポリシーでは、メモリのページに最初にアクセスする (つまり、書き込みまたは読み取りを行う) プロセスによって、プロセスが実行されているノードにそのページが割り当てられます。このポリシーは、順次プログラムだけでなく、多くの並列プログラムにも有効です。
他にもいくつかの非ローカル ポリシーがあります。また、一部の NUMA ノードへのメモリ セグメントの明示的な移動を要求する機能もあります。
ただし、(単一アプリケーションの多くのスレッドのコンテキストでは) 「次のタッチ」ポリシーを使用すると便利な場合があります。関数を呼び出して、メモリ領域 (最大 100 MB) をデータと「バインド解除」し、「最初のタッチ」を再適用します。次のタッチ (読み取りまたは書き込み) でページをスレッドにアクセスする numa ノードに移行する、この領域のようなハンドラー。
このポリシーは、多数のスレッドで処理する巨大なデータがあり、このデータへのアクセスのパターンが異なる場合に役立ちます (たとえば、最初のフェーズ - スレッドを介して列ごとに 2D 配列を分割し、2 番目のフェーズでは同じデータを行ごとに分割します)。
このようなポリシーは、Solaris 9 以降、MADV_ACCESS_LWP フラグを指定した maadvice を介してサポートされていました。
https://cims.nyu.edu/cgi-systems/man.cgi?section=3C&topic=madvise
MADV_ACCESS_LWP 指定されたアドレス範囲に触れる次の LWP が最も頻繁にアクセスすることをカーネルに伝えます。そのため、カーネルはこの範囲とそれに応じて LWP にメモリと他のリソースを割り当てようとする必要があります。
「affinity-on-next-touch」という名前の Linux カーネルへのパッチがありました (2009 年 5月) 。それ?
また、Lee Schermerhorn の「migrate_on_fault」パッチ http://free.linux.hp.com/~lts/Patches/PageMigration/もありました。
では、質問: 現在のバニラ Linux カーネル、または RedHat Linux カーネルや Oracle Linux カーネルなどの主要なフォークに NUMA の次のタッチはありますか?