From 741e9ffae9c7bf144b5d02328678633601d2d3cd Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Mon, 1 Sep 2025 13:57:52 +0200 Subject: [PATCH 1/3] Simplify cross-compilation Dockerfile Redirect to files and manual analysis as done in this Dockerfile is not necessary since we just output all relevant build files to stdout. Simplify to do the same here. See: 35361db76b91 ("build_oai: don't redirect compilations to a file") --- docker/Dockerfile.build.ubuntu.cross-arm64 | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/docker/Dockerfile.build.ubuntu.cross-arm64 b/docker/Dockerfile.build.ubuntu.cross-arm64 index a7978bb6fa..b7bc7d6dbb 100644 --- a/docker/Dockerfile.build.ubuntu.cross-arm64 +++ b/docker/Dockerfile.build.ubuntu.cross-arm64 @@ -37,20 +37,11 @@ RUN /bin/sh oaienv && \ mkdir -p log ran_build/build ran_build/build-cross && \ cd ran_build/build && \ cmake ../../.. -GNinja && \ - echo "====== Start of log for host-tools ======" && \ - ninja ldpc_generators generate_T > ../../log/host-tools.txt 2>&1 && \ - echo "====== End of log for host-tools ======" && \ + ninja ldpc_generators generate_T && \ cd ../build-cross/ && \ # install missing libyaml-cpp-dev for arm64 apt install -y libyaml-cpp-dev:arm64 && \ cmake ../../.. -GNinja -DENABLE_TELNETSRV=ON \ -DCMAKE_TOOLCHAIN_FILE=../../../cmake_targets/cross-arm.cmake -DNATIVE_DIR=../build \ -DCMAKE_C_FLAGS="-Werror" -DCMAKE_CXX_FLAGS="-Werror" && \ - echo "====== Start of log for cross-build executables ======" && \ - # making always passing so we can analyze the all.txt file - ninja -k10 dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator telnetsrv > ../../log/all.txt 2>&1; \ - # displaying errors and warnings - grep -E -A3 "warning:|error:" ../../log/all.txt || true && \ - # will fail only if string "errors:" is found - grep -E "error:" -vqz ../../log/all.txt && \ - echo "====== End of log for cross-build executables ======" + ninja -k10 dlsim ulsim ldpctest polartest smallblocktest nr_pbchsim nr_dlschsim nr_ulschsim nr_dlsim nr_ulsim nr_pucchsim nr_prachsim lte-softmodem nr-softmodem nr-cuup oairu lte-uesoftmodem nr-uesoftmodem params_libconfig coding rfsimulator telnetsrv From 53813f522cb6e1c0cbf629412e9f7d308c38f650 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Mon, 1 Sep 2025 16:02:31 +0200 Subject: [PATCH 2/3] Change target architecture in arm container build to armv8.2-a This enables some additional instructions needed in the follow-up commit. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a71b1c3ea2..fa2d497589 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,7 +170,7 @@ endif() if (NOT CROSS_COMPILE) set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=native") else () - set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8-a") + set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=armv8.2-a") endif() # add autotools definitions that were maybe used! From 5e3e8a70ff0d21460b381b2b90bd6449b8776e7d Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Wed, 27 Aug 2025 20:06:47 +0000 Subject: [PATCH 3/3] addition of aarch64 native implementation for rotate_cpx_vector for the case output_shift=15 --- openair1/PHY/TOOLS/tools_defs.h | 46 ++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 15c646c20e..9ee558c72b 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -828,6 +828,47 @@ static inline void rotate_cpx_vector(const c16_t *const x, const c16_t *const al // log2_amp - increase the output amplitude by a factor 2^log2_amp (default is 0) // WARNING: log2_amp>0 can cause overflow!! + +#ifdef __aarch64__ + if (output_shift == 15) { // allows specific NEON instruction + + int16x8_t ar = (int16x8_t)vdupq_n_s16(alpha->r); + int16x8_t ai = (int16x8_t)vdupq_n_s16(alpha->i); + int16x8_t *y_128 = (int16x8_t *)y; + int16x8_t *x_128 = (int16x8_t *)x; + for (uint32_t i = 0; i < (N >> 2); i++) { + // Split interleaved -> separate real/imag + int16x8_t br = vuzp1q_s16(x_128[i], x_128[i]); + int16x8_t bi = vuzp2q_s16(x_128[i], x_128[i]); + + // Start with the two “diagonal” products using high-half, doubling, sat: + // x = round( (2*ar*br) / 2^16 ), y = round( (2*ar*bi) / 2^16 ) + int16x8_t real = vqdmulhq_s16(ar, br); + int16x8_t imag = vqdmulhq_s16(ar, bi); + + // real -= round( (2*ai*bi) / 2^16 ) + real = vqrdmlshq_s16(real, ai, bi); + + // imag += round( (2*ai*br) / 2^16 ) + imag = vqrdmlahq_s16(imag, ai, br); + + // Re-interleave [real, imag] + int16x8x2_t z = vzipq_s16(real, imag); + + y_128[i] = z.val[0]; + /* + printf("y : (%d %d) (%d %d) (%d %d) (%d %d)\n", + vgetq_lane_s16(y_128[i],0), + vgetq_lane_s16(y_128[i],1), + vgetq_lane_s16(y_128[i],2), + vgetq_lane_s16(y_128[i],3), + vgetq_lane_s16(y_128[i],4), + vgetq_lane_s16(y_128[i],5), + vgetq_lane_s16(y_128[i],6), + vgetq_lane_s16(y_128[i],7));*/ + } + } else { +#endif uint32_t i; // loop counter simd_q15_t *y_128, alpha_128; @@ -859,7 +900,10 @@ static inline void rotate_cpx_vector(const c16_t *const x, const c16_t *const al shift)); // print_ints("y_128[0]=", &y_128[0]); } -#if defined(__x86__) || defined(__x86_64__) +#ifdef __aarch64__ + } +#endif //__aarch64__ +#if defined(__x86_64__) || defined(__i386__) } #endif }