はじめに
Linux では DMA Bufferを mmap した時に、ある条件が揃うと CPU Cache が無効になり、パフォーマンスが極端に落ちる場合があります。そこで、何故そのようなことが起こるのか説明します。少し長くなるので、次のように記事を幾つかに分けて投稿します。
- はじめに
- Cache Coherence 問題
- Cache Aliasing 問題
- Linux Kernel の Cache 問題の扱い
- Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる
- Raspberry Pi の例(この記事)
- RISC-V CPU の注意点
- 所感
1〜3は、コンピューターアーキテクチャの基本的な事項を、簡単に説明したものです。すでにご存じの方は読み飛ばしてください。
4 はこれらの問題を Linux Kernel 内でどのように扱っているかを説明します。
5 がこれらの記事群の結論です。結論だけ知りたい方はここだけ読んでください。
前回の記事 『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』 では、Cache Coherence Hardware を持っていないコンピューターシステムの場合は、例え Cache Aliasing 問題が起きない場合でも、 DMA Buffer を mmap する際にキャッシュが無効になることを説明しました。この記事では、その(残念な)コンピューターシステムの例である Raspberry Pi を紹介します。
Raspberry Pi の場合
BCM2711 (Raspberry Pi 4 の SoC) の内部ブロック
Raspberry Pi 4 に搭載されている SoC は Broadcom 社製の BCM2711 です。このBCM2711 は次の図のような内部ブロックになっています。
Fig.1 BCM2711 Block Diagram
Cortex-A72 の L1 Cache は PIPT
BCM2711 には Linux 等を動作させるためのアプリケーションプロセッサとして arm 社製の Cortex-A72 が搭載されています。この Cortex-A72 のL1-Cache は PIPT 方式であることが次の公式資料で明記されています。つまり BCM2711 は Cache Aliasing 問題は起こりません。
- 「About the L1 memory system」
ARM Cortex-A72 MPCore Processor Technical Reference Manual r0p3
https://developer.arm.com/documentation/100095/0003/Level-1-Memory-System/About-the-L1-memory-system
Fig.2 The L1 Cache of Cortex-A72 is PIPT
BCM2711 の InterConnect は Cache Coherence 未対応
一方、BCM2711 の AMBA/AXI-Bus InterConnect は Cache Coherence に対応していません。BCM2711 のデータシートには明記されていませんが、Raspberry Pi 公式のフォーラムには Cache Coheence 問題はソフトウェアで解決するよう明記されています。
- 「BCM2711 ARM Peripherals」
https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf - 「RPI4 PCI Express Bus Master DMA and cache」
Raspberry Pi Forum
https://forums.raspberrypi.com/viewtopic.php?t=335399
Fig.3 InterConnect is not Cache Coherence capable
まとめ
この記事では『Linux では Cache Coherence Hardware を持っていないとDMA Buffer をmmap する際に CPU Cache が無効になる』 コンピューターシステムの例として Raspberry Pi を紹介しました。
Rapberry Pi 4 の アプリケーションプロセッサ(Cortex-A72) のL1-Cache は PIPT なので Cache Aliasing 問題は発生しませんが、BCM2711 の InterConnect が Cache Coherence に対応していないので、Linux では DMA Buffer を mmap した時にキャッシュが有効になりません。
[参考]に Raspberry Pi で mmap したら性能が落ちた事例を紹介しています。参考にしてください。
参考
Raspberry Pi で mmap が遅くなっていると思われる事例
- 「Libcamera memcpy from mmap'd region very slow (CM4)」
Raspberry Pi Forum
https://forums.raspberrypi.com/viewtopic.php?t=352554 - 「Why processing V4L2 Unicam buffers in userspace might be slow」
Raspberry Pi Forum
https://forums.raspberrypi.com/viewtopic.php?t=315272 - 「Slow frame read from webcam」
OpenCV Forum
https://forum.opencv.org/t/slow-frame-read-from-webcam/6880/1 - 「[HOW-TO] processing high resolution video at high framerate」
https://github.com/raspberrypi/picamera2/issues/740 - 「Could this be used with V4L2/libcamera buffers on the Raspberry Pi 4 (Arm A72)」
https://github.com/ikwzm/udmabuf/issues/107 - 「V4L2 ストリーミングI/O(V4L2_MEMORY_MMAP) で性能が出ない問題 (2024年改訂版)」
Qiita
https://qiita.com/ikwzm/items/474ababbc99cb4812bc7
Raspberry Pi のハードウェアの資料
- 「BCM2711 ARM Peripherals」
https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf - 「RPI4 PCI Express Bus Master DMA and cache」
Raspberry Pi Forum
https://forums.raspberrypi.com/viewtopic.php?t=335399 - 「About the L1 memory system」
ARM Cortex-A72 MPCore Processor Technical Reference Manual r0p3
https://developer.arm.com/documentation/100095/0003/Level-1-Memory-System/About-the-L1-memory-system