4

カーネルによって再スケジュールされるたびに pthread に関数を実行させるにはどうすればよいですか?

スレッドがスケジュールされている物理 CPU/ソケット (論理コアではない) を特定する必要があり、常にこれを実行する余裕はありません。

ウェイクアップ ルーチンをフックして、スレッドが実際に再スケジュールされている場合にのみ TLS に必要な更新を行うことはできますか?

これが必要な理由: スレッドごとに 70ns ごとに AMOs appx を実行するコードがありますが、アドレスが別のソケットにキャッシュされていない場合は問題ありません。同じコードを 2 つのソケットに展開すると、キャッシュが頻繁に無効になるため、パフォーマンスに 15 倍の影響があります。特に、同じ L3 キャッシュを実行しているスレッド間でのみ共有されるメモリを割り当てるつもりです。そのため、実行しているソケットを特定し、正しいメモリ ブロックをアドレス指定する必要があります。明らかにsched_getcpu、これを呼び出して の物理 CPU ID と比較できます/proc/cpuinfoが、これはかなり大きなオーバーヘッドです。ただし、スレッドごとにスレッド プライベート メモリを割り当てる余裕はありません。コストが高すぎます。

4

1 に答える 1

1

Linux Kernel Development, Third Editionで読んだことから、必要なものに対してカーネルによって提供されるサービスもインターフェイスもありません。pthread_setaffinityを使用する(上記で@osgxによって提案されているように、またはより最近の Linux カーネル実装ではpthread_setaffinity_np ) か、最初に CPU ソケットごとに TLS キーをキャッシュする (上記で@cafによって提案されているように) ことは、おそらくその方向で使用する最良の方法です。 .

于 2012-12-08T20:08:54.523 に答える