ARM 文档说内存屏障指令“非常昂贵”,但没有给出具体的指示。我指的是 ARM DMB 指令。
它们有多贵?数百个 CPU 周期,还是数千个 CPU 周期?
我能想象到的恐怖:
读取内存屏障使当前内核上的 L1 缓存完全无效。
写屏障必须等待所有脏的 L1 缓存行写回 L2(单处理器/多核)或主内存(多处理器)。
这不可能是数千个 CPU 周期吗?例如将 8,192 个脏 L1 缓存行写入 L2 缓存的时间约为 7 个 CPU 周期。
对于上下文,我担心在后台线程上运行的卷积 FFT 之间的交互(这肯定会弄脏整个 L1 缓存),以及较小的无锁队列将数据包发送到实时音频线程和从实时音频线程发送数据包。我想知道是否值得使用原子指令在队列中读取和写入数据,而不是使用 DMB 内存屏障。
有问题的处理器是 Raspberry Pi 4,ARM 8.1a。