From e68cfaf70e8f4c73d37a5ed313cab4f0c35956bb Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 18 Aug 2020 07:45:07 +0200 Subject: [PATCH 1/3] added AVX2 optimization for 64QAM LLR computation in NR ULSCH --- .../NR_TRANSPORT/nr_ulsch_llr_computation.c | 101 +++++++++++++++++- 1 file changed, 98 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c index 43e7c6f2ce..bf96a76106 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c @@ -239,10 +239,22 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, uint8_t symbol) { +#ifdef __AVX2__ + int off = ((nb_rb&1) == 1)? 4:0; +#else + int off = 0; +#endif + #if defined(__x86_64__) || defined(__i386__) +#ifdef __AVX2__ + __m256i *rxF = (__m256i*)rxdataF_comp; + __m256i *ch_mag,*ch_magb; + register __m256i xmm0,xmm1,xmm2; +#else __m128i *rxF = (__m128i*)rxdataF_comp; __m128i *ch_mag,*ch_magb; register __m128i xmm0,xmm1,xmm2; +#endif #elif defined(__arm__) int16x8_t *rxF = (int16x8_t*)&rxdataF_comp; int16x8_t *ch_mag,*ch_magb; // [hna] This should be uncommented once channel estimation is implemented @@ -250,28 +262,44 @@ void nr_ulsch_64qam_llr(int32_t *rxdataF_comp, #endif int i; - unsigned char len_mod4; #if defined(__x86_64__) || defined(__i386__) +#ifdef __AVX2__ + ch_mag = (__m256i*)&ul_ch_mag[0][(symbol*(off+(nb_rb*12)))]; + ch_magb = (__m256i*)&ul_ch_magb[0][(symbol*(off+(nb_rb*12)))]; +#else ch_mag = (__m128i*)&ul_ch_mag[0][(symbol*nb_rb*12)]; ch_magb = (__m128i*)&ul_ch_magb[0][(symbol*nb_rb*12)]; +#endif #elif defined(__arm__) ch_mag = (int16x8_t*)&ul_ch_mag[0][(symbol*nb_rb*12)]; ch_magb = (int16x8_t*)&ul_ch_magb[0][(symbol*nb_rb*12)]; #endif - len_mod4 = nb_re&3; +#ifdef __AVX2__ + int len_mod8 = nb_re&7; + nb_re = nb_re>>3; // length in quad words (4 REs) + nb_re += ((len_mod8 == 0) ? 0 : 1); +#else + int len_mod4 = nb_re&3; nb_re = nb_re>>2; // length in quad words (4 REs) nb_re += ((len_mod4 == 0) ? 0 : 1); - +#endif for (i=0; i Date: Tue, 18 Aug 2020 08:38:15 +0200 Subject: [PATCH 2/3] fixed channel model initialization in rfsimulator for added parameter (to be added to bridge structure still) --- targets/ARCH/rfsimulator/simulator.c | 1 + 1 file changed, 1 insertion(+) diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index b7b435f2d9..80b5cd5bac 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -161,6 +161,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) { bridge->channelmod, bridge->sample_rate, bridge->tx_bw, + 30e-9, // TDL delay-spread parameter 0.0, // forgetting_factor 0, // maybe used for TA 0); // path_loss in dB From 21b25fcefbf0bbcd996671150f6bf787fe8033dd Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 18 Aug 2020 15:14:32 +0200 Subject: [PATCH 3/3] Remove some heavy PRACH logs --- openair1/PHY/NR_TRANSPORT/nr_prach.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c index c92da6dd7f..2640a86240 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_prach.c +++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c @@ -707,7 +707,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, Xu=(int16_t*)gNB->X_u[preamble_offset-first_nonzero_root_idx]; - LOG_I(PHY,"PRACH RX new dft preamble_offset-first_nonzero_root_idx %d\n",preamble_offset-first_nonzero_root_idx); + LOG_D(PHY,"PRACH RX new dft preamble_offset-first_nonzero_root_idx %d\n",preamble_offset-first_nonzero_root_idx); memset(prach_ifft,0,((N_ZC==839) ? 2048 : 256)*sizeof(int32_t)); @@ -790,7 +790,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, else *TA = *TA/2; - //if (LOG_DUMPFLAG(PRACH)) { + if (LOG_DUMPFLAG(PRACH)) { //int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840)); // if (en>60) { int k = (12*n_ra_prb) - 6*fp->N_RB_UL; @@ -807,7 +807,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB, LOG_M("Xu.m","xu",Xu,N_ZC,1,1); LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1); // } - //} /* LOG_DUMPFLAG(PRACH) */ + } /* LOG_DUMPFLAG(PRACH) */ stop_meas(&gNB->rx_prach); }