2013-07-21 34 views
7

私のMMIO読み取り/書き込みレイテンシが不当に高いことがわかりました。私は誰かが私にいくつかの提案を与えることを願っています。MMIO読み取り/書き込みレイテンシ

私は、カーネル空間で、PCIeデバイスのBAR0アドレスに4バイトの値を読み取る簡単なプログラムを書きました。デバイスはPCIe Intel 10G NICで、Xeon E5サーバーのPCIe x16バスに接続されています。私は読んで終わりMMIOの始まりの間の時間を測定するために、RDTSCを使用して、コードスニペットは次のようになります。

vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device 
rdtscl(init); 
ret = readl(vaddr); 
rmb(); 
rdtscl(end); 

私は(最後は、INIT)1US未満であるとの間の経過時間を期待してい結局のところ、PCIeデータリンクを通過するデータは数ナノ秒に過ぎないはずです。しかし、私のテスト結果では、MMIO PCIeデバイスの読み込みを5.5usで行っています。これが妥当かどうか疑問だ。リモートバリア(rmb)にコードを変更しますが、レイテンシは約5秒です。

このホワイトペーパーでは、PCIeレイテンシ測定について説明します。通常は1us未満です。 www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf MMIOのアクセスレイテンシを下げるには、カーネルやデバイスなどの特別な設定が必要ですか?または誰もこれまでに経験したことがありますか?

答えて

-1

リモートホストからデータを取得するためにNICカードをネットワーク経由で(スイッチ経由で)転送する必要がある場合、5.5usは適切な読み取り時間です。ローカルPCIeデバイスのレジスタを読み取る場合は、1us未満にしてください。私はIntel 10G NICに関する経験はありませんが、 はInfinibandとカスタムカードで作業しました。

+0

ローカルPCIeバス上のデバイスのBAR内のワードを読み取るには、1 us未満を測定します。なぜ私のコメントが投票されたのかわからないのは、私が論文の結果が現実的であることを確認しているからです。 BARはユーザー空間にマップされました。アドレスを読み取るだけです。あなたはioremap_nocache()の時間もカウントしていますか?私の仕事の一環として、部屋のシステム内のBARにレジスタを読み込み、それを5.5USRに減らしました。私はMellanox FDR InfinibandよりRDMAを使用し、システム間にIBスイッチを使用しています。 –

2

5usecは素晴らしいです!それを統計的にループで行い、はるかに大きな値を見つけるかもしれません。

これにはいくつかの理由があります。 BARは通常キャッシュ不可能でプリフェッチ不可能です - pci_resource_flags()を使ってチェックしてください。 BARがキャッシュ可能とマークされている場合は、キャッシュ・コヒーレンシ - すべてのCPUが同じ値をキャッシュすることを保証するプロセスが1つの問題になる可能性があります。

第2に、読書ioは常に投稿されていない件です。 CPUは、あるデータバス上で通信する許可を得るまでストールしなければならず、そのデータが前記バス上に到着するまで少し待つ必要がある。このバスはメモリのように見えるように作られていますが、実際にはそうではありません。停止は中断されないビジー・ウェイトですが、生産性の低いノー・ザ・レスではありません。だから私は最悪の場合のレイテンシがあなたがタスク先取りを検討し始める前でさえ、5usよりずっと高いと期待します。

関連する問題