いまどきのPIC (Programmable Interrupt Controller のほう)

続きでAPICの話を書こうと思ったのだけどいまどきのPICはマルチプロセッサが前提なのでそこらへんちゃんと説明しとかないと続きが書けない感じだなー。

というわけでいまどきのPICと背景をまず説明しておくのですよ。


と、いっても、つまりはマルチプロセッサの話なんだぬー。なぜかというと伝統的なPICといまどきのPICの違いは「マルチプロセッサになってるかどうか」だからなー。


マルチプロセッサと言った場合、同じCPUがたくさん並んでるのをイメージすることが多いけど、実際のメニーコアたんは非対称な部分があるので、そういうのが問題になったりする場合があるのんね。
http://enterprise.watch.impress.co.jp/img/epw/docs/170/127/html/intel06.jpg.html この図とかがわかりやすくて、同じアドレス空間にあるメモリでも遠かったり近かっかたりするとかの。
同じ問題がI/Oにもあって上のNehalemの図だと、左下のやつは2hopしないと右上のIO HUBには届かないんよね。

で、次の図だがー、

この図は全く意味が無いので忘れてもらうとして、IO HUBは外部割り込みを発生させるので、「割り込みを近くに送るか、遠くに送るか?」という問題が発生する、っというわけですよ。


基本的には近くのCPUに送るといいけど、近くのCPUが超忙しくて、遠くのCPUが超ヒマなときに、わざわざ近くのCPUに割り込みを送る必要は無いわけ。
ここで、「I/O側の割り込みコントローラはどこへ割り込みを送ればいいか?」を設定できる必要が出てくるわけで、PCでいうと「I/O APIC」と呼ばれるのが、これをやってる割り込みコントローラというわけだなー。


以上で話は終わりなのですが、ここで、描いたものの、使い途がなかった図があるので、勿体ないから説明しておくと、今どきのマシンのマルチCPU構成は、「どのレベルでマルチプロセッサになってるか?」というのは結構重要な問題ですねー。
今のところ、一般的な区分として、

  • NODE : 上で説明したように、メモリとかIOとかに対称性が無いような構成(NUMA:Non Unified Memory Architecture)のとき、その単位をノードと呼ぶ
  • Processor : メモリとかIOとかに同じようにアクセスできる単位
  • Core : キャッシュ共有してる
  • Thread : 実行ユニットを共有してる

というのがあるなー(あまりちゃんとした定義が無いので人によって違うかも)


で、この、「スレッド」単位でIDが振ってあって、そのIDで「割り込みを送る対象」を指定するアーキテクチャが多いように思うですよ。

この図もあまり意味が無くて、http://www.intel.co.jp/jp/download/index.htmIA-32 インテル® アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、下巻: システム・プログラミング・ガイド」の図8-2を見たほうがわかりやすいです。


あと、 http://www-01.ibm.com/chips/techlib/techlib.nsf/techdocs/1741C509C5F64B3300257460006FD68D これの243pを見ると、Cell/B.E.も同じようになってることが確認できますなー。External Interruptsがひとつあって、2つのPPE threadのどっちかに割り込みを送るというようになってるのを確認していただけると嬉しいですなー。
ただ、Cell/B.E.はPCと違って「チップの中に外部デバイス(SPE)が存在してる」という事情があるので、割り込みが多段階になってることが多いと思われますね。
上のPDFの図はチップ内しか書いてないのでExternal Interrupt と IIC の2段階に見えますが、実際にはこの外にもう一段外部IOチップがぶら下がってる(と思われる)ので、3段階の割り込みコントローラが存在することになってるなー。


ノードが複数あるときのCell/B.E.の構成について説明してある http://www.ibm.com/developerworks/power/library/pa-qs21perf/index.html?S_TACT=105AGX16&S_CMP=EDU とか読むと、

  • CPU内の割り込みを処理するIIC
  • チップ内の割り込みを処理するExternal Interrupt
  • サウスブリッジ


の三段階になってることが推測できますなー。(サウスブリッジの割り込みはどこにも説明が無いが)

PCの場合だと、チップ内に変な割り込みを出す外部デバイスは無いので

  • CPU内の割り込みを処理するLocal APIC
  • サウスブリッジに付いてるI/O APIC

になってる、というわけですね。(PCI上にISAが刺さってたころは3段階なのかもしれん。知らんが)

なんか色々と話に飛躍があって、Local APICについて説明してないとか、これだとノースブリッジについてるPCI Express x16の割り込みが説明できないとかなので、きっとどっかの理解が甘いと思うのだよなー。


眠いので寝ます。

まとめ

いまどきの割り込みコントローラは、外部チップごとに外部割込みコントローラ、ハードウェアスレッドごとにCPUの割り込みコントローラがついているという構成が多い。

明日はPCのCPU側の割り込みコントローラ、Local APICについて書く(予定)です。