問題タブ [numa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 2つのプロセスを同じCPUで強制的に実行するにはどうすればよいですか?
コンテクスト:
複数のプロセスで構成されるソフトウェアシステムをプログラミングしています。LinuxではC++でプログラムされています。Linux共有メモリを使用してそれらの間で通信します。
通常、ソフトウェア開発では、パフォーマンスの最適化が行われる最終段階にあります。ここで私は大きな問題に直面しました。このソフトウェアには高いパフォーマンス要件がありますが、4つまたは8つのCPUコア(通常は複数のCPU)を搭載したマシンでは、3つのコアしか使用できなかったため、最初のコアでCPUパワーの25%を浪費し、 2番目のものでは60%。多くの調査を行い、ミューテックスとロックの競合を破棄した結果、shmdt / shmat呼び出し(共有メモリセグメントのデタッチとアタッチ)に時間が浪費されていることがわかりました。さらに調査した結果、これらのCPU(通常はAMDPopteronとIntelXeon)がNUMAと呼ばれるメモリシステムを使用していることがわかりました。これは基本的に、各プロセッサに高速の「ローカルメモリ」があり、他のCPUからメモリにアクセスすることを意味します。高価な。
いくつかのテストを行った後、問題は、基本的に、すべてのプロセスが共有メモリセグメントを他のプロセスとその中のスレッドに渡すことができるようにソフトウェアが設計されていることであるようです。プロセスは常に他のプロセスからメモリにアクセスしているため、これはパフォーマンスを低下させるようです。
質問:
さて、問題は、プロセスのペアを同じCPUで強制的に実行する方法はありますか?どちらのプロセッサで実行されるかは気にしないので、常に同じプロセッサで実行するように強制するつもりはありませんが、それでうまくいきます。理想的には、カーネルに伝える方法があります。このプロセスを1つのプロセッサでスケジュールする場合は、この「兄弟」プロセス(共有メモリを介して通信するプロセス)も同じプロセッサでスケジュールする必要があります。パフォーマンスにペナルティはありません。
linux - 大規模なソフトウェアを実行するために Linux/CPU をより適切に構成する方法 (NUMA)
メモリ駆動型の大規模プログラム(数十ギガバイトのメモリ)について、Linuxでパフォーマンス分析を行っています。
そのような大規模なプログラムを実行するのにより適したものになるように linux/hardware を構成することが可能かどうかを考えています。しかし、私はこの面に精通していません。
誰でも設定方法についてポイントがあります
- OSのメモリ割り当て戦略
- CPU のキャッシュ構成
- そうしないと...
どんなコメントでも大歓迎です..
これは典型的な CPU モデルです (4 つの Opteron プロセッサがそれぞれデュアル コアを備えています)。
c - malloc/memcpy 関数は NUMA で独立して実行されますか?
malloc()
非 NUMA / 標準 PC でアプリケーションの速度を上げようとしているときに、マルチコア マシンでもすべてのコア間で共有/同期されているため、ボトルネックが必要であることがわかりました。
Linux と C を使用した NUMA アーキテクチャの PC を利用できますが、2 つの質問があります。
- NUMA マシンでは、各コアに独自のメモリが提供される
malloc()
ため、他のコアをブロックすることなく、各コア/メモリで独立して実行されますか? - これらのアーキテクチャでは、呼び出しはどのように
memcpy()
行われますか? これは各コアで個別に呼び出すことができますか、それともコアで呼び出すと他のコアがブロックされますか? 私は間違っているかもしれませんが、1つのコアがそれを使用しているときに他のコアが待たなければならないmemcpy()
という同じ問題もあったことを覚えています。malloc()
performance - プロセッサ アフィニティへの影響のベンチマーク
私はNUMAアーキテクチャに取り組んでおり、各計算ノードにはソケットごとに 2 つのソケットと 4 つのコアがあり、計算ノードごとに合計 8 つのコアがあり、ノードごとに 24GB の RAM があります。プロセッサ アフィニティの設定がパフォーマンスに大きな影響を与える可能性があることを証明する必要があります。
プロセッサ アフィニティを使用する場合と使用しない場合の影響の違いを示すためのベンチマークとして使用できると提案するプログラムはありますか? MPI、OpenMP、または pthreads を使用して簡単な C テスト プログラムを作成することもできますが、そのテストを実行するにはどのような操作が最適でしょうか? これは、キャッシュの局所性を利用するものでなければなりませんが、コンテキストの切り替え (ブロック操作) もトリガーするため、プロセスが別のコアに移行したり、さらに悪いことに、別のソケットに移行したりする可能性があります。8 の倍数のコアで実行する必要があります。
x86-64 - x86-64 プロセッサの NUMA ドキュメント?
X86-64 プロセッサの NUMA ドキュメントは既に探しましたが、残念ながら NUMA の最適化ドキュメントしか見つかりませんでした。
私が欲しいのは、システムで NUMA を初期化する方法です (これには、システムのメモリ トポロジとプロセッサ トポロジの取得が含まれます)。X86-64 AMD および Intel プロセッサの NUMA に関する優れたドキュメントを知っている人はいますか?
c++ - HWLOC を使用する NUMA システムの realloc()
さまざまなポリシーに基づいてメモリを割り当てるさまざまな手段を提供するカスタム アロケータがいくつかあります。それらの 1 つは、定義された NUMA ノードにメモリを割り当てます。アロケータへのインターフェースは単純です
割り当て自体はhwloc_alloc_membind_nodeset()
、割り当てポリシーなどに応じてパラメーターが設定されたメソッドを使用して処理されます。ただし、hwloc はメモリの割り当てと解放のメソッドのみを提供し、どのように実装すればよいか疑問に思っていreallocate()
ました。
考えられる解決策は次の 2 つです。
memcpy()
新しいメモリ領域とデータを割り当てます- ノードセットのメモリ割り当て/バインディング ポリシーを設定するために使用
hwloc_set_membind_nodeset()
し、plainmalloc()
/posix_memalign()
andを使用しrealloc()
ます。
誰かがこれを正しくするのを手伝ってくれますか?
アップデート:
質問をより具体的にしようとしています。新しいメモリを割り当てたり、ページを移動したりせずに、realloc()
使用を実行する可能性はありますか?hwloc
language-agnostic - プログラム NUMA を準備するには?
私のプログラムは共有メモリをデータストレージとして使用しています。このデータは、実行中のすべてのアプリケーションで利用できる必要があり、このデータのフェッチは高速である必要があります。ただし、一部のアプリケーションは異なる NUMA ノードで実行でき、それらのデータ アクセスには非常にコストがかかります。すべての NUMA ノードのデータ複製がこれを行う唯一の方法ですか?
multithreading - リモートNUMAメモリノードへのメモリアクセスをカウントする方法は?
最近のLinux分散共有メモリシステムで実行されているマルチスレッドアプリケーションで、リモート(非ローカル)NUMAメモリノードへのスレッドごとの要求数をカウントする簡単な方法はありますか?
PAPIを使用して相互接続トラフィックをカウントすることを考えています。これは行く方法ですか?
私のアプリケーションでは、スレッドはその存続期間全体にわたって特定のコアまたはプロセッサーにバインドされます。アプリケーションが起動すると、メモリはページごとに割り当てられ、使用可能なすべてのNUMAメモリノードにラウンドロビン方式で分散されます。
ご回答ありがとうございます。
c++ - NUMA (Non-Uniform Memory Access) の測定。観察可能な非対称性はありません。なんで?
NUMA の非対称メモリ アクセスの影響を測定しようとしましたが、失敗しました。
実験
Intel Xeon X5570 @ 2.93GHz、2 CPU、8 コアで実行。
コア 0 に固定されたスレッドで、numa_alloc_local を使用してコア 0 の NUMA ノードにサイズ 10,000,000 バイトの配列xを割り当てます。次に、配列xを 50 回繰り返し、配列内の各バイトを読み書きします。50 回の反復を実行するのにかかった時間を測定します。
次に、サーバーの他の各コアで新しいスレッドを固定し、配列x内のすべてのバイトの読み取りと書き込みを 50 回繰り返して経過時間を再度測定します。
キャッシュの影響を最小限に抑えるために、配列xは大きくなっています。キャッシュが役に立っている場合ではなく、ロードとストアのために CPU が RAM まで行かなければならない場合の速度を測定したいと考えています。
サーバーには 2 つの NUMA ノードがあるため、配列xが割り当てられている同じノードにアフィニティを持つコアは、読み取り/書き込み速度が速いと予想されます。私はそれを見ていません。
なんで?
おそらくNUMAは、他の場所で提案されているように、8〜12コアを超えるシステムにのみ関連していますか?
http://lse.sourceforge.net/numa/faq/
numest.cpp
出力
どのコアが読み取りと書き込みを行っているかに関係なく、配列x に対して読み取りと書き込みを 50 回繰り返すには、約 1.7 秒かかります。
アップデート:
私の CPU のキャッシュ サイズは 8Mb なので、おそらく 10Mb の配列xではキャッシュ効果を排除するには十分な大きさではありません。100Mb 配列xを試し、最も内側のループ内で __sync_synchronize() を使用して完全なメモリ フェンスを発行しようとしました。それでも、NUMA ノード間の非対称性は明らかになりません。
更新 2:
__sync_fetch_and_add() を使用して、配列xの読み取りと書き込みを試みました。まだ何もありません。
c - 異なるソケットにあるプロセッサ間でデータを共有する最速の方法
私はデュアルソケット8コアプロセッサを持っています。つまり、各プロセッサには4コアがあります。その仕様は完全にはわかりませんが、各プロセッサに個別のメモリバンクがccNUMA方式で接続されているため、別のプロセッサのメモリバンクからのアクセスは比較的遅いと思います。また、私が思うに、それらには異なるL3キャッシュがあります。
ここで私の質問は、2つのプロセッサ間でデータを共有するための最速の方法は何ですか。単純な共有メモリには、ccNUMAとキャッシュの一貫性が原因で問題が発生します。非常に速い方法はありますか?