Agora
1.2.0
Agora project
|
Agora is a complete software realization of real-time massive MIMO baseband processing.
Some highlights:
Agora currently only builds and runs on Linux, and has been tested on Ubuntu 16.04, 18.04, and 20.04. Agora requires CMake 2.8+ and works with both GNU and Intel compilers with C++17 support.
$ ./config_ci.sh
_
in your branch name. Use -
instead. scripts/ubuntu.sh
for required packages, including Linux packages, gtest, Armadillo, and SoapySDR, and the corresponding versions. Run ./scripts/ubuntu.sh
to install these packages.setvars.sh
. If oneAPI is installed in /opt
, run source /opt/intel/oneapi/setvars.sh
. /opt
.$ sudo chmod -R a+rwX FlexRAN-FEC-SDK-19-04/ # Allow all users read-write access $ cd /opt/FlexRAN-FEC-SDK-19-04/sdk/ $ sed -i '/add_compile_options("-Wall")/a \ \ add_compile_options("-ffreestanding")' cmake/intel-compile-options.cmake $ ./create-makefiles-linux.sh $ cd build-avx512-icc # or build-avx2-icc $ make -j
Optional: DPDK
We provide a high performance [packet generator](simulator) to emulate the RRU. This generator allows Agora to run and be tested without actual RRU hardware.\ The following are steps to set up both Agora and the packet generator:
$ cd Agora $ mkdir build $ cd build $ cmake .. $ make -j
$ ./test/test_agora/test_agora.sh 10 out # Runs test for 10 iterations
#
When running Agora and the emulated RRU on two different machines, the following steps use Linux networking stack for packet I/O.\ Agora also supports using DPDK to bypass the kernel for packet I/O. See DPDK_README.md for instructions of running emulated RRU and Agora with DPDK.
cd ..
), then run $ ./build/data_generator --conf_file files/config/ci/tddconfig-sim-ul.jsonto generate data files.
$ ./build/agora --conf_file files/config/ci/tddconfig-sim-ul.jsonto start Agora with uplink configuration.
$ ./build/sender --num_threads=2 --core_offset=1 --frame_duration=5000 --enable_slow_start=1 --conf_file=files/config/ci/tddconfig-sim-ul.jsonto start the emulated RRU with uplink configuration.
cd ..
), then run $ ./build/data_generator --conf_file files/config/ci/chsim.jsonto generate data files.
$ ./build/user --conf_file files/config/ci/chsim.jsonto start clients with combined uplink & downlink configuration.
$ ./build/chsim --bs_threads 1 --ue_threads 1 --worker_threads 2 --core_offset 24 --conf_file files/config/ci/chsim.json
$ ./build/agora --conf_file files/config/ci/chsim.jsonto start Agora with the combined configuration.
$ cmake .. -DENABLE_MAC=true
--conf_file mac-ul-sim.json
)--conf_file mac-dl-sim.json
)--conf_file mac-sim.json
)$./build/data_generator --conf_file files/config/examples/mac-sim.jsonto generate data files.
$./build/user --conf_file files/config/examples/mac-sim.jsonto start users.
$ ./build/chsim --bs_threads 1 --ue_threads 1 --worker_threads 2 --core_offset 28 --conf_file files/config/examples/mac-sim.jsonto run the channel simulator
$ ./build/macuser --enable_slow_start 1 --conf_file files/config/examples/mac-sim.jsonto run to user mac app. Specify
--data_file ""
to generate patterned data and --conf_file
options as necessary.$ ./build/agora --conf_file files/config/examples/mac-sim.jsonrun agora before running macbs. Run macuser -> agora -> macbs in quick succession.
$ ./build/macbs --enable_slow_start 1 --conf_file files/config/examples/mac-sim.jsonto run to base station mac app. specify
--data_file ""
to generate patterned data and --conf_file
options as necessary.Agora supports a 64-antenna Faros base station as RRU and Iris UE devices. Both are commercially available from Skylark Wireless and are used in the POWER-RENEW PAWR testbed.\ Both Faros and Iris have their roots in the Argos massive MIMO base station, especially ArgosV3. Agora also supports USRP-based RRU and UEs.
We recommend using one server for controlling the RRU and running Agora, and another server for controlling the UEs and running the UE code.
Agora supports both uplink and downlink with real RRU and UEs. For downlink, a reference node outside the array (and synchronized) is required for reciprocity calibration.\ Note: Faros RRU and Iris UEs can be discovered using the pyfaros tool. You can use this tool to find the topology of the hardware connected to the server.
We describe how to get the uplink and downlink demos working. Below XX can be replaced with either ul
and dl
.
-DRADIO_TYPE=SOAPY_IRIS
to cmake-DRADIO_TYPE=SOAPY_UHD
to cmakemake -j
to recompile the code.files/topology
directory as follows: $ python3 -m pyfaros.discover --json-outThis will output a file named
topology.json
with all the discoverable serial IDs included.files/topology/topology.json
by adding/removing serials of client Irises you'd like to include from your setup.files/topology/topology.json
and enter the appropriate IDs../build/data_generator --conf_file files/config/XX-hw.json
to generate required data files../build/user --conf_file files/config/XX-hw.json
.files/experiment/LDPC_orig_XX_data_512_ant2.bin
from the client machine to the server's files/experiment
directory.make -j
to compile the code.files/topology/topology.json
files/topology/topology.json
by adding/removing serials of your RRU Irises, and the hub../build/agora --conf_file files/config/XX-hw.json
.To test the real-time performance of Agora for processing 64x16 MU-MIMO with 20 MHz bandwidth and 64QAM modulation, we recommend using two servers (one for Agora and another for the emulated RRU) and DPDK\ for networking. In our experiments, we use 2 servers each with 4 Intel Xeon Gold 6130 CPUs. The servers are connected by 40 GbE Intel XL710 dual-port NICs.
We change "worker_thread_num" and "socket_thread_num" to change the number cores assigned to of worker threads and network threads in the json files, e.g., files/config/ci/tddconfig-sim-ul.json.\ If you do not have a powerful server or high throughput NICs, we recommend increasing the value of --frame_duration
when you run ./build/sender
, which will increase frame duration and reduce throughput.
To process 64x16 MU-MIMO in real-time, we use both ports of 40 GbE Intel XL710 NIC with DPDK (see DPDK_README.md) to get enough throughput for the traffic of 64 antennas. \ (NOTE: For 100 GbE NIC, we just need to use one port to get enough thoughput.)
To reduce performance variations, we did the following configurations for the server that runs Agora:
$ echo "0" | sudo tee /sys/devices/system/cpu/cpufreq/boost
$ sudo cpupower frequency-set -g performancewhere cpupower can be installed through
$ sudo apt-get install -y linux-tools-$(uname -r)
The steps to collect and analyze timestamp traces are as follows:
$ ./build/data_generator --conf_file files/config/ci/tddconfig-sim-ul.json
Run Agora as a real-time process (to prevent OS from doing context switches) using
$ sudo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} chrt -rr 99 ./build/agora --conf_file files/config/ci/tddconfig-sim-ul.json
(NOTE: Using a process priority 99 is dangerous. Before running it, make sure you have directed OS interrupts away from cores used by Agora. If you have not done so, run
$ sudo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./build/agora --conf_file files/config/ci/tddconfig-sim-ul.json
instead to run Agora as a normal process.)
$ sudo LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./build/sender --num_threads=2 --core_offset=0 \ --conf_file=files/config/ci/tddconfig-sim-ul.json --frame_duration=5000 --enable_slow_start=1For DPDK, add
--server_mac_addr=
and set it to the MAC address of the NIC used by Agora.Log and plot PHY stats:
$ cmake .. -DENABLE_CSV_LOG=True
$ python3 tools/python/plot_csv.py [max_frames] [X_label] [Y_label] [legend_name] < path/to/log/log-xyz.csv With optional paramters, e.g., $ python3 tools/python/plot_csv.py 1000 Frame EVM UE < files/log/2022-10-25-15-46-55/log-evm-BS.csv or set max_frames to 0 to plot all frames, e.g., $ python3 tools/python/plot_csv.py 0 Frame EVM UE < files/log/2022-10-25-15-46-55/log-evm-BS.csv or without any paramter to plot as default, e.g., $ python3 tools/python/plot_csv.py < files/log/2022-10-25-15-46-55/log-evm-BS.csv Note the < operator is required.
"log_listener_addr": "127.0.0.1", "log_listener_port": 33300Before start, run the command on the listener machine (which has the specified IP address):
$ nc -u -l [port_number] | python3 tools/python/plot_csv.py [max_frames] [X_label] [Y_label] [legend_name] port_number (required) is log_listener_port + log_id (defined in csv_logger.h); max_frames (required) is a positive integer no greater than the maximum transfered frames. For example, $ nc -u -l 33303 | python3 tools/python/plot_csv.py 1000 Frame EVM UE Repeat with multiple ports for more logs if desired.Run test; plots will be shown when max_frames is reached.
Agora is open-source and open to your contributions. Before contributing, please read this.
Agora was funded in part by NSF Grant #1518916 and by the NSF PAWR project.
Check out Agora Wiki for Agora's design overview and flow diagram that maps massive MIMO baseband processing to the actual code structure. Technical details and performance results can be found in
Doxygen documentation generation for Agora can be initiated by running the following command from the repository root directory: doxygen Agora_doxygen.conf
The latest hosted output is located at Agora Doxygen
Other community resources can be found at the RENEW Wireless Wiki
Jian Ding (jian.) ding @yale .edu