Commit Graph
9883 Commits
Author SHA1 Message Date
Robert Schmidt 5b9d4550ba Remove unused defines 2026-02-25 16:26:21 +01:00
Robert Schmidt 0ea119ec39 Align t_nrPolar_params allocation to 32 bytes 2026-02-25 16:26:21 +01:00
Robert Schmidt 448f273248 Write NB_ANTENNAS_RX/TX to header file and use in stack
Prior to this commit, constants NB_ANTENNAS_RX/TX are provided on the
command line to each compiler invocation. This has the drawback (1) that
also files that don't need that get the constants, and (2) it is not
easy to find them using ctags or similar, as the only definition is in
CMakeLists.txt (where it is not found).

In this commit, use cmake configure_file() to write a header file with
these constants. The file will be generated during cmake invocation, and
written to <build-dir>/common/cmake_defs.h. The relevant files that
need this definition will pick it from the header.

This has been used previously also in a commit to write git information.

See-also: 8bffd1666d ("Avoid complete rebuild on cmake run with git info change")
2026-02-25 16:26:21 +01:00
francescomani b53f4a6e37 using constants for FAPI precoding weigths instead of hardcoded values 2026-02-20 11:05:43 +01:00
Robert Schmidt 8925654c07 Remove unused 4G MMSE code
Since the parent commit, USE_MMSE is not defined. Thus, the
corresponding code is commented out. Since there are no linker problems,
it is obvious that this code is never called, and we can remove it.
2026-02-16 20:05:05 +01:00
Laurent THOMAS da7897be04 remove cblas and lapack dependency, as the calling code can't be called in present master branch (likely never worked/fished code 2026-02-16 20:05:04 +01:00
Laurent THOMAS 345b44d9b3 re-order the functions to have them in natural C order (function implemented before call). Add a #if to be able to disable never called code, but the flag is not activated in this commit 2026-02-16 20:04:29 +01:00
Laurent THOMAS b6171949cd only cleaning: remove dead code, make static functions, simplify code 2026-02-16 20:04:29 +01:00
Robert Schmidt bf325466b3 Merge remote-tracking branch 'origin/bladerf_testing' into integration_2026_w07 (!3894)
Reimplement BladeRF radio driver, make it work for 5G

This MR reimplements the BladeRF radio driver such that it is usable for
5G. On the way, we remove unused code, refactor it for readability, and
update configuration.

Tested:

- 40MHz carrier as gNB
- 20MHz carries as gNB

An initial focus was 2x2, but I did not manage to do this yet.
Documentation on the format is here [1] and there is a helper [2]. I
will do this later.

[1] https://www.nuand.com/bladeRF-doc/libbladeRF/v2.6.0/group___s_t_r_e_a_m_i_n_g___f_o_r_m_a_t.html#gga4c61587834fd4de51a8e2d34e14a73b2a92cfbda7a5577c809e2ff6123f8f30b6
[2] https://www.nuand.com/bladeRF-doc/libbladeRF/v2.6.0/group___s_t_r_e_a_m_i_n_g___f_o_r_m_a_t.html#gac754a927c12cd8aa3fc270e9dd9c108e
2026-02-12 17:04:10 +01:00
Robert Schmidt 7bf290d674 Merge remote-tracking branch 'origin/cleanup-cmake' into integration_2026_w07 (!3915)
Cleanup Cmake: remove some double compilation

Harmonize some cmake code to avoid double compilation, notably around
polar and smallblock. In develop, we just add their sources to other
targets, whereas now we define STATIC libraries (further changed to
shared library in !3856) to avoid double compilation.

With this command line:

    cmake .. -GNinja -DENABLE_TESTS=ON && ninja

shows that before we compile 12631 files, where after it is 12583

there is additional supporting cleanup (move code, remove headers,
types, ...).

there is more harmonization to do, I limited myself to some easy wins.
For instance, we do the same with PDCP/SDAP, and this should be
refactored into STATIC libraries as well.
2026-02-12 12:00:24 +01:00
Robert Schmidt 5d004818d4 Merge remote-tracking branch 'origin/fix-srs-power' into integration_2026_w07 (!3917)
Fix SRS power computation

The SRS symbols have been remapped recently in
srs_estimated_channel_freq, and therefore the calculation of the SRS
power has to retrieve the symbols from different positions.
2026-02-12 11:57:42 +01:00
Robert Schmidt 49eeba339a Move smallblock cmake code to subdirectory 2026-02-12 08:47:06 +01:00
Robert Schmidt f159d22499 Move crc_byte cmake code to subdirectory 2026-02-12 08:47:06 +01:00
Robert Schmidt 76a5aad7c4 Move polar coding cmake code to subdirectory 2026-02-12 08:47:06 +01:00
Robert Schmidt 7a7ffc18e2 Move reverse_bits*() to separate source file
reversing bits is not NR specific. Think of it like this: LTE code might
use reverse_bits*() as well, but in the old location, it would pull in a
bunch of NR dependencies that are superfluous.
2026-02-12 08:47:06 +01:00
Robert Schmidt bfc0f9e2a3 Merge remote-tracking branch 'origin/remove_nr_vcd' into integration_2026_w07 (!3913)
Remove VCD signal dumper from NR code

We don't test VCD in 5G NR code (and haven't tested it in 4G for years).
Remove the VCD traces in 5G code to avoid any ambiguity. 4G code remains
in place, as well as the tools to analyze existing traces.
2026-02-12 08:43:27 +01:00
Robert Schmidt c5834e6c1b Fix nr_srssim linking problems when building with E2 support
In this case, there are a number of linker errors:

    /usr/bin/ld: libL2_NR.a(rrc_gNB.c.o): in function `nr_rrc_transfer_protected_rrc_message':
    /home/richie/oai/openair2/RRC/NR/rrc_gNB.c:330:(.text+0x6f6): undefined reference to `signal_rrc_msg'

However, nr_srssim does not need RRC, while it is being linked in. Thus,
link without nr_rrc and L2. For the remaining two linker problems:

- provide a definition of NR_IF_Module_init() as in most other
  simulators
- move rrc_get_max_nr_csrs() to nr_common.c. It is already declared in
  the corresponding header, and itself does not have anything to do with
  RRC radio configuration, therefore it does not belong to
  nr_radio_config.c
2026-02-11 18:37:45 +01:00
rmagueta b2093089ab Fix SRS power computation 2026-02-11 11:24:21 +00:00
francescomani 0a447fd304 remove VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME from NR code and remaining unused header include 2026-02-11 10:30:07 +01:00
Robert Schmidt f8d9c54eff Merge remote-tracking branch 'origin/multipath-testing-ci' into integration_2026_w07 (!3886)
Integrate GPU-Accelerated Channel Simulation + CI Test Pipeline

This MR builds on top of MR !3588 (feat: GPU Accelerated Channel
Simulation Pipeline).

The main portion of the changes is directly taken from MR !3588, and
focuses on integrating the GPU-accelerated channel simulation. On top of
that, this MR adds CI-related configurations to introduce a new channel
simulation testing pipeline into the CI --> RAN-Channel-Simulation

This MR introduces a CUDA-based pipeline to offload the
multipath_channel and add_noise channel simulation functions to the GPU.
This enables large-scale, real-time physical layer simulations not
possible on the CPU.

For full documentation, please see the file at openair1/SIMULATION/TOOLS/DOC/gpu_acceleration.md.

System & Compiler Requirements: An NVIDIA GPU with a compatible driver
and the CUDA Toolkit installed.

This feature was developed and tested on the GH200 server using the GCC
12 toolchain. To ensure reproducibility, building with GCC 12 is highly
recommended.  Build Instructions

The primary flag to enable this feature is -DCUDA_ENABLE=ON. The
following command shows a sample configuration used during development
on the GH200 server:

    ./build_oai --phy_simulators --cmake-opt "\
      -DCUDA_ENABLE=ON \
      -DUSE_UNIFIED_MEMORY=ON \
      -DUSE_ATS_MEMORY=OFF \
      -DCMAKE_C_COMPILER=/usr/bin/gcc-12 \
      -DCMAKE_CXX_COMPILER=/usr/bin/g++-12 \
      -DENABLE_TESTS=ON"

Memory Model Configuration

The pipeline supports multiple CUDA memory management modes, which can
be configured at compile time. ATS Memory (-DUSE_ATS_MEMORY=ON) is
enabled by default. To use another memory model, you must first disable
ATS.

For a detailed explanation of these models, please refer to Section 3 of
the gpu_acceleration.md report.
2026-02-11 10:21:44 +01:00
Robert Schmidt 42ef7bac98 Merge remote-tracking branch 'origin/armv8-a-compatibility' into integration_2026_w07 (!3896)
Add fallbacks for ARMv8a to make it compile

The current code, on ARM, uses ARMv8.1-A RDM instructions. Add a
fallback for processors that do not have this instruction set.

Add some specific compile options for this platform.

Add debian 12 to the list of architectures.
2026-02-10 14:46:57 +01:00
Eric Mittag d7ea319b59 cmac0_prec128()/rotate_cpx_vector(): Add ARMv8.0-A fallback
The current code, on ARM, uses ARMv8.1-A RDM instructions. Add a
fallback for processors that do not have this instruction set.
2026-02-10 14:45:20 +01:00
Nika Ghaderi b9df7eb84f add markdown report for gpu benchmark 2026-02-10 08:38:50 +00:00
Jaroslava Fiedlerova 036793f55e CI: ensure proper alignment of ctest log report 2026-02-09 15:19:07 +00:00
Jaroslava Fiedlerova 50411ad86d CI: build and run CUDA channel simulation unit tests 2026-02-09 15:19:07 +00:00
Jaroslava Fiedlerova 4d7ed95179 CI: Add cmake file for CUDA channel simulation ctest threshold check 2026-02-09 15:18:50 +00:00
Jaroslava Fiedlerova 1ef9812e59 Add ctests for test_channel_scalability
For now, test in the following configuration:
- 16 parallel channels
- channel length of 32 and 128
- with 61440 and 122880 samples
- 12 trials per each test (due to CUDA kernel loading delay in first iterations)
- multiple MIMO configurations: 2TX - 2/4/8/32 RX, 2/4/8/32 TX - 2RX
2026-02-09 15:01:05 +00:00
Jaroslava Fiedlerova b40d2f60c5 Adjust output reporting of test_channel_scalability
This modification enables us to use the same analysis function in CI
as we use for physims.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 44875e1c58 Add Scalability Benchmark
This commit introduces a new, configurable benchmark,
`test_channel_scalability`, designed to measure the performance and
scalability of the CUDA channel simulation pipeline under various
conditions.

This benchmark provides several key features:
- It supports multiple GPU execution models, including a high-throughput
  "batch" mode, an asynchronous "stream" mode, and a "serial" mode for
  baseline measurements.
- It includes an optional interference simulation mode, activated by the
  `--sum-outputs` flag, which sums the outputs of multiple parallel
  channels.
- Simulation parameters (MIMO configuration, signal length,
  channel length, and batch size) are configurable via command-line
  arguments.
- It runs the full simulation pipeline on both the CPU and the GPU,
  reporting the average execution time for each and calculating the
  overall speedup.
2026-02-09 09:29:36 +00:00
Nika Ghaderi affab00c90 Add Batched and Streamed Functions for Scalability
This commit extends the CUDA API with new functions designed for
high-throughput scalability testing and advanced concurrency.

Key additions include:
- Batched versions of the kernels (`..._batched`) that use the
  `blockIdx.z` grid dimension to process many independent channel
  simulations in parallel.

- A C-callable wrapper, `run_channel_pipeline_cuda_batched`, to
  orchestrate the execution of these new kernels.

- A "streamed" version of the pipeline,
  `run_channel_pipeline_cuda_streamed`, which accepts a
  `cudaStream_t` as an argument. This allows the calling
  application to manage the execution stream, enabling overlap
  with other GPU or CPU tasks.
2026-02-09 09:29:36 +00:00
Nika Ghaderi d43d267626 Add Performance Benchmark for Full Channel Pipeline
This commit adds a performance benchmark for the end-to-end channel simulation pipeline, named `test_channel_simulation`. Its methodology is as follows:

- It systematically iterates through a matrix of test cases, varying
  MIMO configuration (Tx/Rx antennas), signal length, and channel
  length.
- For each case, it runs both the full CPU pipeline (`multipath_channel_float`
  followed by `add_noise_float`) and the single `run_channel_pipeline_cuda`
  function.
- It measures the average execution time for both implementations over
  many trials and calculates the resulting speedup.

This provides a performance characterization of the GPU pipeline across different workloads and directly compares it to the CPU baseline.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 2cb960df4e Create End-to-End CUDA Channel Simulation Pipeline
This commit introduces the main C-callable pipeline function,
`run_channel_pipeline_cuda`, located in a new `channel_pipeline.cu`
file.

This function serves as the primary entry point for the GPU channel
simulation. It orchestrates the entire sequence of operations:
- Manages Host-to-Device data transfers for the input signal and
  channel coefficients.
- Launches the `multipath_channel_kernel` and the
  `add_noise_and_phase_noise_kernel` in the correct order.
- Manages the Device-to-Host data transfer for the final output signal.
- Synchronizes to ensure completion before returning.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 7101dc04d1 Add Performance Benchmark for Noise Generation
This commit adds a new standalone benchmark, `test_noise`, to measure
and compare the performance of the CPU and CUDA implementations of noise
generation.

The benchmark's methodology is as follows:
- It iterates through various configurations, including different
  numbers of receive antennas and signal lengths.
- For each configuration, it runs both the CPU (`add_noise_float`)
  and CUDA (`add_noise_cuda`) functions multiple times to get a stable
  average execution time.
- It prints a formatted table comparing the CPU and GPU latencies and
  calculates the resulting speedup.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 257b296e41 Implement CUDA Noise and Phase Noise Kernel
This commit adds the CUDA implementation for adding Additive White
Gaussian Noise (AWGN) and phase noise to the signal. The code is
located in phase_noise.cu.

- The `add_noise_and_phase_noise_kernel` uses the NVIDIA cuRAND
  library for efficient parallel random number generation.
- Helper functions are included to create, initialize, and destroy
  the cuRAND states required by the kernel.
- Placeholder for a C-callable wrapper, `add_noise_cuda`, is also
  provided.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 97a14c3960 Add Unit Test for CUDA Multipath Channel Kernel
This commit adds a new standalone unit test, `test_multipath`, to
validate the CUDA implementation of the multipath channel.

The test performs the following steps:
- Generates a random input signal and channel model.
- Runs the CPU version (`multipath_channel_float`) to get a baseline result.
- Runs the CUDA version (`multipath_channel_cuda`) with the same inputs.
- Compares the two outputs by calculating the Mean Squared Error (MSE)
  and ensures it is below a small tolerance.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 77d854bdf3 Implement CUDA Multipath Channel Simulation
This commit introduces the CUDA implementation of the multipath channel
model in `multipath_channel.cu`.

- Implements `multipath_channel_kernel` using shared memory for
  efficient, high-performance convolution.

- Provides a C-callable wrapper, `multipath_channel_cuda`, to
  orchestrate the full pipeline of data transfers and kernel
  launches.

- The wrapper includes support for multiple memory models (Explicit
  Copy, Unified Memory, ATS) via preprocessor directives to adapt to
  different build configurations.

- Adds a `interleave_channel_output_cuda` utility to convert signal
  data from the CPU's planar format to the GPU's interleaved format.
2026-02-09 09:29:36 +00:00
Nika Ghaderi c54f0f7955 Refactor and extend CPU channel model with float support
This commit refactors the CPU-based channel model for improved reusability and extends it with single-precision floating-point support.
This serves as a performance and correctness baseline for the new CUDA implementation.

Key changes include:

	- The original double-based multipath_channel function is refactored to remove hardcoded antenna dimensions from its signature. It now accepts dynamically sized arrays, making it more flexible for use in simulators like dlsim and ulsim.

	- A new multipath_channel_float function is introduced to operate on float data types, matching the GPU's native format.

	- A corresponding add_noise_float function is also added to complete the floating-point CPU pipeline.

	- The new float-based functions are designed to work with an interleaved IQ sample format ([I, Q, I, Q]), which is more suitable for vectorized (SSE) and GPU processing.
2026-02-09 09:29:36 +00:00
Nika Ghaderi 70726903f3 Configure CMake for CUDA and SSE simulations
This commit adds the initial infrastructure for building accelerated simulation components.

   - Adds the CUDA_ENABLE option and logic to find the CUDA toolkit.

   - Adds the CHANNEL_SSE option to enable SSE-specific code paths.

   - Sets required properties on the SIMU target to allow linking with CUDA-compiled objects.

   - Creates the initial oai_cuda.h header for the public API.
2026-02-09 09:29:36 +00:00
Jaroslava Fiedlerova 543fab819e Merge remote-tracking branch 'origin/fix-ulsch_power' into integration_2026_w06 (!3876)
Removing the duplicate loop in ULSCH power computation

- Removing the duplicate loop in ULSCH power computation.
- The logs obtained are as follows:

[NR_MAC] UE dc65: 134.11 Generating RA-Msg2 DCI, RA RNTI 0x113, state 1, preamble_index(RAPID) 42, timing_offset = 5 (estimated distance 195.3 [m])
[PHY]    PUSCH not detected in 134.17 (307,302,50)
[PHY]    PUSCH not detected in 134.17 (311,309,50)
[NR_MAC]  135 4: RA RNTI 41c5 CC_id 0 Scheduling retransmission of Msg3 in (135,8)
[NR_MAC]  135 4: RA RNTI a3cc CC_id 0 Scheduling retransmission of Msg3 in (135,8)
[PHY]    PUSCH not detected in 134.18 (310,312,50)
[NR_MAC]  135 5: RA RNTI dc65 CC_id 0 Scheduling retransmission of Msg3 in (135,9)
[PHY]    PUSCH not detected in 135.8 (309,309,50)
[PHY]    PUSCH not detected in 135.8 (313,308,50)
[NR_MAC]  13515: RA RNTI 41c5 CC_id 0 Scheduling retransmission of Msg3 in (135,19)
[NR_MAC]  13515: RA RNTI a3cc CC_id 0 Scheduling retransmission of Msg3 in (135,19)
[PHY]    PUSCH not detected in 135.9 (308,300,50)
[NR_MAC]  136 4: RA RNTI dc65 CC_id 0 Scheduling retransmission of Msg3 in (136,8)
[NR_PHY] [RAPROC] 135.19 Initiating RA procedure with preamble 6, energy 19.1 dB (I0 63, thres 120), delay 4 start symbol 0 freq index 0
[PHY]    PUSCH not detected in 135.19 (310,310,50)
[PHY]    PUSCH not detected in 135.19 (312,310,50)
[NR_MAC] 135.19 UE RA-RNTI 010b TC-RNTI 0888: initiating RA procedure
[NR_MAC] UE 0888: Sync beam index 0
[NR_MAC] UE 0888: Msg3 scheduled at 136.17 (136.10 TDA 2) start 0 RBs 8
[NR_MAC] UE 0888: 136.10 Generating RA-Msg2 DCI, RA RNTI 0x10b, state 1, preamble_index(RAPID) 6, timing_offset = 4 (estimated distance 156.3 [m])

- For the same scenario, develop branch gives exactly the same result. When
  there is no PUSCH, the power measured for ULSCH and noise are practically
  the same. Furthermore, the value in develop branch is also approximately
  310 for the same noise level.
2026-02-05 17:49:06 +01:00
rmagueta 0c2a9384d0 Removing the duplicate loop 2026-02-05 13:33:03 +00:00
Robert Schmidt 12fc8112d9 Merge remote-tracking branch 'origin/imscope-for-7.2' into integration_2026_w06 (!3889)
Enable imscope for split7.2
2026-02-05 13:28:08 +01:00
Laurent THOMAS 74b998a0d8 Rewrite n0_subband_power_avg_dB calculation with better locality 2026-02-04 19:22:00 +01:00
Laurent THOMAS ee00eb346e Reformat dump_nr_I0_stats() 2026-02-04 19:11:10 +01:00
Laurent THOMAS 656b1d52a0 Remove unused global variables 2026-02-04 19:09:38 +01:00
Robert Schmidt b533127553 Ensure noise power is non-zero
Prior to this commit, noise power estimation could be zero because of a
call to clearArray() in gNB_I0_measurements(). This is problematic, as
this can lead to a noise power of 0 if all symbols in a RB are used,
which in turn leads to a spike in SNR.

To avoid this, use an intermediate array to store noise power, and only
update n0_subband_power if not all RBs are used (i.e., we can detect
noise power). Further, use an exponential moving average to smoothen
noise estimation.

Fixes: fb4235fd50 ("changes in PUCCH0 SNR measurement, testing for
    PUCCH power control")
2026-02-04 18:36:08 +01:00
Bartosz Podrygajlo 315fe92253 Enable imscope for split7.2 2026-02-03 10:04:42 +01:00
Robert Schmidt a0a68d56d5 Merge remote-tracking branch 'origin/remove-dead-code' into integration_2026_w05 (!3831)
semi-manual remove of not used #define commands

As i was upset to see all these #define with no code under, i made a
global pass to remove the obvious cases semi-manual remove of not used
bodies

manual script, then a lot of manual review

    grep -IRs "#define" ../openair* ../common/* ../executables/ ../nfapi/ ../radio/ | \
        fgrep -v '(' | fgrep -v '//' |awk '{print $2}' | egrep -v "#define *$n"| \
            while read n ; do
              grep -IRs $n ../openair* ../common/* ../executables/ ../nfapi/ ../radio/  | grep -v "#define *$n" | grep -q $n || echo $n;
            done

will give a decent list of #define never used.  Then, I think we should
keep lists of # define when it comes from standards, even if the code
doesn't use it right now
2026-01-29 08:23:41 +01:00
Jaroslava Fiedlerova e1a327ca4f Merge remote-tracking branch 'origin/nr_ue_multiple_rf' into integration_2026_w05 (!3593)
NR UE: add support for multiple RF frontends

This MR adds basic support for multiple RF-frontends at the UE.
There are multiple reasons why we might want this:
1. There might be different antennas needed for different bands (e.g. NTN or
   TN antennas). These antennas might be connected to different RF-frontends.
   In case of Handover, the UE needs to dynamically switch between these
   RF-frontends.
2. Each rf-simulator connection carries baseband I/Q samples. To be able to
   perform a handover between two cells at different frequencies, there must
   be two rf-simulator connections, as the baseband channels should not
   interfere and thus cannot simply be added.
3. When we want to support multiple UE simulation within one instance of
   nr-uesoftmodem, and allow multiple cells and probably even handover between
   these cells, we need either:
   1. dedicated RF-frontends for each simulated UE, or
   2. dedicated RF-frontends for each connected cell and dynamically assign
      simulated UEs accordingly.

This MR implements what is needed for 1., 2. and 3.1.
2026-01-28 20:19:48 +01:00
Jaroslava Fiedlerova c2d3a3d0c2 Merge remote-tracking branch 'origin/oru-rebased' into integration_2026_w05 (!3848)
Initial implementation of O-RU for 7.2 emulator

Added new executable nr-oru which acts as a 7.2 O-RU.
2026-01-27 20:30:12 +01:00
Robert Schmidt f9e7e5199d Remove remaining unused RAL code 2026-01-27 13:28:35 +01:00