カーネル・スレッドのコアの割り当て | 並列化フォーラム | フォーラム

iSUS に投稿されている記事の内容や、IA プラットフォーム上でのソフトウェア開発に関するトピックを開発者同士でディスカッションできる場としてフォーラムを公開しています。

運営ルールはフォーラムの利用案内をご覧ください。
フォーラムの使い方はこちら

 
フォーラムに投稿するにはログインが必要ですログイン

カーネル・スレッドのコアの割り当て

メンバー投稿

3:35 PM
2013年9月4日


yoshihingis

投稿数 54

1

 初歩的な質問で申し訳ありませんが、Windows7でマルチスレッド動作させた時の、コアの割り当てについて質問したいことがあります。
 通常、ユーザー・スレッドは、スケジューラーが負荷を見て、適当なコアを割り当てると思うのですが、カーネルスレッドは関してはどうでしょうか?
 実は、ndis.sysを使用してネットワーク通信をさせるプログラムでコアの割り当てを見るとndis.sysは常にコア0で動作しています。
 ndis.sysにコア0以外のコアが割り振られることはないように見えるのですが、カーネル・スレッドは、このような特定のコアしか割り振られないケースがあると考えてよろしいのでしょうか?
 どなたかご存知の方がいましたら、ご教授頂ければ幸いです。

6:31 PM
2013年9月4日


iSUS編集部 – 菅原

投稿数 206

2

yoshihingis さん

こんにちは。ndis.sys 等のカーネルモジュール内もスレッドセーフに作られており、同一プロセスIDを持つ複数のスレッドが、複数のコアで動作することはあるかと思います。

VTune Amplifier XE 2013 で、該当プログラムをプロファイルして、「Bottom-up」表示で、Grouping を「Core/Thread/Function/Call Stack」を選択し、画面下のフィルター Module に「Ndis.sys」を設定すると、どのように動いているかわかります。

どうぞ、お試しください。

8:05 AM
2013年9月5日


yoshihingis

投稿数 54

3

菅原様、回答ありがとうございました。
 ご助言のとおりVtune amplifier XE2013でプロファイルを取ってみたいと思います。

8:16 AM
2013年9月19日


yoshihingis

投稿数 54

4

ご助言通り、Vtune amplifier XE2013でプロファイルを取ったところ、ndis.sysは、いろいろなコアに割り当てられていることが分かりました。
 しかし通信動作をしているときは、常にndis.sysはCore0で動作しています。
 サーバーから画像データを受信して、クライアント側で画像処理して、表示させるとプログラムで、サーバーからは33msec毎に画像データが送られてきます。
 画像処理はパイプライン構造となっております。CPUは6core corei7-3960xです。
 通信プログラムは軽い処理なのでアイドル状態のことが多いのですが、このような時は、いろいろなコアに割り振られているのですが、サーバーと通信するときは、ndis.sysは常にcore0に割り振られています。
 ネットワークカードを数種類変えてみましたが、症状は同じです。
 OSはWindows7 proです。

 通信動作の時は、常にcore0で動作するというのは、ndis.sysの仕様なのでしょうか?
 もし、ご存知の方がいましたら、教えて頂ければ幸いです。

 マルチポスト的になってしまいますが、CPUというより、OSの仕様の問題かと思い、マイクロソフト(MSDN)のフォーラムでも質問してみましたが、全く回答がありません。

 以上よろしくお願いいたします。

2:14 PM
2013年9月19日


iSUS編集部 – 菅原

投稿数 206

5

Windows は、SMPカーネルなので、マスターCPUとかカーネル専用CPUという考え方は、無いかと思いますが、近年NUMAの登場により有利な割り当てが存在するのも事実です。

また、Windows7(64ビット)以降では、ユーザーモードスケジューラー(UMS)がサポートされているので、カーネルモードのサービスのスレッドコンテキストを切り替えることなく、ユーザーモードのみの切り替えもサポートされていることから、優先順位の高いモジュールがいったん割り当てられた後、見た目同じ場所で動いているかもしれないですね。

以下の記事も参考になるかと思います。

http://blogs.msdn.com/b/masaki…..duler.aspx

http://www.atmarkit.co.jp/fwin…..n4_02.html

3:07 PM
2014年1月10日


yoshihingis

投稿数 54

6

2014年初投稿です。今年もよろしくお願いいたします。通信処理時、ndis.sysがCore0で動作しようとするのは、どうやらインテル製のnicだけであることが分かりました。
 RealtekやBroadcom製のnicだと通信処理時も、core0だけでなく、いろいろなコアで動作することが確認できました。
 インテル製のnicのドライバーが、何かの理由で、ndis.sysを、core0で動作させるような仕様になっているのかもしれません。
 この辺になると、ドライバーが関係してくるので、本来のCPUの最適化、並列化の話から外れてしまいますが、とり急ぎ、確認できたことをお知らせしておきます。

2:22 AM
2014年1月14日


iSUS編集部 – 菅原

投稿数 206

7

yoshihingis 様

今年もよろしくお願いします。インテルNICのドライバーもREADMEに関連しそうな記述をもつけました。

Setting the "RSS load balancing profile" Advanced Setting to "ClosestProcessor" may significantly reduce CPU utilization. However, in some system configurations (such as a system with more Ethernet ports than processor cores), the "ClosestProcessor" setting may cause transmit and receive failures. Changing the setting to "NUMAScalingStatic" will resolve the issue.

また、マイクロソフトのサイトにも同様の記述がありました。参照ください。

http://technet.microsoft.com/j…..x#bkmk_rss