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