MMIO の読み取り/書き込みレイテンシが異常に高いことがわかりました。誰かが私にいくつかの提案をしてくれることを願っています。
カーネル空間で、PCIe デバイスの BAR0 アドレスの 4 バイト値を読み取る簡単なプログラムを作成しました。デバイスは PCIe Intel 10G NIC で、Xeon E5 サーバーの PCIe x16 バスに接続されています。rdtsc を使用して、MMIO 読み取りの開始から終了までの時間を測定します。コード スニペットは次のようになります。
vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device
rdtscl(init);
ret = readl(vaddr);
rmb();
rdtscl(end);
(end, init) 間の経過時間は 1us 未満であると予想しています。結局のところ、PCIe データ リンクを通過するデータはわずか数ナノ秒であるはずです。ただし、私のテスト結果は、MMIO PCIe デバイスの読み取りを行うために少なくとも 5.5use を使用していることを示しています。これが合理的かどうかは疑問です。コードを変更してメモリ バリア (rmb) をリモートにしますが、それでも約 5 us のレイテンシが発生します。
このホワイト ペーパーでは、PCIe レイテンシの測定について説明します。通常は 1us 未満です。www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf MMIO アクセスの待ち時間を短縮するには、カーネルやデバイスなどの特別な構成を行う必要がありますか? または、以前にこれを行った経験がある人はいますか?