割り込み(Interrupt)とDMA(Direct Memory Access)
1. 概要
割り込み(Interrupt)とは、CPUがプログラムを逐次実行している途中で、入出力完了・例外・外部信号など即座に処理すべき事象が発生した際、現在の実行フローを一時中断して事象処理ルーチン(ISR)へ制御を渡し、その後元の位置へ復帰する非同期制御転換メカニズムである。DMA(Direct Memory Access)とは、大量の入出力データをCPUを経由せず、I/O装置と主記憶装置の間で専用コントローラが直接転送させることで、CPUをデータ複写という低付加価値作業から解放する入出力技法である。
割り込みとDMAが登場した背景は、CPUと入出力装置の間の速度不均衡(speed gap)にある。CPUはナノ秒単位で命令を処理するが、ディスク・ネットワーク・キーボードのような周辺装置はミリ秒からマイクロ秒単位で動作するため、両者の間には数千倍から数百万倍の速度差が存在する。初期のコンピュータが用いたプログラム制御入出力(Programmed I/O)は、CPUが装置の状態レジスタを繰り返し読んで完了を待つポーリング(polling)方式であったが、この場合CPUは遅い装置が準備されるまで何ら生産的な仕事をできず、ビジーウェイト(busy waiting)に数億サイクルを浪費する。ディスク一ブロックを読む数ミリ秒の間にCPUが数百万個の他の命令を処理できるにもかかわらず、それをすべて捨てるのである。
割り込みはこの浪費を「装置が準備できたらCPUに知らせてほしい」という事象駆動(event-driven)方式で解決する。CPUは入出力を要求した後すぐに他の作業へ転換し、装置が完了すると割り込み信号を送ってCPUの注意を引く。これによりCPUサイクルの浪費が除去され、マルチタスク・リアルタイム応答の土台が整う。しかし割り込みだけでは不十分であり、データ転送そのもの(メモリ↔装置バッファのバイト移動)は依然としてCPUが行わなければならないからである。1KBを転送するにはバイト(またはワード)ごとに割り込みが発生するかCPUがループを回らねばならないため、高速・大容量転送では割り込み処理のオーバーヘッド自体がボトルネックになる。
ここでよくある誤解を一つ正す必要がある。割り込みはデータ転送量を減らす技術ではなくCPUが待つ時間をなくす技術であり、DMAはCPUが転送に費やす労働をなくす技術である。割り込みだけを使えばCPUは待ちはしないが、転送単位ごとに起きてバイトを自ら運ぶ。DMAだけを使い完了をポーリングで確認すれば転送労働はないが、完了を待つためにCPUが再び縛られる。二つの技法が結合されて初めて、CPUが「待ちもせず、運びもしない」理想的な入出力が完成する。この相補性を前提に以下の各メカニズムを見る。
DMAはまさにこの点を補完する。「転送開始」と「転送完了」だけCPUが関与し、その間の実際のバイト移動はDMAコントローラ(DMAC)が専任する。結果として割り込みは「CPUを待ちから解放」し、DMAは「CPUをデータ複写から解放」する。二つの技法は競争関係ではなく相互補完関係であり、現代のあらゆる高性能入出力経路(NVMe SSD、100GbE NIC、GPU)は「DMAでブロックを丸ごと転送し、転送が終われば割り込み一回でCPUに知らせる」という組合せで動作する。以下で各メカニズムの内部動作と相互作用を深化水準で扱う。
2. 割り込みの処理メカニズム
割り込みが発生するとCPUは現在の命令の実行を終えた直後(命令境界)に割り込みサイクルへ進入する。核心は「中断された地点へ正確に戻れなければならない」という透明性(transparency)要求であり、そのために現在の文脈(context)を保存してから復元する過程が必ず伴う。この過程が狂えば割り込みはプログラムを汚染するバグとなるため、ハードウェアとオペレーティングシステムが精緻に協力する。
この透明性を保証する責任はハードウェアとソフトウェアに分かれる。ハードウェア(CPU)は命令境界の識別、PC・PSWの自動保存、ベクタテーブルを通じた分岐までを担当し、ソフトウェア(ISR)は自らが破壊する汎用レジスタの保存・復元と実際の事象処理を担当する。この分担が曖昧だと、ISRが一般コードの使っていたレジスタを上書きし、復帰後にプログラムが誤動作する。そこでコンパイラ・オペレーティングシステムはISRに対し呼出規約(calling convention)とは異なる特殊規則(使用する全レジスタの保存、再入可能なように局所状態のみ使用)を適用し、C言語でもISR関数はinterrupt属性や別個のプロローグ/エピローグで区別してコンパイルする。
典型的な割り込み処理手順は次のとおりである。第一に、装置が割り込み要求(IRQ)信号を割り込みコントローラ(例:x86のAPIC)へ送る。第二に、コントローラが優先順位を判定してCPUのINTRピンを活性化する。第三に、CPUは現在の命令を終えた後、割り込みを受容するか(マスクの有無)を点検する。第四に、受容すれば現在のプログラムカウンタ(PC)と状態レジスタ(PSW)をスタックに保存し、さらに汎用レジスタを保存する(一部はISRが保存)。第五に、割り込みベクタテーブルから当該割り込み番号に対応するISRアドレスを読んでPCに積載する。第六に、ISRが実行されて装置の状態を確認し必要な処理を行った後、コントローラに完了を通知(EOI、End Of Interrupt)する。第七に、保存した文脈を復元しIRET命令で中断地点へ復帰する。
flowchart TB
START["プログラム正常実行"] --> CHK{"命令境界で割り込み確認"}
CHK -->|"要求なし"| START
CHK -->|"要求あり"| MASK{"割り込み活性化状態?"}
MASK -->|"マスクされている"| START
MASK -->|"許可"| SAVE["文脈保存(PC·PSW·レジスタ)"]
SAVE --> VEC["ベクタテーブルからISRアドレス取得"]
VEC --> ISR["ISR実行(装置処理·EOI通知)"]
ISR --> REST["文脈復元"]
REST --> IRET["IRETで中断地点へ復帰"]
IRET --> START
ここでベクタ型割り込み(vectored interrupt)の役割が重要である。初期の方式は一つのISRが全装置を巡回照会(polling)して原因を探したが、これは装置数に比例して遅延が増える。ベクタ型は装置が割り込みとともに自らの識別番号(ベクタ)を提供し、CPUがベクタテーブルから直ちに当該ISRへ分岐するようにする。例えばx86は256個のベクタ(0255)を持ち、031はCPU例外、32以上は外部装置に割り当てられる。この構造のおかげで数百個の装置があっても割り込み応答時間(interrupt latency)が一定に保たれる。
リアルタイムシステムを設計する際は、割り込み遅延を構成要素に分解して管理しなければならない。遅延は①割り込みが非活性化された区間が終わるのを待つ割り込み非活性遅延、②ハードウェアが信号を伝達しCPUが命令境界に到達するハードウェア遅延、③文脈保存とベクタ分岐にかかるディスパッチ遅延、④ISRが実際の処理を終えるまでの処理遅延に分かれる。自動車・航空のように最悪遅延(worst-case)が安全に直結する領域では、①を短く保つため臨界領域での割り込み非活性区間を数十サイクル以内に制限し、ISRは必要最小限の処理のみ行って残りを下半分(bottom-half)へ渡すよう設計する。要するに「割り込みが速い」という言葉は平均ではなく、分解された各構成要素の上限を保証するという意味に読まねばならない。
またネスト割り込み(nested interrupt)と優先順位がリアルタイム性を左右する。ISR実行中により高い優先順位の割り込みが入れば、現在のISRを再び中断して上位ISRを先に処理せねばならず、そのためISR進入時に上位割り込みのみ許可するようマスクレベルを調整する。例えば産業用モータ制御器で「停電検知」は最優先の非マスカブル割り込み(NMI)に置き、いかなる状況でも即座に安全停止が実行されるよう設計する。逆に長い処理を要する割り込みはISRを最小化し、残りを遅延処理(Linuxのsoftirq・tasklet・workqueue、いわゆるtop-half/bottom-half分離)へ渡して、割り込み非活性区間を短く保ち他装置の応答性を保証する。
3. 割り込みの種類
割り込みは発生原因に応じて複数の軸で分類され、各種類は処理方式と優先順位が異なる。種類を正確に区別してこそ例外(exception)と外部割り込みを混同せず、オペレーティングシステムのトラップ処理と装置処理を正しく設計できる。特に「同期/非同期」と「内部/外部」の区別はデバッグとリアルタイム設計で実務的に重要である。
内部でCPU実行と同期的に発生するのが例外(trap/exception)である。ゼロ除算、ページフォールト、権限違反、システムコール(ソフトウェア割り込み)などがここに属し、特定の命令実行が原因であるため再現可能で、当該命令地点で決定的に発生する。一方ハードウェア割り込みはCPU実行と無関係に外部装置から非同期で入り、ディスク完了・ネットワークパケット到着・タイマティックが代表的である。非同期であるためいつ入るか予測できず、共有データ構造へのアクセス時に並行性問題(割り込みと一般コード間の競合)が発生し、これを防ぐため短い区間で割り込みを非活性化するかスピンロックを用いる。
例外の中でもページフォールトはオペレーティングシステム設計の精緻さを示す事例である。仮想メモリでアクセスしたページが物理メモリになければCPUがページフォールト例外を発生させ、OSがディスクから当該ページを積載した後「フォールトを起こしたまさにその命令」を再実行する。すなわち例外は誤り処理のみならず、要求ページング(demand paging)・書き込み時複写(copy-on-write)のような正常機能の実装手段としても用いられる。一方システムコールはアプリケーションプログラムが意図的に発生させるソフトウェア割り込み(トラップ)で、ユーザモードからカーネルモードへ安全に進入する唯一の関門である。このように「例外/トラップ」は単なる事故ではなく保護と仮想化を支える能動的な制御転換であると理解してこそ、オペレーティングシステムの動作を正しく説明できる。
| 分類軸 | 種類 | 例 | 特徴 |
|---|---|---|---|
| 発生位置 | 外部(ハードウェア) | ディスク·NIC·タイマ | 非同期、I/O完了通知 |
| 内部(例外/トラップ) | ゼロ除算·ページフォールト·システムコール | 同期、命令実行が原因 | |
| マスク | マスカブル(IRQ) | 一般装置割り込み | ソフトウェアが一時遮断可能 |
| 非マスカブル(NMI) | 電源異常·ハードウェア故障 | 遮断不可、最優先処理 | |
| 信号方式 | レベルトリガ | 多数装置の共有ライン | 信号保持の間持続 |
| エッジトリガ | 単発性事象 | 状態変化の瞬間のみ検知 |
表の区分のうちマスカブルと非マスカブルの差は安全設計で決定的である。一般装置割り込みは臨界領域保護のため少し遮断できるが、電源異常やメモリパリティ誤りのような致命的事象は遮断してはならないため、NMIに分類していかなる場合も即座に処理させる。またエッジトリガとレベルトリガの選択は割り込み共有と損失防止に影響する。レベルトリガは複数装置が一本のラインを共有する際に信号が保持されて取りこぼさない利点があるが原因装置を識別するポーリングが必要で、エッジトリガは変化の瞬間のみ検知して速いがISRが信号を適時にクリアできないと後続の割り込みを失いうる。実際にLinuxカーネルで共有PCI割り込みが「lost interrupt」で装置が止まる障害が、このメカニズムの差に由来する代表的事例である。
4. DMAの動作原理と転送モード
DMAの核心的洞察は「データ移動は必ずしもCPUのレジスタを経由する必要がない」ということである。メモリと装置バッファはともにシステムバスに接続されているため、バスの主人(bus master)の役割さえ担えればどの装置でもメモリに直接読み書きできる。DMAコントローラ(DMAC)はまさにこのバスマスタ機能を果たす専用ハードウェアで、CPUから「どこから(装置)どこへ(メモリ開始アドレス)何バイトを」転送せよという命令だけ受ければ残りを自ら処理する。
DMAが動作するには必ずキャッシュ一貫性(cache coherence)問題を扱わねばならない。CPUはメモリをキャッシュを通じて読み書きするため、DMAがメモリを直接更新するとCPUキャッシュに残った旧値と不一致が生じる。そこでDMA受信(装置→メモリ)の前には当該領域のキャッシュを無効化(invalidate)し、DMA送信(メモリ→装置)の前にはキャッシュをメモリへ書き戻して(flush)最新値が反映されるようにせねばならない。現代のx86はハードウェアがDMA一貫性を自動保証するが(coherent DMA)、ARM組込みなどではドライバが明示的にキャッシュを管理するか非キャッシュ(non-cacheable)DMAバッファを割り当てねばならず、これを漏らすと「間欠的にデータが壊れる」追跡困難なバグになる。
転送手順は次のとおりである。CPUはDMACのレジスタに転送方向、メモリ開始アドレス、転送長(カウント)を設定し転送を指示した後、すぐに他の作業へ転換する。DMACは装置がデータを準備するとバス使用権(bus grant)をCPUから獲得してメモリへ直接バイトを書きカウントを減少させ、カウントが0になると転送完了割り込み一つをCPUに発生させる。CPUは数千~数百万バイトの転送全体に対して最初と最後、たった二回だけ介入するわけである。
sequenceDiagram
participant CPU
participant DMAC as "DMAコントローラ"
participant DEV as "I/O装置"
participant MEM as "主記憶装置"
CPU->>DMAC: "転送設定(アドレス·長さ·方向)"
Note over CPU: "他の作業実行(ブロックされない)"
DEV->>DMAC: "データ準備完了(DREQ)"
DMAC->>CPU: "バス使用権要求(HOLD)"
CPU-->>DMAC: "バス譲渡(HLDA)"
loop "ブロック転送"
DEV->>DMAC: "データ"
DMAC->>MEM: "メモリへ直接書き込み"
DMAC->>DMAC: "カウント減少"
end
DMAC->>CPU: "転送完了割り込み"
CPU->>CPU: "ISRで完了処理"
DMACがCPUとバスを共有する方式に応じて三つの転送モードがある。第一に、サイクルスチール(cycle stealing)はCPUがバスを使わない遊休サイクルを「盗んで」一度に一ワードずつ転送する方式で、CPU性能にほとんど影響しないが転送が遅い。第二に、バーストモード(burst/block mode)はDMACがバスを独占してブロック全体を一度に転送する方式で、転送は最も速いがその間CPUがメモリにアクセスできず停止しうる。第三に、透過モード(transparent mode)はCPUが明らかにバスを使わない区間のみ転送してCPUに全く影響しないが最も遅い。例えばリアルタイム性が重要な音声ストリーミングはサイクルスチールを、大容量ディスクバックアップはバーストモードを選ぶというように、応用の特性に合わせてモードを選ぶ。
現代システムでは単純なDMACを超え、各装置が自らバスマスタになるバスマスタリングDMAが標準であり、PCIe装置(NVMe SSD、GPU、NIC)はすべて自前のDMAエンジンを内蔵する。特にディスクリプタベースのスキャッタ・ギャザ(scatter-gather)DMAは物理的に散らばった複数のメモリ領域を一つの転送命令にまとめて処理し、仮想メモリにより連続していないユーザバッファも一度に転送できるようにする。これがゼロコピーネットワーキングと高性能ストレージのハードウェア的土台である。
高速装置はCPUとDMAエンジンが共有メモリのディスクリプタリング(descriptor ring)を通じて非同期に協力する。CPU(ドライバ)は転送するバッファのアドレス・長さを収めたディスクリプタをリングに詰め「生産者インデックス」を前進させ、装置のDMAエンジンは「消費者インデックス」を追ってディスクリプタを読み転送を行った後、完了フラグを書き戻す。この構造のおかげでCPUと装置が互いを待たず数千件の転送をパイプラインのように重畳でき、NICの送受信リング(TX/RX ring)とNVMeの提出・完了キュー(SQ/CQ)がすべてこの原理に従う。結局「DMAが速い」とは単一転送が速いという意味ではなく、完了を待たず多数の転送を同時進行(outstanding I/O)できるという意味に理解せねばならない。
5. 入出力方式の比較
三つの入出力方式——プログラム制御(ポーリング)、割り込み駆動、DMA——は「CPUがどれだけ介入するか」という軸で漸進的にCPUを解放してきた進化過程として理解せねばならない。単に「DMAが最も優秀だ」ではなく、データ大きさ・リアルタイム性・実装複雑度のトレードオフに応じて適切な方式が異なるという点が実務的含意である。
| 区分 | プログラム制御(ポーリング) | 割り込み駆動 | DMA |
|---|---|---|---|
| CPU介入 | 全過程(ビジーウェイト) | データ単位ごと | 開始·完了の2回のみ |
| データ移動主体 | CPU | CPU | DMAコントローラ |
| CPU効率 | 非常に低い | 中程度 | 非常に高い |
| 応答遅延 | ポーリング周期に従属 | 割り込み遅延水準 | 低い(ブロック単位) |
| 適合状況 | 超高速·少量、単純装置 | 中低速·非定期事象 | 高速·大容量ブロック転送 |
| オーバーヘッド源 | ビジーウェイト | 文脈保存/復元 | バス競合·設定費用 |
三方式の選択は「装置の速度」と「転送単位の大きさ」という二変数の組合せで決まると整理できる。低速・少量でありながら即時性が必要な単純装置(温度センサ一バイト読み)は設定オーバーヘッドのないポーリングが簡潔で、中低速で事象がまばらに発生する装置(キーボード·マウス)は割り込みが適し、高速・大容量ブロック転送(ディスク·ネットワーク·GPU)はDMAが唯一の現実的選択である。重要なのはこの境界がハードウェアの発展に応じて絶えず移動する点で、かつて割り込みで十分だった1GbEが100GbEへ速くなるとDMAとポーリング(NAPI)の組合せへ再び移ったのがその例である。技術士は特定の方式を正解として暗記するより、速度と転送単位という軸の上でトレードオフを判断する思考を備えねばならない。
ポーリングはほとんど非効率だがごく短く即時的な転送ではむしろ有利でありうる。割り込みは文脈保存・復元とベクタ分岐に数百~数千サイクルを要するが、転送するデータが一、二バイトだけならこのオーバーヘッドが転送自体より大きくなるからである。逆説的に10GbE・100GbE高速ネットワークではパケットがあまりに速く降り注ぎ割り込みが毎秒数百万回発生すると、CPUがISR処理だけで飽和する割り込み暴走(interrupt storm)が生じる。これを防ぐためLinux NAPIは割り込みを一度受けると以後はポーリングへ転換して複数のパケットをまとめて処理し、DPDKはいっそ割り込みを切り専用コアが継続してポーリングする方式へ回帰した。すなわち「ポーリング → 割り込み → DMA」は単純な置換ではなく、状況に応じて共存・回帰するスペクトルである。
具体的な数値で見ると、ディスクから4KBブロックを読む際、ポーリング方式はCPUが数ミリ秒ずっと状態を確認して数百万サイクルを捨てるが、DMAはCPUが数十サイクルで転送を設定した後、完了割り込み一回(数千サイクル)だけ処理すればよい。NVMe SSDが毎秒数百万IOPSを出すのは、このDMA + 完了割り込みの組合せに加え、深い命令キュー(最大64Kキュー × 64K深さ)で複数の転送を同時進行するからである。
実際の適用事例としてApache Kafkaのブローカを挙げられる。Kafkaはディスクのログセグメントを消費者へ転送する際sendfileシステムコールを用いるが、これはディスクDMAでページキャッシュに載せたデータをユーザ空間を経由せずスキャッタ・ギャザDMAで直ちにNICへ渡す。転送の全過程でCPUがするのは転送設定と完了割り込み処理だけであるため、単一ブローカが数十万メッセージを毎秒中継しながらもCPU使用率を低く保つ。これは割り込み(完了通知)とDMA(実際の移動)が結合して処理量を引き上げる典型的構造である。
6. 深化:現代システムの割り込み·DMA進化
現代の高性能コンピューティングで割り込みとDMAはマルチコア・仮想化・セキュリティ要求に合わせて大きく進化した。かつての単一PIC(8259)・単一DMAC(8237)構造では数十コアと数百万IOPSを賄えないからである。本節では実務で性能・セキュリティを左右する核心的発展を押さえる。
第一に、MSI/MSI-X(Message Signaled Interrupt)は物理的な割り込みピンの代わりに、装置が約束されたメモリアドレスに特定の値を書いて割り込みを伝達する方式である。ピンベース方式は共有ラインによる識別ポーリングとライン不足の問題があったが、MSI-Xは装置あたり最大2,048個の独立ベクタを支援し、マルチキューNIC・NVMeがコアごとに専用の割り込みキューを置けるようにする。例えば64コアサーバの100GbE NICは64個の受信キューそれぞれを別のコアのMSI-Xベクタに接続(RSS、Receive Side Scaling)し、割り込み処理をコア全体に分散してキャッシュ局所性を高める。
第二に、IOMMU(Input-Output MMU、インテルVT-d·AMD-Vi)はDMAのセキュリティ・仮想化問題を解決する。伝統的DMAは物理アドレスに直接アクセスするため、悪性・欠陥装置が任意のメモリを上書きするDMA攻撃(例:Thunderboltを通じたDMA奪取)が可能であった。IOMMUは装置が用いるI/O仮想アドレスを実際の物理アドレスへ変換しアクセス範囲を制限して、装置が許可された領域のみアクセスするよう隔離する。これは仮想マシンに物理装置を直接割り当て(PCI passthrough)ながらもVM間のメモリを保護する核心技術であり、クラウドのSR-IOVベースのネットワーク仮想化の土台となる。
第三に、割り込み結合(interrupt coalescing)とハイブリッドポーリングは割り込み暴走問題の実務的解法である。装置が複数の事象をまとめて一度に割り込みを発生させるか(coalescing)、一定時間ポーリングした後に割り込みへ転換する方式で、処理量と遅延の間の均衡を取る。NVMeドライバのハイブリッドポーリングは高IOPS状況で完了割り込みを切り短くポーリングして、割り込みオーバーヘッドと遅延を同時に減らす。2024年時点でLinuxカーネルのio_uringは、こうした完了ポーリング(IOPOLL)とDMAを結合してユーザ空間で数百万IOPSを達成する代表的事例である。
第四に、仮想化環境の割り込み伝達が性能を左右する。仮想マシンで物理割り込みが発生すると伝統的にはハイパーバイザが横取りしてゲストへ注入(inject)したが、このVM進入/脱出(VM-exit)が大きなオーバーヘッドであった。インテルAPICv・AMD AVICのような仮想割り込みハードウェア支援とポスティド割り込み(posted interrupt)は、ハイパーバイザの介入なしに割り込みをゲストvCPUへ直接伝達してこの費用を除去する。SR-IOVで物理NICの仮想機能(VF)をVMに直接割り当て、そのVFのDMAはIOMMUで隔離し、割り込みはポスティド割り込みで直接伝達する組合せが、今日のクラウド高性能ネットワーキングの標準経路である。
7. 考慮事項および示唆点
割り込みとDMAは半世紀を超える基礎概念だが、高性能・リアルタイム・セキュリティシステムを設計する技術士の観点では依然として核心的トレードオフの源泉である。次の項目を総合的に考慮せねばならない。
割り込み遅延 vs 処理量の均衡:リアルタイム制御(ロボット·自動車)は決定的な割り込み遅延(worst-case latency)が命であるためISRを極度に短く保ち上位優先順位を保証せねばならない。一方、高処理量サーバは割り込み結合・NAPI・ポーリングで割り込み回数を減らすのが有利である。一つのシステムが両方の要求を持てば(例:自律走行ECU)優先順位分離とコア隔離(core isolation)を並行せねばならない。
DMAセキュリティと信頼境界:DMAは本質的にメモリ直接アクセスであるため信頼境界を崩しうる。外部ポート(Thunderbolt·USB4)やクラウドのパススルー装置には必ずIOMMUを活性化し、機密コンピューティング環境では装置DMAに対する暗号化・検証(例:PCIe IDE/TDISP)を適用せねばならない。「性能のためにIOMMUを切る」慣行はセキュリティ事故の糸口になるため慎重に判断する。
マルチコア拡張性と割り込み親和性(affinity):単一コアに割り込みが集中すればそのコアだけ飽和して全体性能が制限される。MSI-X多重ベクタと割り込みaffinity設定で負荷を分散しつつ、割り込みを処理するコアとデータを消費するコアを一致させ(キャッシュ局所性)NUMA環境での遠隔メモリアクセスを最小化せねばならない。
電力·エネルギー観点:ポーリングはCPUを起きたままに保ち電力を消費するため、バッテリベースのIoT·組込みでは割り込みベース設計でCPUを低電力スリープに置き事象発生時のみ起こすのが必須である。逆にデータセンタの遅延敏感ワークロードは電力を甘受してポーリングを選ぶ。電力と性能は同一軸の両端であり、ワークロードの特性が選択を決める。
連携技術との統合設計:DMAはゼロコピーI/O、RDMA(遠隔DMA)、GPU Direct、スマートNIC·DPUへ拡張される。特にAIデータセンタでGPUDirect RDMAはNICがGPUメモリにCPU・システムメモリを経由せず直接DMAして、分散学習の通信ボトルネックを除去する。技術士は単一ノードのDMAを超え、ノード間DMA(RDMA)の観点で全体のデータ経路を最適化できねばならない。
参考資料
- Intel, "Intel 64 and IA-32 Architectures Software Developer's Manual, Vol.3 (System Programming): Interrupt and Exception Handling, I/O" — https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
- The Linux Kernel Documentation, "Interrupt Handling / MSI / DMA-API / IOMMU" — https://docs.kernel.org/core-api/dma-api.html
- PCI-SIG, "PCI Express Base Specification (MSI-X, Address Translation Services)" — https://pcisig.com/specifications
- Thunderclap, "DMA attacks and the IOMMU" (NDSS 2019) — https://www.ndss-symposium.org/ndss-paper/thunderclap/
一言まとめ: 割り込みはCPUを遅い装置の待ちから解放する事象駆動の制御転換であり、DMAはデータ移動を専用コントローラに任せてCPUを複写作業から解放する技法で、現代の高性能入出力は「DMAでブロックを転送し完了時に割り込み一回」の組合せの上にMSI-X·IOMMU·ポーリング回帰で拡張される。