Hi Zack,
I don't know the answers to your issues, but I'm wondering if you can just
use benchmark_rate rather than your custom code to evaluate performance. If
benchmark_rate can't run at the rate you want, it is unlikely that your
custom code will succeed.
Rob

On Mon, Mar 11, 2024 at 2:35 PM <zackk...@utexas.edu> wrote:

> Hello!
>
> I am having trouble using a USRP X410 to capture some high-rate data. I
> would appreciate any insight or help. Below is a diagram of how our x410 is
> connected to our host device.
>
> *---------------------*                 *---------------------*
>
> |   | NIC QSFP Port 0 |                 | QSFP28 Port 1   |   |
>
> |   |    ens1f0np0    <>---------------<>       sfp1      |   |
>
> |   |  192.168.20.1   |                 |  192.168.20.2   |   |
>
> |   |-----------------|                 |-----------------|   |
>
> | H | NIC QSFP Port 1 |                 | QSFP28 Port 0   | X |
>
> | O |    ens1f1np1    <>---------------<>       sfp0      | 4 |
>
> | S |  192.168.10.1   |                 |  192.168.10.2   | 1 |
>
> | T |-----------------|  *-----------*  |-----------------| 0 |
>
> |   | Ethernet Port 1 |  |Router     |  |  Ethernet Port  |   |
>
> |   |     eno8403     <>-|192.168.1.1|-<>      eth0       |   |
>
> |   |  192.168.1.20   |  |           |  |  192.168.1.19   |   |
>
> *---------------------*  *-----------*  *---------------------*
>
> When I run $ uhd_find_devices
>
> [INFO] [UHD] linux; GNU C++ version 9.4.0; Boost_107100; DPDK_19.11; 
> UHD_4.6.0.HEAD-0-g50fa3baa
>
> --------------------------------------------------
>
> -- UHD Device 0
>
> --------------------------------------------------
>
> Device Address:
>
>     serial: [serial number]
>
>     addr: 192.168.20.2
>
>     claimed: False
>
>     fpga: CG_400
>
>     mgmt_addr: 192.168.1.19
>
>     mgmt_addr: 192.168.10.2
>
>     mgmt_addr: 192.168.20.2
>
>     name: [name]
>
>     product: x410
>
>     type: x4xx
>
> I am using two images for the FPGA, each of which has different
> capabilities:
>
> - UC_200, which on the wiki lists Port 0 as "unused" and can achieve up to
> 250 Msps per channel.
>
> - CG_400, which lists both ports on the wiki as "100 GbE" and can achieve
> up to 500 Msps per channel.
>
> I am using UHD's C++ API to instruct the x410. My capture process tries to
> call "recv" as soon as possible without waiting to write the previous
> buffer to a file. The psudocode is as follows:
>
> - Initialize "circular" buffer of arrays. Each array is "spb" samples
> long, and there are N such buffers.
>
> - Start a "writing" thread that writes data from a queue to a file.
>
> - Set the number of samples I need (nsamps_requested), set the current
> number of samples to 0 (nsamps),
>
> - set the current buffer index to 0 (buff_idx)
>
> - set up rx_streamer to start 0.1 seconds in the future and issue
> STREAM_MODE_START_CONTINUOUS command.
>
> While (nsamps <= nsamps_requested || not_error)
>
> -Get a pointer to the buffer at buff_idx
>
> -num_rx_samps <- recv(buffer...)
>
> -check metadata returned object
>
> -add the buffer to the queue, increment the buffer index
>
> - stop streaming
>
> When I use the process above, I can get very long captures using the
> UC_200 image, with 250 Msps, and by parsing the args
> "addr=192.168.20.2,mgmt_addr=192.168.1.19" when creating the multiusrp
> pointer.
>
> When I switch to the CG_400 image, I can barely record a few seconds worth
> of data. I parse the args
> "addr=192.168.10.2,second_addr=192.168.20.2,mgmt_addr=192.168.1.19". I
> changed the logger level to get a better idea of what might be going on,
> below are some outputs for spb at 5000:
>
> [DEBUG] [RFNOC::MGMT] Established a route from EPID=4 (SW) to EPID=3
>
> [DEBUG] [RFNOC::MGMT] Throttling stream endpoint to 100% (0x0)
>
> [DEBUG] [RFNOC::MGMT] Initiated RX stream setup for EPID=3
>
> [DEBUG] [RFNOC::MGMT] Finished RX stream setup for EPID=3
>
> [DEBUG] [0/Radio#0] spp value 2032 exceeds MTU of 8016! Coercing to 1988
>
> ....
>
> [DEBUG] [RxStreamer#0] Received overrun message on port 0
>
> After the last logger message, I catc this in my "check metadata returned
> object" step and stop the loop.
>
> When this happens, I sometimes get 0 samples back, and sometimes get less
> than the samples per buffer I feed the recv command. I also found that
> while waiting for the issued command to take effect, instead of adding
> empty buffers to my queue, I check for ERROR_CODE_TIMEOUT and just continue
> the while loop.
>
> I would imagine if I can handle half the rate at 250 Msps for minutes of
> continuous capture, going to 500 Msps I could get more than a couple
> seconds. Is this because the UC_200 image has 4GiB of DRAM and the CG_400
> doesn't list any on the wiki? Is there something better I can be doing
> about the spb (I tried larger and smaller, with some luck around 50000
> spb)? Am I properly configuring the x410 to use both QSFP28 ports for the
> CG_400 image?
>
> Thanks!
>
> Zack
> _______________________________________________
> USRP-users mailing list -- usrp-users@lists.ettus.com
> To unsubscribe send an email to usrp-users-le...@lists.ettus.com
>
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to