ダイレクトメモリアクセス

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

ダイレクトメモリアクセスDMA )は、特定のハードウェアサブシステムが中央処理装置(CPU) とは独立してメインシステムメモリランダムアクセスメモリ)にアクセスできるようにするコンピュータシステムの機能です。

DMAがない場合、CPUがプログラムされた入出力を使用しているとき、CPUは通常、読み取りまたは書き込み操作の全期間にわたって完全に占有されているため、他の作業を実行できません。DMAの場合、CPUは最初に転送を開始し、次に転送の進行中に他の操作を実行し、操作が完了すると最後にDMAコントローラー(DMAC)から割り込みを受信します。この機能は、CPUがデータ転送の速度に追いつかない場合、またはCPUが比較的遅いI / Oデータ転送を待機している間に作業を実行する必要がある場合に役立ちます。ディスクドライブコントローラー、グラフィックカードネットワークカードサウンドカードなど、多くのハードウェアシステムでDMAが使用されています。DMAは、マルチコアプロセッサでのチップ内データ転送にも使用されますDMAチャネルを備えたコンピューターは、DMAチャネルを備えていないコンピューターよりもはるかに少ないCPUオーバーヘッドでデバイスとの間でデータを転送できます。同様に、マルチコアプロセッサ内 の処理要素は、プロセッサ時間を占有することなくローカルメモリとの間でデータを転送できるため、計算とデータ転送を並行して進めることができます。

DMAは、メモリ内のデータの「メモリからメモリへ」のコピーまたは移動にも使用できます。DMAは、大きなコピーやスキャッターギャザー操作などの高価なメモリ操作をCPUから専用のDMAエンジンにオフロードできます。実装例は、I / Oアクセラレーションテクノロジーです。DMAは、ネットワークオンチップおよびインメモリコンピューティングアーキテクチャで重要です。

原則

サードパーティ

NeXTcubeコンピューターマザーボード(1990)。画像の中央の下にある2つの大きな集積回路は、DMAコントローラー(l。)と-珍しい-最初のシリーズのハードディスクドライブの代わりに使用される光磁気ディスク用の特別な専用DMAコントローラー(r。)です。このコンピュータモデル。

サードパーティDMAとも呼ばれる標準DMAは、DMAコントローラを使用します。DMAコントローラは、メモリアドレスを生成し、メモリの読み取りまたは書き込みサイクルを開始できます。これには、CPUによる書き込みと読み取りが可能ないくつかのハードウェアレジスタが含まれています。これらには、メモリアドレスレジスタ、バイトカウントレジスタ、および1つ以上の制御レジスタが含まれます。DMAコントローラが提供する機能に応じて、これらの制御レジスタは、送信元、宛先、転送の方向(I / Oデバイスからの読み取りまたはI / Oデバイスへの書き込み)、サイズの組み合わせを指定する場合があります。転送ユニット、および/または1つのバーストで転送するバイト数。[1]

入力、出力、またはメモリからメモリへの操作を実行するために、ホストプロセッサは、転送するワード数と使用するメモリアドレスのカウントを使用してDMAコントローラを初期化します。次に、CPUは周辺機器にデータ転送を開始するように命令します。次に、DMAコントローラは、アドレスと読み取り/書き込み制御ラインをシステムメモリに提供します。周辺機器とメモリ間で1バイトのデータを転送する準備ができるたびに、DMAコントローラは、データのブロック全体が転送されるまで、内部アドレスレジスタをインクリメントします。

バスマスタリング

ファーストパーティDMAシステムとも呼ばれるバスマスタリングシステムでは、CPUと周辺機器にそれぞれメモリバスの制御を許可できます周辺機器がバスマスターになることができる場合、CPUの関与なしにシステムメモリに直接書き込むことができ、必要に応じてメモリアドレスと制御信号を提供します。バスの競合が発生しないように、プロセッサをホールド状態にするための対策を講じる必要があります。

動作モード

バーストモード

バーストモードでは、データのブロック全体が1つの連続したシーケンスで転送されます。DMAコントローラがCPUによってシステムバスへのアクセスを許可されると、データブロック内のすべてのバイトのデータを転送してからシステムバスの制御をCPUに戻しますが、CPUは比較的長期間非アクティブになります。このモードは「ブロック転送モード」とも呼ばれます。

サイクルスチールモード

サイクルスチールモードは、バースト転送モードに必要な時間、CPUを無効にしないシステムで使用されます。サイクルスチールモードでは、DMAコントローラは、 BR(バス要求BG(バス許可)を使用して、バーストモードと同じ方法でシステムバスへのアクセスを取得します。信号。CPUとDMAコントローラー間のインターフェイスを制御する2つの信号です。ただし、サイクルスチールモードでは、1ユニット(バイトなど)のデータ転送後、システムバスの制御がBGを介してCPUにディアサートされます。次に、データのブロック全体が転送されるまで、BRを介して再度継続的に要求され、要求ごとに1ユニット(バイトなど)のデータが転送されます。 DMAコントローラは、システムバスの制御を継続的に取得および解放することにより、基本的に命令とデータの転送をインターリーブします。 CPUが命令を処理すると、DMAコントローラーが1つのデータ値を転送します。データはそれほど速く転送されませんが、バーストモードである限りCPUはアイドル状態ではありません。サイクルスチールモードは、データをリアルタイムで監視するコントローラーに役立ちます。

透過モード

透過モードは、データのブロックを転送するのに最も時間がかかりますが、システム全体のパフォーマンスの観点からも最も効率的なモードです。透過モードでは、DMAコントローラは、CPUがシステムバスを使用しない操作を実行している場合にのみデータを転送します。透過モードの主な利点は、CPUがプログラムの実行を停止せず、DMA転送が時間的に自由であることです。一方、欠点は、CPUがシステムバスを使用していないことをハードウェアが判断する必要があることです。これは複雑になる可能性があります。 。これは「隠しDMAデータ転送モード」とも呼ばれます。

キャッシュコヒーレンシ

DMAによるキャッシュのインコヒーレンス

DMAは、キャッシュコヒーレンシの問題を引き起こす可能性があります。DMAを使用してデバイスから直接アクセスできるキャッシュと外部メモリを備えたCPUを想像してみてください。CPUがメモリ内の場所Xにアクセスすると、現在の値がキャッシュに保存されます。Xでの後続の操作は、キャッシュされたXのコピーを更新しますが、ライトバックキャッシュを想定して、Xの外部メモリバージョンは更新しません次にデバイスがXにアクセスしようとする前にキャッシュがメモリにフラッシュされない場合、デバイスは古い値Xを受け取ります。

同様に、デバイスがメモリに新しい値を書き込むときにXのキャッシュされたコピーが無効にされない場合、CPUは古い値のXで動作します。

この問題は、システム設計の2つの方法のいずれかで対処できます。キャッシュコヒーレントシステムは、バススヌーピングと呼ばれるハードウェアのメソッドを実装します。これにより、外部書き込みがキャッシュコントローラーに通知され、キャッシュコントローラーがDMA書き込みのキャッシュ無効化またはキャッシュフラッシュを実行します。 DMAは読み取ります。非コヒーレントシステムはこれをソフトウェアに任せます。ソフトウェアでは、OSは、発信DMA転送が開始される前にキャッシュラインがフラッシュされ、着信DMA転送の影響を受けるメモリ範囲にアクセスする前に無効化されることを確認する必要があります。OSは、その間、実行中のスレッドがメモリ範囲にアクセスしないようにする必要があります。ほとんどのハードウェアは各キャッシュラインを個別に無効にするためにループを必要とするため、後者のアプローチではDMA操作にいくらかのオーバーヘッドが発生します。

ハイブリッドも存在し、セカンダリL2キャッシュはコヒーレントであり、L1キャッシュ(通常はCPU上)はソフトウェアによって管理されます。

ISA

元のIBMPC(およびフォローアップPC / XT )には、4つのDMAチャネル(0〜3の番号)を提供できるIntel 8237DMAコントローラーが1つしかありませんでした。これらのDMAチャネルは8ビット転送を実行し(8237は8ビットデバイスであり、PCのi8088 CPU /バスアーキテクチャに理想的に適合しているため)、最初の(i8086 / 8088標準)メガバイトのRAMしかアドレス指定できず、制限されていました。単一の 64kBのアドレス指定そのスペース内のセグメント(ただし、送信元チャネルと宛先チャネルは異なるセグメントをアドレス指定できます)。さらに、コントローラーは拡張バスI / Oデバイスとの間の転送にのみ使用できます。これは、8237がPC(&XT )は動的メモリ リフレッシュ専用でしたこれにより、汎用の「ブリッター」として使用できなくなり、その結果、CPUの一般的なPIO速度によって制限される、PC内のブロックメモリの移動が非常に遅くなりました。

IBM PC / ATを使用すると、拡張ATバス( ISAまたは「IndustryStandardArchitecture」としてよりよく知られている)が2番目の8237 DMAコントローラーを追加して3つ追加し、リソースの衝突によって強調されたように、XTの追加の拡張性オリジナルのPC、待望のチャネル(5–7;チャネル4は最初の8237へのカスケードとして使用されます)。ページレジスタも、80286CPUの16MBメモリアドレス空間全体をアドレス指定するように再配線されました。この2番目のコントローラーは、I / Oデバイスがデータソースおよび/または宛先として使用される場合に16ビット転送を実行できる方法でも統合されました(実際には、メモリからメモリへの転送のためにデータ自体のみを処理するため、それ以外の場合は単純に制御16ビットシステムの他の部分間のデータフロー、それ自体のデータバス幅は比較的重要ではありません)、上位3つのチャネルが使用されるとデータスループットが2倍になります。互換性のために、下位4つのDMAチャネルは8ビット転送のみに制限されていましたが、チャネル0がDRAMリフレッシュを処理する必要がないため、メモリからメモリへの転送が技術的に可能になりました。 CPUが現在達成できるスループットと比較して、コントローラーの結果としてスループットが低いため、値が制限されていました(つまり、最小6 MHzで実行される16ビットのより最適化された80286と、4.77 MHzでロックされた8ビットコントローラー)。どちらの場合も、64kBのセグメント境界16ビットモードでも個々の転送がセグメントを横断できない(同じセグメントの先頭に「ラップアラウンド」する)ことができないという問題が残っていましたが、これは実際には、DRAMの継続的な必要性として、パフォーマンスよりもプログラミングの複雑さの問題でした。約15μsごとにバスを独占するためのリフレッシュ(ただし処理) により、大規模な(そして高速ですが中断できない)ブロック転送の使用が防止されました。

パフォーマンスが遅いため( 5MHzで最大1.6MB  / sの8ビット転送機能[2]、ただしPC / XTでは0.9MB / s以下、ATでは16ビット転送では1.6 MB / s ISAバスのオーバーヘッド、およびメモリリフレッシュの中断[3]などの他の干渉、および元のPCの標準4.77 MHzクロックよりも高い速度で動作する直接交換のインストールを可能にする速度グレードが利用できない場合、これらのデバイスは事実上廃止されています。 1980年代後半。特に、1985年の80386プロセッサの出現と32ビット転送の容量(ただし、80186以降のIntelCPUでのアドレス計算とブロックメモリの移動の効率は大幅に向上しています)つまり、16ビットバス286および386SXによるPIO転送でも、8237を簡単に凌駕する可能性があります)。また、( EISA )へのさらなる進化または( MCAVLBPCI)「ISA」バスの代替品の開発も可能です。独自のはるかに高性能なDMAサブシステム(EISAの場合は最大33 MB / s、MCAは40 MB / s、通常は133 MB / s VLB / PCI)により、元のDMAコントローラーはパフォーマンスの石のように見えました。増幅器。これらは、後のマシンで組み込みのレガシーPCハードウェアをサポートするために必要な範囲でサポートされていました。 32ビット拡張バスが一般的になった後もISADMAを使用し続けたレガシーハードウェアは、SoundBlasterでしたSoundBlaster標準との完全なハードウェア互換性を維持するために必要なカード。内蔵フロッピーディスクコントローラー、FIR(高速赤外線)モードが選択されている場合はIrDA赤外線コントローラー、ECPモードが選択されている場合はIEEE1284パラレルポートコントローラーを統合することが多いマザーボード上スーパーI / Oデバイス。元の8237または直接互換性のあるものがまだ使用されている場合、システムの実際のアドレススペースやインストールされているメモリの量に関係なく、 これらのデバイスとの間の転送はメインRAMの最初の16MBに制限される場合があります。

各DMAチャネルには、16ビットのアドレスレジスタとそれに関連付けられた16ビットのカウントレジスタがあります。データ転送を開始するために、デバイスドライバはDMAチャネルのアドレスとカウントレジスタをデータ転送の方向(読み取りまたは書き込み)とともに設定します。次に、DMAハードウェアに転送を開始するように指示します。転送が完了すると、デバイスはCPUに 割り込みます。

スキャッターギャザーまたはベクトル化されたI / O DMAにより、単一のDMAトランザクションで複数のメモリ領域との間でデータを転送できます。これは、複数の単純なDMA要求を連鎖させることに相当します。動機は、CPUから複数の入出力割り込みおよびデータコピータスク をオフロードすることです。

DRQはデータリクエストの略ですデータ確認のためのDACK DMA機能を備えたコンピュータシステムのハードウェア回路図に見られるこれらの記号は、CPUとDMAコントローラ間の電子信号線を表しています。各DMAチャネルには、1つの要求ラインと1つの確認応答ラインがあります。DMAを使用するデバイスは、割り当てられたDMAチャネルの両方の回線を使用するように構成する必要があります。

16ビットISAはバスマスタリングを許可しました。[4]

標準のISADMA割り当て:

  1. DRAMリフレッシュ(廃止)、
  2. ユーザーハードウェア、通常はサウンドカードの8ビットDMA
  3. フロッピーディスクコントローラ、
  4. ハードディスクPIOモードで廃止され、 UDMAモードに置き換えられました)、パラレルポート(ECP対応ポート)、OPTi928などの特定のSoundBlasterクローン。
  5. PC / XT DMAコントローラーへのカスケード、
  6. ハードディスク(PS / 2のみ)、その他すべてのユーザーハードウェア、通常はサウンドカードの16ビットDMA
  7. ユーザーハードウェア。
  8. ユーザーハードウェア。

PCI

PCIアーキテクチャには、ISAとは異なり、中央DMAコントローラがありません。代わりに、任意のPCIデバイスがバスの制御を要求し(「バスマスターになる」)、システムメモリからの読み取りとシステムメモリへの書き込みを要求できます。より正確には、PCIコンポーネントはPCIバスコントローラー(通常はPCIホストブリッジ、およびPCIからPCIブリッジ[5])にバスの所有権を要求します。これは、複数のデバイスが同時にバスの所有権を要求する場合に調停します。一度。コンポーネントに所有権が付与されると、PCIバス上で通常の読み取りおよび書き込みコマンドが発行され、PCIバスコントローラーによって要求されます。

例として、AMD Socket AM2ベースのPCでは、サウスブリッジはHyperTransportを使用してトランザクションをメモリコントローラー(CPUダイに統合されている)に転送し、 HyperTransportはトランザクションをDDR2オペレーションに変換して、 DDR2メモリバス。その結果、PCIDMA転送にはかなりの数のステップが含まれます。ただし、PCIデバイスまたはPCIバス自体は、他のコンポーネントよりも1桁遅いため、問題はほとんど発生しません(デバイス帯域幅のリストを参照)。

最新のx86CPUは、物理アドレス拡張(PAE)、36ビットアドレッシングモード、またはx86-64 CPUのネイティブ64ビットモードを利用して、4GBを超えるメモリを使用する場合があります。このような場合、32ビットアドレスバスでDMAを使用するデバイスは、4GBラインより上のメモリをアドレス指定できません。新しいダブルアドレスサイクル(DAC)メカニズムは、PCIバスとデバイス自体の両方に実装されている場合、[6] 64ビットDMAアドレッシングを有効にします。それ以外の場合、オペレーティングシステムは、バウンスバッファーFreeBSD / Linux)とも呼ばれる高価なダブルバッファー(DOS / Windowsの命名法)を使用するか、 IOMMUを使用して問題を回避する必要があります。アドレス変換サービスが存在する場合はそれを提供します。

I / OAT

汎用CPUに組み込まれたDMAエンジンの例として、一部のIntel XeonチップセットにはI / O Acceleration Technology(I / OAT)と呼ばれるDMAエンジンが含まれています。これにより、メインCPUからメモリコピーをオフロードして、他の作業を実行できるようになります。 。[7] 2006年、IntelのLinuxカーネル開発者であるAndrew Groverは、I / OATを使用してベンチマークを実行し、ネットワークトラフィックのコピーをオフロードし、ワークロードの受信によるCPU使用率の改善が10%以下であることを発見しました。[8]

DDIO

データダイレクトI / ODDIO )機能を備えたIntel Xeon E5プロセッサでは、DMAメカニズムのパフォーマンス指向の拡張機能がさらに導入され、DMA「ウィンドウ」をシステムRAMではなくCPUキャッシュ内に配置できるようになりました。その結果、CPUキャッシュがI / Oのプライマリソースおよび宛先として使用され、ネットワークインターフェイスコントローラーが可能になります(NIC)ローカルCPUの最終レベルキャッシュ(L3キャッシュ)に直接DMAし、システムRAMからのI / Oデータのコストのかかるフェッチを回避します。その結果、DDIOは全体的なI / O処理の待ち時間を短縮し、I / Oの処理を完全にキャッシュ内で実行できるようにし、使用可能なRAM帯域幅/待ち時間がパフォーマンスのボトルネックになるのを防ぎ、低電力状態でRAMを長く維持します。[9] [10] [11] [12]

AHB

システムオンチップおよび組み込みシステムでは、一般的なシステムバスインフラストラクチャは、 AMBA高性能バスなどの複雑なオンチップバスです。AMBAは、マスターとスレーブの2種類のAHBコンポーネントを定義します。スレーブインターフェイスは、ソフトウェア( ARMなどの組み込みCPUで実行)がデバイス内のI / Oレジスタまたは(あまり一般的ではありませんが)ローカルメモリブロックの書き込み/読み取りを行うことができるプログラムドI / Oに似ています。デバイスはマスターインターフェイスを使用して、CPUに大きな負荷をかけることなく、システムメモリとの間でDMAトランザクションを実行できます。

したがって、システムメモリとの間で大量のデータを転送する必要があるネットワークコントローラなどの高帯域幅デバイスには、AHBへの2つのインターフェイスアダプタ(マスターインターフェイスとスレーブインターフェイス)があります。これは、AHBのようなオンチップバスがバスのトライスタットやバス上のラインの方向転換をサポートしていないためです。PCIと同様に、DMAはバスマスタリングであるため中央DMAコントローラは必要ありませんが、システムに複数のマスターが存在する場合は アービターが必要です。

内部的には、マルチチャネルDMAエンジンは通常、ソフトウェアによってプログラムされた 複数の同時スキャッターギャザー操作を実行するためにデバイスに存在します。

セル

マルチプロセッサシステムオンチップでのDMAの使用例として、IBM / Sony / ToshibaのCellプロセッサには、1つのPowerプロセッサ要素(PPE)と8つの相乗的プロセッサ要素(SPE)を含む9つの処理要素のそれぞれにDMAエンジンが組み込まれています。 。SPEのロード/ストア命令はそれ自体のローカルメモリのみを読み取り/書き込みできるため、SPEはDMAに完全に依存して、他のSPEのメインメモリとローカルメモリとの間でデータを転送します。したがって、DMAは、このCPU内のコア間のデータ転送の主要な手段として機能します(Intelのキャンセルされた汎用GPULarrabeeなどのキャッシュコヒーレントCMPアーキテクチャとは対照的です)。

セル内のDMAは完全にキャッシュコヒーレントです(ただし、DMAによって操作されるSPEのローカルストアは、標準的な意味でグローバルコヒーレントキャッシュとして機能しないことに注意してください)。読み取り( "get")と書き込み( "put")の両方で、DMAコマンドは、最大16 KBのサイズの単一のブロック領域、または2〜2048のそのようなブロックのリストのいずれかを転送できます。 DMAコマンドは、ローカルアドレスとリモートアドレスのペアを指定することによって発行されます。たとえば、SPEプログラムがput DMAコマンドを発行する場合、ソースとして自身のローカルメモリのアドレスと仮想メモリアドレス(ターゲットとしてのメインメモリまたは別のSPEのローカルメモリのいずれかと、ブロックサイズ。実験によると、セル内のDMAの実効ピークパフォーマンス(3 GHz、均一なトラフィックの下)は、毎秒200GBに達します。[13]

パイプライン処理

スクラッチパッドメモリとDMAを備えたプロセッサ(デジタルシグナルプロセッサCellプロセッサなど)は、ダブルバッファリングまたはマルチバッファリングを介して、DMAメモリ操作と処理をオーバーラップするソフトウェアの恩恵を受ける可能性があります。たとえば、オンチップメモリ​​は2つのバッファに分割されます。DMAエンジンがもう一方のデータをロードおよび保存している間、プロセッサは一方のデータを操作している可能性があります。これにより、システムはメモリレイテンシを回避し、バースト転送を利用できますが、予測可能なメモリアクセスパターンが必要になります。[要出典]

も参照してください

メモ

  1. ^ オズボーン、アダム(1980)。マイクロコンピューター入門:第1巻:基本概念(第2版)。オズボーンマグロウヒル。pp。5–64から5–93 。 ISBN 0931988349
  2. ^ 「Intel8237&8237-2データセット」(PDF)JKboxRC702サブサイト2019年4月20日取得
  3. ^ 「さまざまなPCプラットフォームでのDMAの基礎、National Instruments、6ページと7ページ」アルゼンチンのナシオナルデラプラタ大学2019年4月20日取得
  4. ^ Intel Corp.(2003-04-25)、「第12章:ISAバス」(PDF)技術者向けPCアーキテクチャ:レベル1 、2015年1月27日取得
  5. ^ 「バスの詳細-Oracle®Solaris11.3用のデバイスドライバの作成」docs.oracle.com 2020年12月18日取得
  6. ^ 「物理アドレス拡張—PAEメモリとウィンドウ」MicrosoftWindowsハードウェア開発セントラル。2005 2008年4月7日取得
  7. ^ Corbet、Jonathan(2005年12月8日)。「ハードウェアのメモリコピー」LWN.net
  8. ^ Grover、Andrew(2006-06-01)。「LinuxNetwikiのI / OAT」LinuxでのI / OATの概要と、いくつかのベンチマークへのリンク2006年12月12日取得
  9. ^ 「IntelDataDirect I / O(Intel DDIO):よくある質問」(PDF)インテル2012年3月2015年10月11日取得
  10. ^ Rashid Khan(2015-09-29)。「カーネルネットワーキングの限界を押し上げる」redhat.com 2015年10月11日取得
  11. ^ 「IntelXeonプロセッサE5-2600およびSolarflareSFN6122F 10 GbEサーバーアダプタを使用して、最高のメッセージレートで最低のレイテンシを達成する」(PDF)solarflare.com2012-06-07 2015年10月11日取得
  12. ^ Alexander Duyck(2015-08-19)。「カーネルネットワーキングの限界を押し上げる」(PDF)linuxfoundation.orgp。5 2015年10月11日取得
  13. ^ キスラー、マイケル(2006年5月)。「セルマルチプロセッサ通信ネットワーク」Cell BroadbandEngineでのDMAパフォーマンスの広範なベンチマーク

参考文献

外部リンク