Dual Socket な PC の割り込みに付いて

 今回は、PCの割り込み(Interrupt)処理に付いて、基本的な所から Dual Socket での割り込み処理までを簡単にまとめてみます。(基本的には自分用メモで、現在編集中です)

 筆者の知る割り込み処理には大きく分けて3タイプ(ソフト割り込み、ハード割り込み、NMI(強制割り込み))が有りますが、今回の記事の対象はI/Oデバイスのハード割り込みに付いてです。余談ですがソフト割り込みは例外処理とも言われ代表的なものにNullPointerExceptionなどが有ります。

 発端は 先日の記事 です。
 例えば下図の様なNUMA構成でCPU1で動作しているアプリがCPU2のI/Oバスに接続されたデバイスを利用する場合、割り込みの経路やドライバとの関係に付いて詳しく調べようと思った訳です。
NUMA-Z.png

 ハード割り込みは、主にデバイスの状態通知(データ転送完了通知など)やデバイスへの要求通知(データ転送要求など)をソフトウエア(OS)との間で行う手段として利用されます。その為、割り込み処理を行うのは主にデバイスドライバという事に成り、その骨格(フレームワーク)はOSが担っています。デバイスドライバはISR(Interrupt Service Routine)によって割り込み要求を受け取ったCPUコアで実行・処理されます。

デバイスドライバとCPUコアの紐付け
 ※英語ではAffinity(又はBind)と言いますがMSはAffinityを「関係」と意訳している様です。筆者は「紐付け」と意訳してみました。
 先日の記事で紹介しました Interrupt Affinity Policy ツール(Vista以降) 又は Interrupt affinity filter ツール(Win2000以降)(FTPサイトがリンク切れでDownLoad出来ない場合は[MD5:3CC85F0DDDD44865D8469C2E75500A97]と合致するIntFiltr.zipファイルをネット上で探して下さい)は、主にマルチソケット環境でチューニングをする際に利用するツールですが、シングルソケットであっても 「デバイス-A で発生した割り込みを CPUコア-B に処理させる」といった設定が出来ますので、チューニングを行う際には活用できそうです。例えばマルチコアCPUではキャッシュを共有するコアと共有しないコアが有ったりしますので、極力キャッシュを共有するコアに目的のアプリとデバイスドライバを集約する事で高速化するケースが有ります。CPU負荷自体がそれほど高くない場合は単独のコアに目的のアプリとデバイスドライバを集約してL1を共有させた方が早くなる事もあります(CPU負荷が高い場合は逆効果に成ります)。但し、IRQを他のデバイスと共有している場合は紐付け設定が出来ませんのでIRQをデバイスと一対一に対応付ける事が前提に成ります。
 キャッシュとCPUコアの関係はCoreinfo -lで確認出来ます。
 紐付けの具体的な方法は先日の記事でUSB3.0を例に解説しております。このケースではチューニングの効果で30%以上の高速化に成功しています。

 アプリとCPUコアの紐付けはStartコマンド(Vista以降)又はIMAGECFG.EXE(NT4.0~XPの32Bitアプリ専用)で行います。
 Vista/2008でのコマンドライン
  C:\Start /AFFINITY [CPUコア@16進数] [アプリ]
 Win7/2008R2でのコマンドライン
  C:\Start /NODE [NUMA-node] /AFFINITY [CPUコア@16進数] [アプリ]

 Win2003-64Bit及びXP-64Bitではタスクマネージャで「関係の設定」を行う以外にアプリとCPUを紐付ける方法が無さそうです。但しIMAGECFG.EXEはEXEバイナリ自体を変更する為、NT4.0~XP世代のOS向けにコンパイルされた32BitアプリはIMAGECFG.EXEで恒久的な紐付け設定が出来ます。それをVista/7や64Bit-OSで実行した場合には紐付けが有効です。逆に言うとIMAGECFG.EXEは64BitバイナリやNT6.0以降の32Bitバイナリに対応していません。対応していない64BitやVista以降のEXEバイナリに対してIMAGECFG.EXEを実行してしまうと起動不可なゴミバイナリに成ってしまうので要注意です。IMAGECFG.EXEを使う場合はアプリ本体ではなくコピーしたテスト用EXEファイルで試してからにして下さい。という事で、調査しつつIMAGECFG.EXEと同様の機能で64BitやVista以降のバイナリに対応可能なツールを製作してみとうかと思っています(協力頂ける方は連絡下さい)。余談ですがIMAGECFG.EXEはマルチコアに未対応の古いアプリを恒久的にマルチコア環境でも実行可能なバイナリに改造するツールとも言えそうです。

以下、話を割り込みに戻します・・・

PC/AT互換機の標準的なIRQ
 IRQ 00 システムタイマ
 IRQ 01 PS/2 キーボード
 IRQ 02 IRQ 09へのカスケード接続/古いPCではISAデバイスが利用
 IRQ 03 シリアルポート2(COM2/COM4)
 IRQ 04 シリアルポート1(COM1/COM3)
 IRQ 05 プリンタ(LPT2)/オーディオ・サウンド
 IRQ 06 Floppy controller
 IRQ 07 プリンタ(LPT1)
 IRQ 08 リアルタイムクロック
 IRQ 09 IRQ2へのリダイレクト(兼 APIC SCI)
 IRQ 10
 IRQ 11

 IRQ 12 PS/2 マウス
 IRQ 13 数値データプロセッサ(8087コプロセッサ互換)
 IRQ 14 ATA Channel 0 / IDE Primary
 IRQ 15 ATA Channel 1 / IDE Secondary
 IRQ 16APIC搭載システムとWindowsNT系OSの組み合わせで利用可
 IRQ -2MSI搭載システムとWindowsVista以降のOSで利用可

 赤字のIRQは基本的には変更不可です。
 緑字で示したIRQはPC/ATとの互換性を保ったままPCIカードに割り当て可能です。
 青字のIRQはCOMやLPTなどのPC/AT標準デバイスを無効にする事で互換性を大きくは崩さずに他のデバイスに割り当て出来る可能性が高いのですがBIOSやFirmwareやチップセット次第でもあり、古いソフトではデバイスが存在しなくても固定的に利用しているものもあり誤動作の可能性が有ります。
 IRQ 02 と IRQ 09 はカスケード接続なので、どちらか片方を利用する場合、もう一方は利用出来ません。IRQ 02 は古いISAカードで固定的に利用されていた経緯から古いPCでは予約的な位置づけで利用される事が有る様で、この場合は IRQ 09 が利用出来ません。逆にAPIC世代では SCI (System Control Interrupt) に利用されますので IRQ 02 が利用出来ません。
 橙色のIRQはPC/ATとの下位互換は無く、後に追加されたAPICやMSIの導入で拡張されたIRQです。従いましてAPICやMSIに未対応のマザーやOSやドライバでは利用出来ません。

PIC(Programmable Interrupt Controllers)
 IBM PC/ATに搭載されていた割り込みコントローラです。PICを使ったシステムでは上記のIRQ15までしか利用出来ません。

APIC(Advanced Programmable Interrupt Controllers)
 APIC(ACPIとスペルが似ていて間違いやすいですが別物です)は古くはSocket7のDUAL SOCKETシステムにチップセットの1つとして搭載され、ハード的な割り込み制御の要(かなめ)を担っています。それ以降のDualSocketマザーには概ねAPIC互換機能が搭載され続け、マルチコアが一般的に成った現在ではほぼ全てのPC用マザーにAPIC互換機能が搭載されAPICはハード割り込みの中核的存在に成っています。
 PC/ATの完全互換を目指す場合はAPICではなくPIC(Programmable Interrupt Controllers)になりますがPICには複数CPUに対応する機能が不足していた為にAPICが導入された経緯が有り、DualSocketのみならずDualCore以上のCPUではAPICが必須になります。但しAPICを搭載したシステムでも下位互換目的でBIOS/UEFIやジャンパでAPICとPICを切り替え可能なマザーもあります。
 IBM PC/ATに搭載されていたPICではIRQ15までにしか対応していませんでしたのでIRQシェアリング/IRQステアリングの様な機能が追加され複数デバイスでIRQを共有しているシステムも有ります。対してAPICを搭載したシステムではIRQ 16以上を個々のデバイスに個別に割り当て可能に成りました。但し、APICを搭載していてもチップセットの制限や回路を省略した結果IRQを共有していたり、複数CPUに対応していないWindows9x/Meの時代にはAPICを搭載しながらも互換性維持や回路を省略した為IRQ 15までしか利用出来ないマザーもあり、OSやドライバが未対応だった為にデバッグが進まずAPIC関連のBIOSにバグが存在する事が多い様です。
 下のスクリーンショットはAPICを搭載した430HXチップセットのSocket7マザーGIGABYTE GA-586DX Rev.3BのIRQです。
ResourceGA586DX_IRQ.png
 この様に1997年の古いマザーボードでもAPICを搭載しているものはIRQ 16以上の割り当てが可能で、個々のデバイスに対して個別のIRQを設定出来ます。

xAPIC(Extended APIC)
 Netburst世代(Pentium4)以降のAPIC実装。専用の4Bit APICバスを廃止しFSBに統合したもの。FSBと統合した事に伴い、もっさりの原因ではないか?と言われる事も有ります。名称はExtendedですが、実質的にはバス統一に伴うマザーボードの製造コスト削減と思われ、ソフトウエア面では互換性を維持していますが Low Priority Mode が機能削除されている様でます。

x2APIC(Extended APIC)
 Nehalem世代(Core i7/5/3)以降のAPIC実装。64Bit化に伴い20億個(40億とも)までの超並列CPUまで対応。
 未対応OS向けの設定としてBIOS/UEFIにてx2APICとxAPICの切り替えが出来るものが多い。

ACPI(Advanced Configuration and Power Interface Specification)
 APICの次にあえて名前の似ているACPIを持ってきました。
 MSのHPに詳しい記載が有ります。
 ACPI = 電源管理だと誤解されがちですが(筆者も最近まで誤解していましたが)名前の通り「構成と電源I/F」に付いて規定された規格でThe ACPI Specificationとして公開されています。
 ACPIでは様々なハードウエアの構成や設定をBIOS/UEFIからOSへ通知するテーブルが有り、電源のみならず全てのハードウエア構成や設定に関与していて、割込みに付いても例外ではありません。
 ACPIテーブルの中には先述のAPICに関する情報も含まれていてRW utilityで確認する事が出来ます。特にNUMAでのACPIに付いては別の記事で書いていますので参考にして下さい。

NUMAシステムにおける割り込み
 NUMA以前の(SMP/UMA)システムでは、1つのIO-APICと、個々のCPUコア内に有る複数のLocal-APICが共同して割り込みをハード的に処理していましたが、NUMAではNUMA-node毎にIO-APICが存在し個々のNUMA-nodeが同時並列的に処理している様です。実際、筆者所有のNUMA機にはIO-APICが2個搭載されている事が確認出来ました。確認方法はRW utilityを使ってACPIテーブル群の中にあるAPICテーブルを見ると判ります。
 OSはNUMA-node毎に発生する割り込みをリダイレクトする事で別のNUMA-nodeに対してISR(Interrupt Service Routine)とデバイスドライバを実行させる事が出来る様に成っている様です。冒頭の Interrupt Affinity Policy ツール等で物理的な接続状態に関わらず割り込みを処理させるNUMA-nodeやCPUコアを任意に設定可能です。

バス規格と割り込みに付いて
 ハード割り込みの仕組みは、バス規格毎に方式が異なりますが、今回はPCIとPCI-Expressに付いて主に扱い、後ほどISAに付いて追記するかもしれません。

PCI Rev2.1:
 PCIバスには INT A# ~ INT D# の4本の信号線が有り、バス本体とは非同期に割り込み信号の伝達が可能です。これは上位互換の64Bit-PCIや、更に上位のPCI-Xでも同じです。また派生規格のAGPも基本的には同じINT線形式ですがAGPの場合はINT A#のみのマザーやINT A#とINT B#しか無いケースが多い様です。(AGPは基本的にはGPUのみの単機能ですが、ATI ALL-IN-WONDER の様にキャプチャ機能やIEEE1394を搭載している物や、ATI Radeon HDの様に音源も内蔵した多機能AGPカードも実在します)
 このINT A# ~ INT D#がBIOSやPnPによってIRQを割り当てられ、その情報がESCD(Extended System Configuration Data)に格納されBIOSのいわゆるCMOSやNVRAMと言われるボタン電池で保護された不揮発メモリ領域に保存されます。従いましてESCDに不備が有るとIRQの衝突が起きたり、正常動作しなかったりしますのでボタン電池を交換したり、CMOSクリアをしたりする訳です(ESCDとACPIの関係に付いては調査中です)。
 この世代のAPICを搭載していない(つまりPICを搭載した)一般的なPC/AT互換機のINT結線は下図の様な状況で、AGPとPCI Slot1や、PCI Slot4と5が同じINT A#を共有する為、IRQの衝突が起き易い構造に成っています。(これは一例であって異なる場合があります)
PCIINTIRQ.png
 Onbord NIC INT B#
 OnBord USB INT C#
 OnBord Audio INT D#

 INT A# -> IRQ 11
 INT B# -> IRQ 10
 INT C# -> IRQ 09
 INT D# -> IRQ 05

 単機能のPCIカードはINT A#のみ利用する物が主流でIRQの衝突が起き難いのですが、複数の機能を搭載したマルチファンクションなコンボカードではINT A# ~ INT D#を機能数と同数またはそれ以上に利用する物が有ります。例えばUSB2.0/IEEE1394コンボカード等です。こういったマルチファンクションカードは他のPCIスロットのINT A#と同じINT線を利用する為、IRQの衝突が起き易くなります。
 PCI規格ではINT A# ~ INT D#の信号線を他のPCIカードと共有しない様に結線する事も出来ますがPC/AT互換機では互換性を保つ目的に加えコスト削減目的もあり、上図の様に全てのPCIスロットでINT線を共有しているのが一般的でした。但しDual Socketのシステムでは、先述のAPICを導入して個々のスロットに個別に結線しているものや64Bit-PCIやPCI-Xなどの別系統のI/Oバスが有りINT線を共有しない或いは部分共有のシステムが多々あります。
 INT線にどのIRQを設定可能かはBIOS及びチップセットで決まります。INT線を共有するPCIデバイス同士は必然的にIRQも共有します。逆にチップセットやBIOSの制限でINT線は共有していなくてもIRQを共有する場合があります。例えば互換性を最重視してPCIカードにはIRQ 10と11しか割り当て出来ないマザーも有ります。
 INT線及びIRQを共有する為の仕組みとしてIRQシェアリング/IRQステアリングが有りますが、全てのデバイスのハード/Firmware/デバイスドライバが規格に則り正しく対応しているとは限らず、また、頻繁な割り込みを必要とするデバイスでは規格通り製作されていても性能面でINTやIRQを共有することが難しいケースも有り得ます。特に映像や音楽などのリアルタイム性やシンクロ率を極限まで追求するデバイスでは結構シビアな問題と思われます。

PCI Rev2.2以降:
 PCI Rev2.2からは、以前のINT方式に加えてMSI(Message Signaled Interrupt)も導入されましたが、この世代のPC/AT互換機は基本的に前世代を踏襲しています。

 MSI(Message Signaled Interrupt)
 MSIはINT A#~D#を利用しない新しいタイプの割り込み方式で、MSIではIRQがマイナス値に成り構造的にIRQ競合が発生しない仕組みに成っています。INT線を使わない新しいタイプではありますが割り込みの伝達にAPICを利用する点では以前の割込み処理と共通しています。
 MSIは元々は主にSUN Microsystem社のSolaris向けデバイスにフォーカスして考案された仕組みの様でPC/AT互換機とは別の流れで発生した様です。筆者が利用していた頃のSUN SPARCstationはSBusカードでしたが、後に製造コスト面からPCIに切り替えた経緯が有り、その際にPCI Rev2.2で新たに策定された様です。
 MSIはINT A#~D#を利用せずIRQの競合が起きませんが、発生の経緯や互換性の問題からPC/AT互換機では当初は利用されていませんでした。従いましてPCI Rev2.2以降のデバイスに必ずMSIが搭載されている訳ではなく規格上も必須ではない様です。加えてWindowsでMSIを利用出来るのはVista/2008以降ですから、例えばWindowsXPやMSI未対応のPCI/PCI-ExpressカードはINTやINTx emulationで処理され、IRQ競合が起きるケースが有ります。
 MSIが搭載されているデバイスの場合Windows Vista以降のデバイスマネージャで確認するとIRQがマイナス値に設定されていますのでMSI搭載デバイス(かつMSIが利用できるシステム)かどうかの判断に利用出来ます。下のスクリーンショットの例ではRenesas製のUSB3.0がMSI対応している事が判ります。
 IRQ_NO15_2.png
 PC/AT互換機では、電源投入からPOST(Power on self test)が終了するまでは下位互換の為にINTで処理され、Vista/2008以降のOSでは起動過程でMSIに切り替わるのではないかと思われます(調査中・要確認)

PCI Rev3.0以降:
 PCI Rev3.0からは、以前の方法に加えてMSIを拡張したMSI-X(Extended Message Signaled Interrupt)も導入されましたが、この世代は既に主流がPCI-Expressに移行しつつある過渡期です。

 MSI-X(Extended Message Signaled Interrupt)
 MSI-Xは名前の通りMSIを拡張したもので、Windowsでは大きく別けて2種類の拡張が有る様です。

 1:ネットワークのポート単位でCPUコアの割り当てが可能
 2:デバイスに近いNUMA-nodeを自動選択して割り込み可能

PCI-Express:
 PCI-ExpressではPCIのINT線の様な専用の割り込み信号線は無く、通常のI/Oバス経由で割り込み通知が行われます。とは言え下位互換の為にPCIのINT線にソフト的な互換性を持たせたINTx emulationで処理されます。INTx emulationとAPIC及びACPIの組み合わせにより個々のデバイス毎に独立してIRQが割り当て可能に成りましたが、これだけでは依然として部分的にIRQを共有している事が有る様です。
 本格的にデバイスとIRQが一対一の対応に成るのはPCI Rev2.2で導入されたMSI及びPCI Rev3.0からのMSI-Xからの様で、PCI-ExpressもMSI/MSI-Xを継承していて、WindowsVista/2008以降のOSでMSI/MSI-Xが利用出来ます。但し全てのPCI-ExpressカードがMSI/MSI-Xに対応している訳ではないのはPCIと同様な様です。

省電力機能と割込み
 負荷を分散するという考え方とは対極的に、負荷を幾つかのコアに集中させて省電力機能により稼動していないコアを個別に休止させるという考え方が有ります。負荷を分散すれば発熱も分散出来るので局所的に疲労して寿命が縮まったりする事も無いけれど、負荷が平均的に掛かるのでコアを個別に休止させるのは難しそうです。こういったポリシーの場合は、どのコアに割り込みを掛けるかは、専らパフォーマンスに注視していれば良さそうですけれども、省電力にも配慮して幾つかのコアを休止させている場合には、休止しているコアへ割り込みを掛けるのはナンセンスだと思います。わざわざ寝ている人を起こして仕事をさせる様なもので寝ぼけている間のレイテンシが発生するし、寝かせた意味が無いと思います。その為、比較的負荷の低い状態かつ眠っていないコアへ割り込みを掛けるのが良さそうですけれども、そういったインテリジェントな設定方法を筆者は知らないのです。そもそも自作PCで省電力機能を完璧に実現するのはなかなか難しい上に、省電力状態からの復帰に失敗した時の残念な感じを味わいたくない筆者は、メーカー製のモバイルPCでしか省電力機能を使っていません。機会が有れば省電力と割り込みに付いて調査・検証してみたいとも思いますが・・・
関連記事
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

DualSocketTheWorld

Author:DualSocketTheWorld
自作を始めて20台目くらいになりますが、最初からデュアルソケット限定(始めた当時はデュアルスロット)で自作しており、近年になってAMD K6を試したくなりSocket7でK6-2+のシングル構成で組んだのがシングル初です。

シングルマザー(含:シングルソケットマルチコア)や4ソケット以上の自作は基本的にしませんし、メーカー製PCの改造も基本的にはしません(ノートPCのSSD化くらいはしますが・・・)

基本路線はワークステーションと呼ばれる分野での自作で、OSもWindows系であればProfesionalが主な対象に成ります。

ゲーマーの様なOverClockは行わず、WS路線としてハイエンドCPUとハイエンドGPUの組み合わせで定格或いはDownClockで発熱を抑えつつ、その時のアーキテクチャに置いて爆速かつ静音を目指し、30年以上の長期に渡り稼動状態をキープする事を目指します。

※基本的にリンクフリーです。どこでも自由にどうぞ。

※画像は時々変ります。

※お決まりの文章ですが、改造は個人の責任で行ってください。ここに記載された情報は間違いを含んでいる可能性が有り、それを元に製作や改造などをして失敗しても筆者は一切責任持てませんので悪しからず。

筆者略歴:
小学生時代にゴミ捨て場で拾ったジャンクテレビ数台を分解して部品を取り出し真空管アンプを自作、中学生時代にPC8801mkⅡsrでZ80アセンブラを始める。社会人になって初のプログラムは弾道計算、後に医療系・金融系プログラマ~SEを経て100~200人規模プロジェクトのジェネラルマネジャを数年経験、独立して起業。現在は不動産所得で半引退生活。
(人物特定を避ける目的で一部経歴を変更しています)

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR