gpu3gppchan Python Bindings
Python interface to the GPU-accelerated gpu3gppchan C++/CUDA library through
nanobind. The package provides 3GPP TR 38.901 system-level statistical channel models,
TDL/CDL fading channels, OFDM modulation and demodulation, and GPU noise helpers.
Installation
python -m pip install gpu3gppchan
Pip selects the wheel matching your operating system, CPU architecture, and
Python interpreter. Ordinary CPython 3.12–3.14 uses the cp312-abi3 wheel;
free-threaded CPython 3.14 uses the separate cp314-cp314t wheel.
Verify the installation:
import gpu3gppchan as chan
print(chan.__version__)
config = chan.SimConfig(center_freq_hz=3.5e9, bandwidth_hz=100e6, run_mode=0)
print(config.center_freq_hz)
Prerequisites
| Component | Requirement |
|---|---|
| Python | CPython 3.12–3.14, or free-threaded CPython 3.14 |
| GPU | NVIDIA Ampere (SM 8.0) or newer |
| Driver | NVIDIA driver supporting CUDA 13 |
| Linux | glibc 2.34 or newer; x86_64 or aarch64 |
| Windows | x86_64; Microsoft Visual C++ Redistributable |
CUDA runtime dependencies are installed through pip. A separate CUDA Toolkit installation is not required to use the wheels. HDF5 and yaml-cpp are bundled; no separate system installation of those libraries is required.
API Overview
System-Level Statistical Channels (SLS)
System-level models include UMa, UMi, and RMa scenarios, with topology,
path loss, shadow fading, LOS/NLOS, small-scale fading, and user mobility.
StatisticalChannel provides the high-level interface; StatisChanModel
exposes the native engine and diagnostic exports.
SLS configuration can be supplied through YAML: Python reads it with PyYAML and passes the values into the bound configuration objects. Native C++ example applications also parse YAML with yaml-cpp. The repository includes complete SLS configurations and Python configuration-loading examples.
The following minimal example reads YAML settings, runs an SLS model with a generated topology, and dumps its results to HDF5 for debugging:
import yaml
import gpu3gppchan as chan
from gpu3gppchan.cuda_utils import CudaStream
# For a file, use yaml.safe_load() on an open text file instead.
settings = yaml.safe_load("""
simulation:
center_freq_hz: 3500000000.0
bandwidth_hz: 100000000.0
system_level:
scenario: UMa
n_site: 1
n_sector_per_site: 1
n_ut: 1
""")
sim = chan.SimConfig(**settings["simulation"], run_mode=0)
sim.internal_memory_mode = 1 # Retain channel data for inspection.
topology = dict(settings["system_level"])
topology["scenario"] = getattr(chan.Scenario, topology["scenario"])
system = chan.SystemLevelConfig(**topology)
stream = CudaStream()
model = chan.StatisChanModel(sim, system, 0, stream)
model.run(ref_time=0.0)
model.save_sls_chan_to_h5_file("_debug")
# Writes slsChanData_1sites_1uts_debug_seed0.h5 in the current directory.
The native HDF5 export is available through the Python binding. Use it to
inspect channel results and diagnose simulations; h5py can read the generated
files. dump_topology_to_yaml(filename) also exports the model topology.
Link-Level Fading Channels (TDL/CDL)
FadingChannel provides link-level TDL/CDL fading with OFDM and noise processing
and manages GPU buffers through a CuPy array interface. TdlChannelConfig and
CdlChannelConfig configure delay profiles, antenna counts, Doppler, and other
link parameters. TdlChan and CdlChan expose the lower-level native engines.
TDL Example
The following example runs a single-cell, single-user channel on the GPU:
import cupy as cp
from gpu3gppchan import FadingChannel, TdlChannelConfig
config = TdlChannelConfig(
delay_profile="A",
delay_spread=30.0,
n_bs_ant=1,
n_ue_ant=1,
)
channel = FadingChannel(channel_config=config)
# Shape: (cells, users, transmit antennas, OFDM symbols, subcarriers).
tx = cp.ones((1, 1, 1, 14, 3276), dtype=cp.complex64)
rx = channel.run(freq_in=tx, tti_idx=0, snr_db=20.0)
print(rx.shape) # (1, 1, 1, 14, 3276)
print(bool(cp.all(cp.isfinite(rx)))) # True
Other Signal Processing Helpers and Native Configuration
The lower-level API exposes the native engines and configuration objects for applications that manage their own GPU buffers and streams.
| Classes | Purpose |
|---|---|
SimConfig, SystemLevelConfig, LinkLevelConfig, ExternalConfig |
Simulation, topology, fading, and external geometry settings. |
TdlConfig / TdlChan, CdlConfig / CdlChan |
Native link-level channel configuration and engines. |
StatisChanModel |
Native system-level statistical channel engine. |
CarrierParams, OfdmModulate, OfdmDeModulate |
OFDM carrier configuration, modulation, and demodulation. |
GauNoiseAdder |
GPU additive Gaussian noise. |
CellParam, UtParamCfg, AntPanelConfig, Coordinate |
Cell, user, antenna, and position configuration. |
Scenario, UeType, SensingTargetType |
Scenario, user, and sensing-target enums. |
LinkParams, ClusterParams, UtMobilitySnapshot |
System-level link, cluster, and mobility snapshots. |
Configuration objects can be constructed without CuPy arrays. Channel execution requires a compatible GPU; low-level callers must synchronize their CUDA work and manage the lifetime of caller-owned buffers.
Dependencies
Pip installs the following runtime dependencies automatically:
numpy,h5py, andpyyamlcuda-bindingsnvidia-cuda-runtime>=13.0.88andnvidia-curand>=10.4.0cupy-cuda13x(on Windows,cupy-cuda13x[ctk]>=14.2.0)
Native HDF5 handles C++ exports, while h5py supports Python-side HDF5 workflows.
The package retains both native and Python YAML support. No .h5 or .hdf5
data files are included in the wheel.
Threading
Free-threaded Python getters for OFDM and fading output return owned GPU
snapshots. Ordinary Python uses zero-copy views that may change on a later
run(). Synchronize external CUDA work before passing buffers into a model,
and do not modify them while the model uses them.
Testing and Source Builds
To install the optional test dependencies:
python -m pip install "gpu3gppchan[test]"
From a source checkout, run the installed-wheel smoke tests:
python -m pytest testBenches/gpu3GPPChan/python/tests/test_wheel_smoke.py -v
Import and configuration tests run without a GPU; GPU channel tests skip when no usable CUDA device is available. A successful import alone does not validate GPU execution.
The source is part of
NVIDIA Aerial CUDA-Accelerated RAN.
In a checkout, see testBenches/gpu3GPPChan/python/NOTES.md for native packaging,
CMake presets, detailed tests, and threading semantics, and
testBenches/gpu3GPPChan/tooling/README.md for Linux and Windows build workflows.
License
Aerial source is licensed under Apache-2.0. Bundled components retain their own
license terms; the wheel includes notices under .dist-info/licenses/.
Distribution metadata uses LicenseRef-gpu3gppchan-distribution for the combined
terms described in the included THIRD_PARTY_NOTICES.txt.
Metadata
Release files for gpu3gppchan 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| gpu3gppchan-0.1.6-cp314-cp314t-win_amd64.whl | CPython 3.14 | CPython 3.14 free-threading | Windows x86-64 | Details |
| gpu3gppchan-0.1.6-cp314-cp314t-manylinux_2_34_x86_64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux glibc 2.34+ x86-64 | Details |
| gpu3gppchan-0.1.6-cp314-cp314t-manylinux_2_34_aarch64.whl | CPython 3.14 | CPython 3.14 free-threading | Linux glibc 2.34+ ARM64 | Details |
| gpu3gppchan-0.1.6-cp312-abi3-win_amd64.whl | CPython 3.12 | abi3 | Windows x86-64 | Details |
| gpu3gppchan-0.1.6-cp312-abi3-manylinux_2_34_x86_64.whl | CPython 3.12 | abi3 | Linux glibc 2.34+ x86-64 | Details |
| gpu3gppchan-0.1.6-cp312-abi3-manylinux_2_34_aarch64.whl | CPython 3.12 | abi3 | Linux glibc 2.34+ ARM64 | Details |
Total release size: 491.2 MB
Release files / gpu3gppchan-0.1.6-cp314-cp314t-win_amd64.whl
| Download URL | gpu3gppchan-0.1.6-cp314-cp314t-win_amd64.whl |
|---|---|
| Size | 81.0 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Windows x86-64 |
|
SHA-256 checksum How to use checksums |
1fe10eb77ef6b739d9fd18b759bb31f61326a1993c96447cdfef906b436caf20
|
|
BLAKE2b-256 checksum How to use checksums |
a366d61f08f2909a6fe781ac6a0e687c46cd7388ca5bf5788786ebed68a95e15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / gpu3gppchan-0.1.6-cp314-cp314t-manylinux_2_34_x86_64.whl
| Download URL | gpu3gppchan-0.1.6-cp314-cp314t-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 82.4 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.34+ x86-64 |
|
SHA-256 checksum How to use checksums |
0a582c5b391290381410cf055b587883210e0b62894e68bb22dc1341bb708698
|
|
BLAKE2b-256 checksum How to use checksums |
ff37e09ef1cae8dd0e2160c79595881c91449f80344821beccb901027cc104d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / gpu3gppchan-0.1.6-cp314-cp314t-manylinux_2_34_aarch64.whl
| Download URL | gpu3gppchan-0.1.6-cp314-cp314t-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 82.3 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.34+ ARM64 |
|
SHA-256 checksum How to use checksums |
bed2bc0b65b3a8b7c845f89eff96d0b5a375b550b357ca22c8428f78456f4192
|
|
BLAKE2b-256 checksum How to use checksums |
b61280f023add0f4c425f5f390095ce0879f7c5e5972cf13014f5c5442ae2fff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / gpu3gppchan-0.1.6-cp312-abi3-win_amd64.whl
| Download URL | gpu3gppchan-0.1.6-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 80.8 MB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
19d09f4dce3d9dd739194356015be634c5e3953fa01962ce0e3b9ea42197a632
|
|
BLAKE2b-256 checksum How to use checksums |
cbb34e14b281932fad3120af32d005fe7e9d07ea272d1547803f6772e68d58c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / gpu3gppchan-0.1.6-cp312-abi3-manylinux_2_34_x86_64.whl
| Download URL | gpu3gppchan-0.1.6-cp312-abi3-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 82.4 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
96bbc609078c06d522f3d5b0d9c042d464db6ee9caa3ce52cd7e27336087d2d5
|
|
BLAKE2b-256 checksum How to use checksums |
6d157840fbf8d844482e67f74d41a01f2195b9e39a50f0d3a9b52e83731ffbc9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / gpu3gppchan-0.1.6-cp312-abi3-manylinux_2_34_aarch64.whl
| Download URL | gpu3gppchan-0.1.6-cp312-abi3-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 82.3 MB |
| Tags | CPython 3.12 Linux glibc 2.34+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
44437b42828f1876cb92f01351d28680fcdc932b9afe8ce6cf66b1b2caed80b5
|
|
BLAKE2b-256 checksum How to use checksums |
c141839a377936e49de9b24091c6497badd09e66f2e32168c56a34cf31868dc4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|