Discussion and technical support related to USRP, UHD, RFNoC
View all threadsOn 27/04/2025 20:40, Nikos Balkanas wrote:
Ubuntu packages...
No -dev, => no includes:(
The ICMP test is fine for testing physical wear (line, connectors OSI
layer 2)
Ofc a dedicated usrp benchmark is better for application (layer 4)
benchmark:)
PS. If this conversation is getting long, we can switch to private mail...
Try libuhd-dev
Also:
dpkg -S /usr/lib/uhd/examples/benchmark_rate
uhd-host: /usr/lib/uhd/examples/benchmark_rate
On Mon, Apr 28, 2025 at 2:45 AM Marcus D. Leech
patchvonbraun@gmail.com wrote:
On 27/04/2025 19:34, Nikos Balkanas wrote:
For that i will need the sources.
Do you know where can I download the UHD 4.6.0 sources?
TIA
Nikos
If you have an installed version of UHD on your system, then the
examples should also have been installed. How did you install
UHD?
You might need to install "uhd-host" if you installed from
packaged binaries, but all the examples and utilities should be
there along with the libraries.
But the GIT repo for the UHD source is here:
https://github.com/EttusResearch/uhd
These days, most distros package UHD, so in many cases you don't
need to build from source.
On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech
<patchvonbraun@gmail.com> wrote:
On 27/04/2025 17:37, Nikos Balkanas 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
YOu CANNOT use ICMP tests to determine link capacity with a
USRP -- ICMP is processed via completely different
"stack" in the radio.
Use "benchmark_rate" instead.
On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas
<nbalkanas@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
<patchvonbraun@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
<patchvonbraun@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 <patchvonbraun@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 tousrp-users-leave@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".
Thx, Marcus
On Mon, Apr 28, 2025 at 3:50 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:
On 27/04/2025 20:40, Nikos Balkanas wrote:
Ubuntu packages...
No -dev, => no includes:(
The ICMP test is fine for testing physical wear (line, connectors OSI
layer 2)
Ofc a dedicated usrp benchmark is better for application (layer 4)
benchmark:)
PS. If this conversation is getting long, we can switch to private mail...
Try libuhd-dev
Yup that did it. Iwas trying libuhd4.6.0-dev and failed:(
Also:
dpkg -S /usr/lib/uhd/examples/benchmark_rate
uhd-host: /usr/lib/uhd/examples/benchmark_rate
No need. Actually with libuhd-dev all were installed under
/usr/libexec/uhd/examples:
-> ls /usr/libexec/uhd/examples
benchmark_rate rx_multi_samples test_pps_input
gpio rx_samples_c
test_timed_commands
latency_test rx_samples_to_file
twinrx_freq_hopping
network_relay rx_samples_to_udp tx_bursts
python rx_timed_samples
txrx_loopback_to_file
rfnoc_nullsource_ce_rx spi
tx_samples_c
rfnoc_radio_loopback sync_to_gps
tx_samples_from_file
rfnoc_replay_samples_from_file test_clock_synch tx_timed_samples
rfnoc_rx_to_file test_dboard_coercion tx_waveforms
rx_ascii_art_dft test_messages
usrp_list_sensors
Now for the receive benchmark:
-> benchmark_rate --args="type=x300,address=192.168.40.2"--rx_rate=2e6
[INFO] [UHD] linux; GNU C++ version 13.2.0; Boost_108300;
UHD_4.6.0.0+ds1-5.1ubuntu0.24.04.1
[00:00:00.000487] Creating the usrp device with:
type=x300,address=192.168.40.2...
[INFO] [X300] X300 initialization sequence...
[INFO] [X300] Maximum frame size: 8000 bytes.
[INFO] [X300] Radio 1x clock: 200 MHz
Using Device: Single USRP:
Device: X-Series Device
Mboard 0: X300
RX Channel: 0
RX DSP: 0
RX Dboard: A
RX Subdev: SBX-120 RX
RX Channel: 1
RX DSP: 1
RX Dboard: B
RX Subdev: SBX-120 RX
TX Channel: 0
TX DSP: 0
TX Dboard: A
TX Subdev: SBX-120 TX
TX Channel: 1
TX DSP: 1
TX Dboard: B
TX Subdev: SBX-120 TX
[00:00:02.20406867] Setting device timestamp to 0...
[00:00:02.24011764] Testing receive rate 2.000000 Msps on 1 channels
[00:00:12.25522915] Benchmark complete.
Benchmark rate summary:
Num received samples: 20,000,095
Num dropped samples: 0
Num overruns detected: 0
Num transmitted samples: 0
Num sequence errors (Tx): 0
Num sequence errors (Rx): 0
Num underruns detected: 0
Num late commands: 0
Num timeouts (Tx): 0
Num timeouts (Rx): 0
That's 2e6 sps. that's a far cry from the 1996 maxsps I'm getting
from uhd_rx_streamer_max_num_samps(rx_streamer[0], &maxsamps)
Are these samples same? Seems the problem to be in uhd_init() after all:(
What do you think?
TIA
Nikos
On Mon, Apr 28, 2025 at 2:45 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:
On 27/04/2025 19:34, Nikos Balkanas wrote:
For that i will need the sources.
Do you know where can I download the UHD 4.6.0 sources?
TIA
Nikos
If you have an installed version of UHD on your system, then the examples
should also have been installed. How did you install
UHD?
You might need to install "uhd-host" if you installed from packaged
binaries, but all the examples and utilities should be
there along with the libraries.
But the GIT repo for the UHD source is here:
https://github.com/EttusResearch/uhd
These days, most distros package UHD, so in many cases you don't need to
build from source.
On Mon, Apr 28, 2025 at 12:39 AM Marcus D. Leech patchvonbraun@gmail.com
wrote:
On 27/04/2025 17:37, Nikos Balkanas 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
YOu CANNOT use ICMP tests to determine link capacity with a USRP -- ICMP
is processed via completely different
"stack" in the radio.
Use "benchmark_rate" instead.
On Sat, Apr 26, 2025 at 7:02 AM Nikos Balkanas nbalkanas@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 <
patchvonbraun@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 <
patchvonbraun@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 <
patchvonbraun@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-leave@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".
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 ",":(
On Mon, Apr 28, 2025 at 12:37 AM Nikos Balkanas nbalkanas@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 nbalkanas@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 patchvonbraun@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 patchvonbraun@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 <
patchvonbraun@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-leave@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".
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 nbalkanas@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
<nbalkanas@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
<patchvonbraun@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
<patchvonbraun@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
<patchvonbraun@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 tousrp-users-leave@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".
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 patchvonbraun@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 nbalkanas@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 nbalkanas@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 patchvonbraun@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 <
patchvonbraun@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 <
patchvonbraun@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-leave@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".
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
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:(
HTH
Nikos
On Mon, Apr 28, 2025 at 6:02 AM Nikos Balkanas nbalkanas@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 patchvonbraun@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 nbalkanas@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 nbalkanas@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 <
patchvonbraun@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 <
patchvonbraun@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 <
patchvonbraun@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-leave@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".
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
That's number of SAMPLES. Samples are 4 bytes total.
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.
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.
HTH
Nikos
On Mon, Apr 28, 2025 at 6:02 AM Nikos Balkanas nbalkanas@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
<patchvonbraun@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
<nbalkanas@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
<nbalkanas@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
<patchvonbraun@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
<patchvonbraun@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 <patchvonbraun@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 tousrp-users-leave@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".
Thx Marcus for the clarifications,
On Mon, Apr 28, 2025 at 4:37 PM Marcus D. Leech patchvonbraun@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
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 nbalkanas@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 patchvonbraun@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 nbalkanas@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 nbalkanas@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 <
patchvonbraun@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 <
patchvonbraun@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 <
patchvonbraun@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-leave@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".
Hi Marcus,
spb(=samples/buffer) is not what I hoped for. It is just another way to
set the
stream_cmd.num_samples in the streamer. I already use there MAXSMPS.
Besides benchmark_rate reports maxsmps 1996 like me:(
That part is only controlled by the MTU. Seems it is the same
for everyone, and that we are using the generic chdr_sc16_to_xx
instead the guts (sse2) conversion:( Unless they use the multi_usrp
class and set spp on their own.
I think that MAXSMPS used to be 1996, before someone changed it to
19960.
BR
Nikos
BR
Nikos
On Mon, Apr 28, 2025 at 5:22 PM Nikos Balkanas nbalkanas@gmail.com wrote:
Thx Marcus for the clarifications,
On Mon, Apr 28, 2025 at 4:37 PM Marcus D. Leech patchvonbraun@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
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 nbalkanas@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 patchvonbraun@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 nbalkanas@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 nbalkanas@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 <
patchvonbraun@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 <
patchvonbraun@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 <
patchvonbraun@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-leave@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".
On 28/04/2025 18:04, Nikos Balkanas wrote:
Hi Marcus,
spb(=samples/buffer) is not what I hoped for. It is just another way
to set the
stream_cmd.num_samples in the streamer. I already use there MAXSMPS.
Besides benchmark_rate reports maxsmps 1996 like me:(
That part is only controlled by the MTU. Seems it is the same
for everyone, and that we are using the generic chdr_sc16_to_xx
instead the guts (sse2) conversion:( Unless they use the multi_usrp
class and set spp on their own.
I think that MAXSMPS used to be 1996, before someone changed it to
19960.
BR
Nikos
BR
Nikos
Well, regardless of all of this, there's no way to pack more than a
certain number of samples into an MTU frame.
If your high-level needs are to process "things" in larger chunks, you
need to layer something on top of what UHD
does, since it is, at the end of the day, a hardware driver library.
It's not an application layer programming framework.
On Mon, Apr 28, 2025 at 5:22 PM Nikos Balkanas nbalkanas@gmail.com
wrote:
Thx Marcus for the clarifications,
On Mon, Apr 28, 2025 at 4:37 PM Marcus D. Leech
<patchvonbraun@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
<nbalkanas@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
<patchvonbraun@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
<nbalkanas@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
<nbalkanas@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 <patchvonbraun@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 <patchvonbraun@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
<patchvonbraun@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 tousrp-users-leave@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".