ドルフィンシステム移転完了しました。

USRP-RIO (IDL)で、長時間IQデータ取得を行うと一定間隔でオーバーフローが発生する不具合?か(1)

こんにちはドルフィンシステム福島です。

今日の話題は、比較的ショッキングな話題です。

USRP-RIOをIDLというプログラミング方法でPCI Express接続で接続している場合、長時間IQデータを取得していると、一定間隔でUSRPから取得したIQデータがオーバーフローして一部のデータが欠損してしまいます。

設定によりますが、IQレート 200Msps, Number of Samples 256kで大体30分程度で発生する計算になります。

回避方法はありますのでご安心ください。
Number of Samplesを大きく設定することで実質的に回避できます。


バッファ残容量について

USRP-RIOをIDLで使用する場合、IQデータは下図のFIFO Read関数で読み込みます。

この際に”Elements Remaining”には「読み込み済でUSRPドライバに蓄積されているIQデータのサンプル数」(以下、バッファ残容量と呼称します)が出力されてきます。

例えば1000が返ってきたら、1000サンプル読み込んでいないデータがあるという意味になります。

バッファ残容量が多い場合はCPUの読み込みが遅いと推測でき、少なければCPUの読み込みは順調であると判断できます。

このバッファ量は"Host FIFO Depth"と呼称されていて、ソフトウェアから設定可能です。デフォルトでは1Mサンプルです。


バッファ残容量を観測した例

以下のグラフは、USRPからIQデータを取得しスペクトラムグラフを表示している際のものです。0.5秒間隔でピークが表示されているのは、0.5秒間隔でグラフを描画しているためです。

描画している間にIQデータ取得がその分遅れるため、バッファ残容量が一時増えています。



次は、IQデータをファイルに書き込んだときのグラフです。

グラフ右側で、少し残容量が増えている箇所がありますが、これはファイル保存中の負荷を表しています。

このようにバッファ残容量は、IQデータ収録時の負荷を計測する指標として使用することが出来ます。


そして、

この残容量を観測していたところ、

不可解な現象を発見した。


以下のグラフを見て欲しい。



お分かりいただけただろうか


上のグラフは「USRPからIQデータをfetchした際のバッファ残容量」をプロットした物である。

縦軸が「残容量サンプル数」
横軸が「IQ Fetch回数」

Number of Samples毎に3種類

いくつかバッファ残容量が急増しているピークが見られるが、このピークは、この時にだけ残容量が極端に大きくなっている、ことを表している。

Number of Samplesを変えて計測してみるが、どれもピーク位置はすべて同じ。

詳しく調べてみると、

  • 1つめのピーク : 131074回目
  • 2つめのピーク : 393218回目
  • 3つめのピーク : 655362回目
  • 4つめのピーク : 917506回目
  • 5つめのピーク : 1179650回目
  • 6つめのピーク : 1441794回目
  • 7つめのピーク : 1703938回目

262144回(256K)間隔でピークが出ている事が判明。

Host FIFO depthを変えて41時間計測

詳しく調べるため、お盆の間、長時間IQデータを取得しました。

2021/08/13 22:47:18~2021/08/15 16:42:44 

Host FIFO depth(バッファサイズ)を 10Mサンプルにしてバッファ残容量を計測。

Host FIFOを増加させたところ、バッファ残容量の急増がなだらかになった。Host FIFO量によって挙動が違うことがわかる。


4時間連続 IQデータ取得

さらに詳しく調べるため、バッファ残容量に加えてオーバーフロー状態も計測しました。「バッファオーバーフロー」とは、「USRPから送られてきたIQデータをCPUが間に合わずに取りこぼす」事をいいます。

2021/08/17 10:36:14~2021/08/17 14:37:43

4時間IQデータを取得し続けたところ、下図ように定期的にバッファ残容量が急増することが観測できました。

また一定回数急増が繰り返されると、ある時点から急増したバッファ残容量が飽和し、急増と同時にバッファオーバーフローが発生している事が分かりました。



PXIe, PCIe両方の環境で挙動を確認する。

長時間IQデータを取得していると定期的にバッファ残容量が急増し同時にバッファオーバーフローが発生している事が分かりました。ではこの現象はPCI接続環境に依存するのか?それを調べてみます。

USRP-RIOをPCI Express接続で動作させる場合、2つの動作環境があります。

一つはPXIシャーシでのPXI Express、もう一つは通常のPCのPCI Express接続です。

接続形態はほぼ同じですが何らかの違いがあるかと思い、2つの環境でも動作確認をしました。


動作確認環境

テスト環境 - A

PC (自作)
M/B : X99-E-10G WS
CPU : Intel Core i7-6850K
MEM : 64GB

LabVIEW 2018, 2020
NI-USRP 20.1

NI USRP-2954R
PCIe MXI Interface card

テスト環境 - B

PXIシャーシとコントローラ

PXIe-8135
PXIe-1082

LabVIEW 2018, 2020
NI-USRP 20.5

NI USRP-2954R
PXIe MXI Interface card

テスト環境 - A(PC)の結果






テスト環境 - B(PXI)の結果


PCI Express接続でもPXI Express接続でも同じ問題が発生しました。


FPGA FIFO(DMA FIFO)を増量しても発生するのか?

USRPとPCはPCI Expressで接続されていて、USRP側のFPGAにもバッファがあります。

このバッファ量が少ないとバッファオーバーフローが発生する原因になります。

ではDMAバッファを増量したらこの問題は解決するのでしょうか?


DMAバッファを8Kに増量しPXI Express環境で計測しましたが、同じ現象が発生しました。

恐らくのこの現象は、PCIバスやDMA FIFOは無関係でPC側のバッファ周りの制御に原因がありそうです。



回避方法はあるのか?

この現象の解決策はなさそうですが、回避策ならあります。

この現象は、ソフトウェアがUSRPからIQデータを取得する回数が多ければ多いほど発生します。

ということは、

  • 収録帯域幅を下げる→取得するIQサンプル数が少なくなる→IQデータを取得する回数が減る

という回避策も考えられますし、

  • 一回に取り込むサンプル数を多くする→それだけ発生するまでの時間を遅らせる

という事も考えられます。

まずここでは後者の1回に取り込むサンプル数を多くして計測してみます。Number of samplesを256k→1Mにします。

すると下図のように12時間経過しても飽和しませんでした。急増したバッファ残容量から推測すると、あと6時間は粘れそうです。18時間なら1Mでカバーできそうです。



Number of Samples 1Mで、Host FIFO Depthを10Mにして計測してみました。
Number of Samples 256kの時はHost FIFO Depthを10Mにしたところ、飽和するまでの時間が延びましたので、期待できそうです。

ですが、なんとHost FIFO depth 1Mよりも早く12時間で飽和してしまいました。

結論としては、Number of Samplesを1Mにすると12時間はバッファオーバーフローせずにIQデータ取得が出来そうです。

さらに長い時間収録する場合は、Number of Samplesを2Mや4Mにすれば、回避できると思います。(2021/8/30現在試していないので、追って試して報告します。)

まとめ

  • 一定間隔でバッファ残容量が急増し、一定の回数急増した後、一定間隔でバッファ残容量が飽和し同時にオーバーフローが発生することが分かった。
  • どのNumber of samplesでもバッファ残容量の急増は、262144回fetch毎に発生している。
  • バッファ残容量の急増は、262144/1024=256Kであり何らかのプログラミング的な問題だと思われる。
  • サンプリングレート(帯域幅)が160MHz でも 80MHzでもバッファ残容量の急増は同じ間隔で発生している。
  • Host FIFO depth量でバッファ残容量の変化量と飽和量が変わる。
  • PXIe環境でも、PCIe環境でも発生した。
  • FPGA上のDMA FIFO量を8Kにしても発生した。
  • CPU使用率を見ても、関連してるプロセスは見当たらなかった。
  • 原因は不明だが、Fetch回数が固定である事とHost FIFO Depth量により挙動が変わることからみて、IDLのDMA FIFOドライバのバッファの挙動のように思える。
  • 回避策は、Number of SamplesとHost FIFO depthを大きくすることで、飽和するまでの時間を延ばして対応可能である。

この現象については、日本NIさんに報告してあり確認作業をしてもらえる手筈になっています。

また追って報告いたします。

以上、ドルフィンシステム福島でした。



コメント