Thx Marcus for the clarifications, On Mon, Apr 28, 2025 at 4:37 PM Marcus D. Leech <patchvonbr...@gmail.com> wrote:
> On 28/04/2025 05:33, Nikos Balkanas wrote: > > Compiled uhd 4.6.0 in debug mode. > From the output I get: > > [DEBUG] [0/Radio#0] spp(= samples per package) value 2032 exceeds MTU of > 8000! Coercing to 1996 > Mon Apr 28 09:57:02 2025 [00] [*] scanner.l:1443:main Incorrect maxsamples > (1996). Expected 19960. > Mon Apr 28 09:57:02 2025 [00] [+] Max samples/buffer[0]: 1996 > 1) Line mtu is 9000 not 8000 > 2) 2032 is not larger than 8000 <= Bug? > 3) seems that spp is setting my maxsmps > > That's number of *SAMPLES*. Samples are 4 bytes total. > Aaaah. I'll have to check the SPB option. Otherwise an 80K MTU is unreasonable:) This also means that 1 sample = 1 real + 1 imag = 32 bits with sc16 encoding . > A lot of network hardware, particularly 1Gbit hardware doesn't *ACTUALLY* > support an MTU of more than 8000, and I think > UHD uses PMTU discovery. I found that with RealTek NICs, even when > you set the MTU to 9000, it actually only supports > 8000. > > Same case with my Mellanox NIC. But 8000 is close enough:) > > > Of the examples I tried the rx_samples_c. It is the same case like mine: > single usrp. We use the same commands > and we are getting the same output:( 1996 maxsmpls. > The error text and code are from host/lib/rfnoc/radio_control_impl.cpp: 199 > I would rather not touch it. I don't know the uhd architecture and > especially the rfnoc/uhd interface. > Besides I am a c programmer, not c++:( > multi_usrp class has a set_rx_spp function, but it is not for me:( > > You can look at the benchmark_rate example to see how to set a > samples-per-buffer other than the default, which is > based on the MTU. It uses an "SPB" command-line parameter. > > Thx, I will check it out, when I get back to ubuntu.. Now I am in windows:( benchmark_rate uses the multi-usrp class. > > HTH > Nikos > > On Mon, Apr 28, 2025 at 6:02 AM Nikos Balkanas <nbalka...@gmail.com> > wrote: > >> Point taken:) I'm proposing smt different: >> pchar +ICMP are just to test line and connectors. First step. Not to >> bench USRP. >> benchmark_rate is to bench/stress usrp. >> These 2 are independent, and complementary. >> Pchar is telling me nothing more than my fiber cable and connectors are >> good. >> It saved me a trip tomorrow to my local PC store, where fiber cable and >> connectors are ~7 E each. >> benchmark_rate on the other hand is quite interesting. >> It points to software,and particularly my uhd_init() >> >> Just found and downloaded the sources to uhd 4.6.0 from Ubuntu Launchpad. >> Now I can go through the source of the example you told me:) >> Ettus used to keep an archive of old uhd sources around. Seems it's >> gone:( >> Open source means, among others, free to choose the source version that >> you need... >> Having the latest source in Github is only partly open source. >> During development we need to freeze updates. When in 5 years we go >> into production we can't find the old sources anymore:( >> If a customer discovers a bug, not in our code, but in one of the >> libraries that >> we use, what are we gonna do? >> >> BR >> Nikos >> >> >> >> On Mon, Apr 28, 2025 at 5:01 AM Marcus D. Leech <patchvonbr...@gmail.com> >> wrote: >> >>> On 27/04/2025 21:58, Nikos Balkanas wrote: >>> >>> My bad: >>> >>> throughput of 5.619 Kb/s requesting ICMP replies, +> throughput of 5,619 >>> Kb/s requesting ICMP replies >>> Local thousand separator is ".", whereas in the US is ",":( >>> >>> It is STILL the case that the ICMP machinery in these radios is >>> ABSOLUTELY NOT on the fast-path inside >>> the hardware. The only way to get a good feel for how much sample >>> bandwidth they can process is >>> with examples like "benchmark_rate". >>> >>> >>> >>> On Mon, Apr 28, 2025 at 12:37 AM Nikos Balkanas <nbalka...@gmail.com> >>> wrote: >>> >>>> Hi Marcus, >>>> >>>> You were right. No need to change NIC:) >>>> This is not a software issue. uhd_rx_streamer_max_num_samps runs right >>>> after uhd initialization before >>>> any other code had the chance to run. >>>> Link capacity doesn't seem to be the issue either... >>>> Running pchar on the link, descendant of pathchar, reports a throughput >>>> of 5.619 Kb/s requesting ICMP replies, >>>> to varying packet sizes (32->9000 (MTU), incr by 32). >>>> sudo pchar -m 9000 -p ipv4icmp usrp >>>> https://www.kitchenlab.org/www/bmah/Software/pchar/ >>>> >>>> It corresponds to 351.218.019 16-bit samples or 175,609.044 32-bit >>>> samples, if each sample is 32-bit(real + imag) >>>> Seems that uhd is not running at link capacity but is doing smt else. >>>> I will have to download and check with the sources... >>>> The package version for Ubuntu 24.04 is uhd 4.6.0. >>>> Where can I download the sources for uhd 4.6.0? >>>> >>>> BR >>>> Nikos >>>> >>>> On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas <nbalka...@gmail.com> >>>> wrote: >>>> >>>>> Thanks for your time. >>>>> I will check out the example. >>>>> This is not a buffer problem. I just need 1024 Samples >>>>> (real+imaginary) for FFT... >>>>> I should be able to get them in a single pass. >>>>> You saw my code, not a smoking gun there. >>>>> >>>>> This is probably is a physical problem. >>>>> Cable is an SFP fiber dedicated line. Cannot go bad. >>>>> Maybe the connections are not sitting right :(... >>>>> >>>>> BR >>>>> Nikos >>>>> >>>>> On Sat, Apr 26, 2025 at 6:45 AM Marcus D. Leech < >>>>> patchvonbr...@gmail.com> wrote: >>>>> >>>>>> On 25/04/2025 23:33, Nikos Balkanas wrote: >>>>>> >>>>>> Actually MTU is 9000. This is one of the recommendations... >>>>>> I tried it with MTU 1500. It was worse:( >>>>>> maxsamples dropped to 364... >>>>>> >>>>>> Right, 9000, rather than 8000. >>>>>> >>>>>> Upgrading to 10Gbit wont' give you larger MTU. >>>>>> >>>>>> What you're trying to do, I think, is to solve a buffer-management >>>>>> problem in your *application* at entirely the wrong >>>>>> level in the stack. >>>>>> >>>>>> It is EXCEEDINGLY COMMON for hardware drivers to only be able to >>>>>> deliver in chunks that may not be perfectly adapted to >>>>>> the requirements of your application. So, a common programming >>>>>> pattern is to deal with this in your application. >>>>>> >>>>>> You should probably look at example code like rx_samples_to_file >>>>>> >>>>>> >>>>>> >>>>>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>>>>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>>>>> [INFO] [X300] X300 initialization sequence... >>>>>> [INFO] [X300] Maximum frame size: 1472 bytes. >>>>>> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a >>>>>> send frame size of at least 8000 for best >>>>>> performance, but your configuration will only allow 1472.This may >>>>>> negatively impact your maximum achievable sample rate. >>>>>> Check the MTU on the interface and/or the send_frame_size argument. >>>>>> [WARNING] [X300] For the 192.168.40.2 connection, UHD recommends a >>>>>> receive frame size of at least 8000 for best >>>>>> performance, but your configuration will only allow 1472.This may >>>>>> negatively impact your maximum achievable sample rate. >>>>>> Check the MTU on the interface and/or the recv_frame_size argument. >>>>>> [INFO] [GPS] No GPSDO found >>>>>> [INFO] [X300] Radio 1x clock: 200 MHz >>>>>> [WARNING] [UDP] The send buffer could not be resized sufficiently. >>>>>> Target sock buff size: 24912805 bytes. >>>>>> Actual sock buff size: 1048576 bytes. >>>>>> See the transport application notes on buffer resizing. >>>>>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>>>>> Sat Apr 26 06:30:34 2025 [00] [+] Created USRP with args >>>>>> Sat Apr 26 06:30:34 2025 [00] [+] Master clock is at 200 Mhz >>>>>> Sat Apr 26 06:30:34 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>>>>> [WARNING] [UDP] The send buffer could not be resized sufficiently. >>>>>> Target sock buff size: 24912805 bytes. >>>>>> Actual sock buff size: 1048576 bytes. >>>>>> See the transport application notes on buffer resizing. >>>>>> Please run: sudo sysctl -w net.core.wmem_max=24912805 >>>>>> Sat Apr 26 06:30:34 2025 [00] [*] scanner.l:1446:main Incorrect >>>>>> maxsamples (364). Expected 19960. >>>>>> Sat Apr 26 06:30:34 2025 [00] [+] Max samples/buffer[0]: 364 >>>>>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition >>>>>> of zero sam >>>>>> >>>>>> Nikos >>>>>> >>>>>> On Sat, Apr 26, 2025 at 5:46 AM Marcus D. Leech < >>>>>> patchvonbr...@gmail.com> wrote: >>>>>> >>>>>>> On 25/04/2025 22:26, Nikos Balkanas wrote: >>>>>>> >>>>>>> Thanks Marcus, >>>>>>> >>>>>>> for your fast reply. >>>>>>> >>>>>>> On Sat, Apr 26, 2025 at 4:08 AM Marcus D. Leech < >>>>>>> patchvonbr...@gmail.com> wrote: >>>>>>> >>>>>>>> On 25/04/2025 20:50, Nikos Balkanas wrote: >>>>>>>> >>>>>>>> Hello, >>>>>>>> >>>>>>>> I need to buy a new NIC. What would you suggest? >>>>>>>> The one I use is an old Mellanox 10 Gbs, before the Connect-4 >>>>>>>> series. >>>>>>>> It can only do 1996 S/s, need 19960 (10x more) to work with latest >>>>>>>> uhd. >>>>>>>> Using Ubuntu 24.04 and uhd 4.6.0 >>>>>>>> >>>>>>>> So, 1.996ksps vs 19.960ksps? You hardly need a 10Gbit link to >>>>>>>> support that. So, perhaps something >>>>>>>> is being lost here in your requirements? >>>>>>>> >>>>>>> >>>>>>> True. Can't explain it in terms of bandwidth. 16 * 1996 = 31.936 >>>>>>> Kbps, 16 * 19960 = 319.360 Kbps well short of a 10 Gbps line:( >>>>>>> Does a complex pair count as 1 sample, or 2? >>>>>>> I have followed all the instructions in >>>>>>> https://kb.ettus.com/USRP_Host_Performance_Tuning_Tips_and_Tricks, >>>>>>> Even installed the DPDK drivers. My Mellanox is too old to use their >>>>>>> OFED drivers:( >>>>>>> >>>>>>>> >>>>>>>> On a related question. it seems that the streamer doesn't crash >>>>>>>> anymore >>>>>>>> when receiving less than MAXSPS samples, instead it reads 0:( >>>>>>>> This was due to the sse2 code not aligned in convert. >>>>>>>> I change my stream args to cpu_format=sc16, otw=sc16, so no >>>>>>>> conversion required. >>>>>>>> Streamer still doesn't read anything. Is there a reason for it? >>>>>>>> >>>>>>>> You'd need to share more of your code. This should just work as >>>>>>>> far as I can tell. >>>>>>>> >>>>>>>> Thanks. these are just the usrp code: >>>>>>> >>>>>>> int main() >>>>>>> { >>>>>>> uhd_stream_args_t stream_args = >>>>>>> { >>>>>>> >>>>>>> .cpu_format = "sc16", >>>>>>> >>>>>>> .otw_format = "sc16", >>>>>>> .args >>>>>>> = "", >>>>>>> >>>>>>> .n_channels = 1, >>>>>>> >>>>>>> .channel_list = &channel >>>>>>> }; >>>>>>> ..uhd_stream_cmd_t stream_cmd = >>>>>>> { >>>>>>> >>>>>>> .stream_mode = UHD_STREAM_MODE_NUM_SAMPS_AND_DONE, >>>>>>> >>>>>>> .stream_now = true >>>>>>> }; >>>>>>> >>>>>>> if (uhd_init(0, 0, gain)) do_exit(20); >>>>>>>> if ((err = uhd_usrp_get_rx_stream(dev[0], &stream_args, >>>>>>>> rx_streamer[0]))) >>>>>>>> { >>>>>>>> uhd_get_last_error(errmsg, 127); >>>>>>>> error(log, "Failed to get streamer[0] (%d). %s.\n", 0, >>>>>>>> FL, LN, FN, err, errmsg); >>>>>>>> uhd_rx_streamer_free(&rx_streamer[0]); >>>>>>>> rx_streamer[0] = NULL; >>>>>>>> uhd_rx_metadata_free(&md[0]); >>>>>>>> md[0] = NULL; >>>>>>>> do_exit(30); >>>>>>>> } >>>>>>>> if ((err = uhd_rx_streamer_max_num_samps(rx_streamer[0], >>>>>>>> &maxsamps))) >>>>>>>> >>>>>>> { >>>>>>>> uhd_get_last_error(errmsg, 127); >>>>>>>> error(log, "Failed to get max samples/buffer[0] (%d). >>>>>>>> %s.\n", 0, FL, LN, FN, err, >>>>>>>> ..errmsg); >>>>>>>> do_exit(35); >>>>>>>> } >>>>>>>> if (maxsamps != MAXSMPS) >>>>>>>> warn(log, "Incorrect maxsamples (%ld). Expected %d.\n", 0, >>>>>>>> FL, LN, FN, maxsamps, >>>>>>>> MAXSMPS); >>>>>>>> info(log, "Max samples/buffer[0]: %ld\n", 0, maxsamps); >>>>>>>> >>>>>>>> if ((err = uhd_rx_streamer_issue_stream_cmd(rx_streamer[0], >>>>>>>> &stream_cmd))) >>>>>>>> >>>>>>> { >>>>>>>> uhd_get_last_error(errmsg, 127); >>>>>>>> error(log, "Failed to start streamer[0] (%d). %s.\n", 0, >>>>>>>> FL, LN, FN, err, errmsg); >>>>>>>> do_exit(40); >>>>>>>> } >>>>>>>> >>>>>>> [...] >>>>>>> do_exit(0) >>>>>>> } >>>>>>> >>>>>>> >>>>>>>> bool uhd_init(size_t channel, double srate, double gain) >>>>>>>> { >>>>>>>> double tmp; >>>>>>>> uhd_rx_metadata_error_code_t err; >>>>>>>> >>>>>>>> if ((err = >>>>>>>> uhd_set_thread_priority(uhd_default_thread_priority, true))) >>>>>>>> warn(log, "Unable to set main thread priority (%d). >>>>>>>> %s.\n", 0, FL, LN, FN, >>>>>>>> err, uhdError(err)); >>>>>>>> /* Create USRP */ >>>>>>>> f ((err = uhd_usrp_make(&dev[channel], "type=x300"))) >>>>>>>> { >>>>>>>> error(log, "Failed to create USRP (%d). %s.\n", 0, FL, >>>>>>>> LN, FN, err, >>>>>>>> uhdError(err)); >>>>>>>> dev[channel] = NULL; >>>>>>>> return(FAIL); >>>>>>>> >>>>>>> } >>>>>>>> info(stderr, "Created USRP with args\n", 0); >>>>>>>> >>>>>>>> /* Create RX streamer */ >>>>>>>> if ((err = uhd_rx_streamer_make(&rx_streamer[channel]))) >>>>>>>> { >>>>>>>> error(log, "Failed to create rx_streamer[%d] (%d). %s.\n", >>>>>>>> 0, FL, LN, FN, >>>>>>>> channel, err, uhdError(err)); >>>>>>>> return(FAIL); >>>>>>>> } >>>>>>>> /* Create RX metadata */ >>>>>>>> if ((err = uhd_rx_metadata_make(&md[channel]))) >>>>>>>> { >>>>>>>> error(log, "Failed to create md[%d] (%d). %s.\n", 0, FL, >>>>>>>> LN, FN, channel, >>>>>>>> err, uhdError(err)); >>>>>>>> return(FAIL); >>>>>>>> } >>>>>>>> >>>>>>>> /* Get master clock rate */ >>>>>>>> if ((err = uhd_usrp_get_master_clock_rate(dev[channel], 0, >>>>>>>> &tmp))) >>>>>>>> >>>>>>> { >>>>>>>> error(log, "Failed to set master clock to %.0lf Mhz >>>>>>>> (%d). %s.\n", 0, FL, >>>>>>>> LN, FN, tmp/1000000, err, uhdError(err)); >>>>>>>> return(FAIL); >>>>>>>> } >>>>>>>> info(stderr, "Master clock is at %.0lf Mhz\n", 0, >>>>>>>> tmp/1000000); >>>>>>>> /* Set the sample rate */ >>>>>>>> if (srate && !uhd_set_rx_rate_check(channel, srate)) >>>>>>>> return(FAIL); >>>>>>>> /* Set the tuner gain SBX-120 is 0-31.5 in .5 db steps */ >>>>>>>> >>>>>>> if ((err = uhd_usrp_set_rx_gain(dev[channel], gain, channel, >>>>>>>> ""))) >>>>>>>> { >>>>>>>> error(log, "Failed to set tuner[%d] gain to %.0lf db >>>>>>>> (%d). %s.\n", 0, FL, >>>>>>>> LN, FN, channel, gain, err, uhdError(err)); >>>>>>>> return(FAIL); >>>>>>>> } >>>>>>>> if (!(err = uhd_usrp_get_rx_gain(dev[channel], channel, >>>>>>>> "", &tmp))) >>>>>>>> info(log, "Tuner[%d] gain set to %.0lf (%.0lf) >>>>>>>> dB\n", 0, channel, tmp, gain); >>>>>>>> >>>>>>> ./* Set channel bw to conserve tuner resources. Not needed, >>>>>>> set by srate */ >>>>>>> uhd_usrp_set_rx_bandwidth(dev[channel], srate, >>>>>>> channel); >>>>>>> ./* Disable subtracting constant averaged background. >>>>>>> Signal looks cleaner */ >>>>>>> if ((err = >>>>>>> uhd_usrp_set_rx_dc_offset_enabled(dev[channel], false, channel))) >>>>>>> { >>>>>>> warn(log, "Failed to disable FPGA DC offset on >>>>>>> channel %d(%d). %s.\n", 0, >>>>>>> FL, LN, FN, channel, err, uhdError(err)); >>>>>>> } >>>>>>> info(stderr, "Disabled FPGA DC offset on channel >>>>>>> %d\n", 0, channel); >>>>>>> return(SUCCESS); >>>>>>> } >>>>>>> >>>>>>> This is the generated output: >>>>>>> >>>>>>> [INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300; >>>>>>> UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1 >>>>>>> [INFO] [X300] X300 initialization sequence... >>>>>>> [INFO] [X300] Maximum frame size: 8000 bytes. >>>>>>> [INFO] [X300] Radio 1x clock: 200 MHz >>>>>>> Sat Apr 26 03:33:48 2025 [00] [+] Created USRP with args >>>>>>> Sat Apr 26 03:33:48 2025 [00] [+] Master clock is at 200 Mhz >>>>>>> Sat Apr 26 03:33:48 2025 [00] [+] Tuner[0] gain set to 30 (30) dB >>>>>>> Sat Apr 26 03:33:48 2025 [00] [*] scanner.l:1446:main Incorrect >>>>>>> maxsamples (1996). Expected 19960. >>>>>>> Sat Apr 26 03:33:48 2025 [00] [+] Max samples/buffer[0]: 1996 >>>>>>> [WARNING] [0/Radio#0] Ignoring stream command for finite acquisition >>>>>>> of zero samples >>>>>>> I hope this reads OK. Maybe next time I should attach the code:) >>>>>>> >>>>>>>> TIA >>>>>>>> Nikos >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> USRP-users mailing list -- usrp-users@lists.ettus.com >>>>>>>> To unsubscribe send an email to usrp-users-le...@lists.ettus.com >>>>>>>> >>>>>>>> >>>>>>>> I believe that max number of samples-per-buffer is limited by MTU >>>>>>> size. Which is typically around 8000 or so for "jumbo frames". >>>>>>> >>>>>>> >>>>>>> >>>>>> >>> >
_______________________________________________ USRP-users mailing list -- usrp-users@lists.ettus.com To unsubscribe send an email to usrp-users-le...@lists.ettus.com