やぁみんな、ビリーだよ。
今日は、ビリー宛てにもらった質問を紹介しよう。
読者からの質問
ビリーさん突然すみません。PCIデバイスにおけるDMA転送について調べていて、ビリーさんの「キャッシュは諸刃の剣」たどり着いたところです。
CPUのキャッシュ機能の有無がDMA転送速度に影響する場合、転送を行う設定をしているソフトウェアに原因があると考えて良さそうでしょうか。実際の動きとして、キャッシュ機能を無効にするとDMA転送が遅くなるという現象が出ています。大変お手数ですがよろしくお願い致します。
丁寧なメールどうもありがとう。こんな疑問ってみんなもあるかな? 質問者の方に快諾いただいたので、今日はこのページで、この質問への回答をしてみよう。
DMA転送の方式は CPU や DMAコントローラによって違うので、以下の回答はあくまでも一般的な場合、として読んでね。
ビリーからの回答
PCI デバイスで DMA転送、ということだけど、キャッシュを有効にしているかどうかで転送レートが変化する、ということは起こりえるんだ。
転送を行う設定をしているソフトウェアに原因があるケースはごく限られていて、どちらかというとキャッシュの設定(有効でよい箇所まで無効にしてしまう)の影響のほうが大きいのではないかと思うんだ。キャッシュの有効・無効を切り替えると以下のような影響がある。
(1) CPU のキャッシュ機能自体をすべて無効にする場合
この場合は、DMA転送に限らずすべてのプログラムの動作のパフォーマンスに影響が出ることになるよね。
特に DMA転送のプログラムでは、同じコードをループしながら繰り返し実行するといったケースが多いので、本来ならキャッシュの効果が出やすいんだけど、キャッシュが無効だとその効果が得られないことになるね。この場合は、DMA転送を行うソフトウェアが原因とはならないよね。
(2) CPU のキャッシュのうち、命令キャッシュ(インストラクションキャッシュ)機能自体を無効にする場合
基本的には(1)と同じことが言える。この場合も、DMA転送を行うソフトウェアが原因とはならないよ。
ビリー講義「キャッシュは諸刃の剣」や「DMA対応と言われたら(2)」で、DMA転送を行う際にはキャッシュの使い方に気を付ける必要がある、と言ったけれど、これはデータキャッシュについてのことで、命令キャッシュについては禁止する必要はないんだ。
(3) CPU のキャッシュのうちデータキャッシュ機能自体を無効にする場合
この場合は、DMA転送の他に、ある程度以上のサイズの配列や構造体にアクセスするようなプログラムにおいて、パフォーマンスに影響が出ることになる。
DMA転送バッファ自体はキャッシュ禁止にしておかなくてはいけないけれど、DMAバッファにデータをコピーする元データがある場合、その元データの領域はキャッシュ有効にしておくべきで、これが無効になっているとパフォーマンスが落ちてしまうことになる。ただ、この場合も設定の問題であって、DMA転送を行うソフトウェアが原因となる可能性は低いよ。
(4) DMAバッファとして使用する領域のみキャッシュ禁止にしている場合
DMA転送の場合では、DMA転送バッファ自体はデータキャッシュ禁止、あるいはデータキャッシュは有効にした上で、ドライバでキャッシュの Flush やInvalidate を行う必要があることは前に説明した通り。
これらの設定・コーディングが適切であれば、DMA転送を行うソフトウェアが原因となる可能性は低い(パフォーマンスはほぼ変わらないはずだよ)。ただ、(4)の設定にもかかわらず、キャッシュの設定で転送パフォーマンスが変わる場合は、不必要な Flush や Invalidate が入っていてパフォーマンスが低下する可能性は考えられるね。
以上をまとめると、
- 命令キャッシュは有効にしておく。
- データキャッシュは、CPUのレベルで全体を無効にするのではなく、DMAバッファとして使用する領域のみを無効にする。または DMAバッファをキャッシュ有効としたうえで、ソフトウェアでFlush や Invalidate といったコントロールを適切に行う。
とするのが、最も DMA転送のパフォーマンスが上がる方法だと思うよ。みんなも参考にしてね。
-
- 第1回 組込みシステムのこれから
- 第2回 IoTの成功はセキュリティ次第
- 第3回 組込みでもGPUやFPGAと早めに親しんでおこう
- 第4回 電子産業の紅白歌合戦、CEATECで垣間見えた未来
- 第5回 小口開発案件の集合市場、IoTの歩き方(上)
- 第6回 小口開発案件の集合市場、IoTの歩き方(下)
- 第7回 徹底予習:AI時代の組込みシステム開発のお仕事
- 第8回 いまどきのセンサー(上):ありのままの状態を知る
- 第9回 いまどきのセンサー(下):データを賢く取捨選択する
- 第10回 組込みブロックチェーンの衝撃(上)
- 第11回 組込みブロックチェーンの衝撃(下)
- 第12回 エネルギーハーベスティングの使い所、使い方
- 第13回 「人を育てる」から「道具を育てる」へ、農業から学ぶAI有効活用法
- 第14回 CPS時代に組込みシステム開発に求められることとは
- 第15回 次世代車のE/Eアーキテクチャに見る組込みの進む道
- 第16回 RISC-Vが拓く専用プロセッサの時代
- 第17回 振動計測の大進化で、熟練エンジニアのスキルを広く身近に
-
- 零の巻:組込みというお仕事
- 壱の巻:2進数と16進数を覚えよう!
- 弐の巻:割り込みとポーリング
- 参の巻:printf()が使えない?
- 四の巻:これにもIntelが入ってるの?
- 五の巻:Endianってなに?
- 六の巻:マルチタスクとは
- 七の巻:スタックってなあに?(1)
- 七の巻:スタックってなあに?(2)
- 八の巻:メモリを壊してみましょう
- 九の巻:コードが消える?~最適化の罠~
- 拾の巻:例外が発生しました
- 拾壱の巻:コードサイズを聞かれたら
- 拾弐の巻:キャッシュは諸刃の剣
- 拾参の巻:デバイスにアクセスするには
- 拾四の巻:セキュリティってなに?(1)
- 拾四の巻:セキュリティってなに?(2)
- 拾四の巻:セキュリティってなに?(3)
- 拾五の巻 :DMA対応と言われたら(1)
- 拾五の巻 :DMA対応と言われたら(2)
- 拾六の巻:ヒープとスタック
- 拾七の巻:フラグメンテーション
- 拾八の巻:CPU起動とブートローダ
- 拾九の巻:kmとKByteの「kとK」
- ビリーへの質問:DMAとキャッシュの関係
- ビリーへの質問:スタックオーバーフローについて
- ビリーへの質問:CPUレジスタについて