From a12050203b9c397b29e6b8a52aad056762514161 Mon Sep 17 00:00:00 2001 From: abgaber Date: Tue, 21 Apr 2026 16:47:10 +0200 Subject: [PATCH] Memory optimization for Data Recording and Move tracers log messages to separate function --- .../PHY/NR_TRANSPORT/nr_ulsch_demodulation.c | 234 +++--------------- 1 file changed, 39 insertions(+), 195 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c index 684e65699e..16e550db3b 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c @@ -15,8 +15,8 @@ #include #include "PHY/sse_intrin.h" #include "T.h" +#include "T_messages_creator.h" #include -#include "PHY/log_tools.h" #if T_TRACER @@ -899,13 +899,16 @@ static void inner_rx(PHY_VARS_gNB *gNB, rel15_ul, frame_parms); #if T_TRACER - int nb_re_pusch = NR_NB_SC_PER_RB * rel15_ul->rb_size; - // Assume assume Tx and Rx = 1 - if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ)) { - copy_c16_data_to_slot_memory(rxFext[aarx], rxFext_slot, nb_re_pusch, symbol); - } - if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL)) { - copy_c16_data_to_slot_memory(chFext[aatx][aarx], chFext_slot, nb_re_pusch, symbol); + // Data Recording application supports only 1 layer and 1 Tx antenna, so only record the first layer and first Tx antenna + if (aatx == 0 && aarx == 0) { + int nb_re_pusch = NR_NB_SC_PER_RB * rel15_ul->rb_size; + // Assume assume Tx and Rx = 1 + if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ)) { + copy_c16_data_to_slot_memory(rxFext[aarx], rxFext_slot, nb_re_pusch, symbol); + } + if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL)) { + copy_c16_data_to_slot_memory(chFext[aatx][aarx], chFext_slot, nb_re_pusch, symbol); + } } #endif } @@ -1111,34 +1114,35 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, // Memories to store data for data recording int buffer_length_slot = rel15_ul->rb_size * NR_NB_SC_PER_RB * 14; // 14 OFDM Symbols per slot - int nb_rx_ant = frame_parms->nb_antennas_rx; - int nb_layer = rel15_ul->nrOfLayers; + // data recording application supports only a single layer. + // nb_rx_ant (= frame_parms->nb_antennas_rx) is limited to 1 for data recording application. + // int nb_layer (= rel15_ul->nrOfLayers) is limited to 1 for data recording application. // Initialize memory for DMRS signals - c16_t pusch_dmrs_slot_mem[nb_layer * buffer_length_slot] __attribute__((aligned(32))); + c16_t pusch_dmrs_slot_mem[1 * buffer_length_slot] __attribute__((aligned(32))); // Initialize memory for channel estimates based on DMRS positions - c16_t pusch_ch_est_dmrs_pos_slot_mem[buffer_length_slot * nb_layer * nb_rx_ant] __attribute__((aligned(32))); + c16_t pusch_ch_est_dmrs_pos_slot_mem[buffer_length_slot * 1 * 1] __attribute__((aligned(32))); // memory to store slot grid with channel coefficients based on DMRS positions after interpolation - c16_t pusch_ch_est_dmrs_interpl_slot_mem[buffer_length_slot * nb_layer * nb_rx_ant] __attribute__((aligned(32))); + c16_t pusch_ch_est_dmrs_interpl_slot_mem[buffer_length_slot * 1 * 1] __attribute__((aligned(32))); // memory to store extracted data including PUSCH + DMRS - c16_t rxFext_slot_mem[nb_rx_ant * buffer_length_slot] __attribute__((aligned(32))); + c16_t rxFext_slot_mem[1 * buffer_length_slot] __attribute__((aligned(32))); #if T_TRACER // Initialize memory for DMRS signals if (T_ACTIVE(T_GNB_PHY_UL_FD_DMRS)) - memset(pusch_dmrs_slot_mem, 0, sizeof(c16_t) * nb_layer * buffer_length_slot); + memset(pusch_dmrs_slot_mem, 0, sizeof(c16_t) * 1 * buffer_length_slot); // Initialize memory for channel estimates based on DMRS positions if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS)) - memset(pusch_ch_est_dmrs_pos_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * nb_layer * nb_rx_ant); + memset(pusch_ch_est_dmrs_pos_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * 1 * 1); // memory to store slot grid with channel coefficients based on DMRS positions after interpolation if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL)) - memset(pusch_ch_est_dmrs_interpl_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * nb_layer * nb_rx_ant); + memset(pusch_ch_est_dmrs_interpl_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * 1 * 1); // memory to store extracted data including PUSCH + DMRS if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ)) - memset(rxFext_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * nb_rx_ant); + memset(rxFext_slot_mem, 0, sizeof(c16_t) * buffer_length_slot * 1 * 1); #endif //---------------------------------------------------------- @@ -1401,188 +1405,28 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, } // symbol loop #if T_TRACER - // Get Time Stamp for T-tracer messages - char trace_time_stamp_str[30]; - get_time_stamp_usec(trace_time_stamp_str); - // trace_time_stamp_str = 8 bytes timestamp = YYYYMMDD - // + 9 bytes timestamp = HHMMSSMMM - // Not Ready for MIMO int dmrs_port = get_dmrs_port(0, rel15_ul->dmrs_ports); - if (T_ACTIVE(T_GNB_PHY_UL_FD_DMRS)) { - // Log GNB_PHY_UL_FD_DMRS using T-Tracer if activated - // FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm : - // int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot : - // int,Nid_cell : int,rnti : - // int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols : - // int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers : - // int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port : - // int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data - T(T_GNB_PHY_UL_FD_DMRS, - T_INT((int)frame), - T_INT((int)slot), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)), - T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure - T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2) - T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz) - T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended) - T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot - T_INT((int)frame_parms->Nid_cell), - T_INT((int)rel15_ul->rnti), - T_INT((int)rel15_ul->rb_size), - T_INT((int)rel15_ul->rb_start), - T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol - T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols - T_INT((int)rel15_ul->qam_mod_order), // modulation - T_INT((int)rel15_ul->mcs_index), // mcs - T_INT((int)rel15_ul->mcs_table), // mcs_table_index - T_INT((int)rel15_ul->nrOfLayers), // num_layer - T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1 - T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1 - T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions - T_INT((int)number_dmrs_symbols), - // dmrs_start_ofdm_symbol - // dmrs_duration_num_ofdm_symbols - // dmrs_num_add_positions - T_INT((int)dmrs_port), // dmrs_antenna_port - T_INT((int)rel15_ul->scid), // dmrs_nscid - T_INT((int)frame_parms->nb_antennas_rx), // rx antenna - T_INT(0), // number_of_bits - T_BUFFER((c16_t *)(&(pusch_dmrs_slot_mem[0])), rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * 4)); - } - if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS)) { - // Log GNB_PHY_UL_FD_CHAN_EST_DMRS_POS using T-Tracer if activated - // FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm : - // int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot : - // int,Nid_cell : int,rnti : - // int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols : - // int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers : - // int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port : - // int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data - T(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_POS, - T_INT((int)frame), - T_INT((int)slot), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)), - T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure - T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2) - T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz) - T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended) - T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot - T_INT((int)frame_parms->Nid_cell), - T_INT((int)rel15_ul->rnti), - T_INT((int)rel15_ul->rb_size), - T_INT((int)rel15_ul->rb_start), - T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol - T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols - T_INT((int)rel15_ul->qam_mod_order), // modulation - T_INT((int)rel15_ul->mcs_index), // mcs - T_INT((int)rel15_ul->mcs_table), // mcs_table_index - T_INT((int)rel15_ul->nrOfLayers), // num_layer - T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1 - T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1 - T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions - T_INT((int)number_dmrs_symbols), - // dmrs_start_ofdm_symbol - // dmrs_duration_num_ofdm_symbols - // dmrs_num_add_positions - T_INT((int)dmrs_port), // dmrs_antenna_port - T_INT((int)rel15_ul->scid), // dmrs_nscid - T_INT((int)frame_parms->nb_antennas_rx), // rx antenna - T_INT(0), // number_of_bits - T_BUFFER((c16_t *)(&(pusch_ch_est_dmrs_pos_slot_mem[0])), rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * 4)); - } + log_ul_fd_dmrs(frame, slot, frame_parms, rel15_ul, + number_dmrs_symbols, dmrs_port, + (const c16_t *)(&(pusch_dmrs_slot_mem[0])), + rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * 4); - if (T_ACTIVE(T_GNB_PHY_UL_FD_PUSCH_IQ)) { - // Log GNB_PHY_UL_FD_PUSCH_IQ using T-Tracer if activated - // FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm : - // int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot : - // int,Nid_cell : int,rnti : - // int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols : - // int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers : - // int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port : - // int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data + log_ul_fd_chan_est_dmrs_pos(frame, slot, frame_parms, rel15_ul, + number_dmrs_symbols, dmrs_port, + (const c16_t *)(&(pusch_ch_est_dmrs_pos_slot_mem[0])), + rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * 4); - T(T_GNB_PHY_UL_FD_PUSCH_IQ, - T_INT((int)frame), - T_INT((int)slot), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)), - T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure - T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2) - T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz) - T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended) - T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot - T_INT((int)frame_parms->Nid_cell), - T_INT((int)rel15_ul->rnti), - T_INT((int)rel15_ul->rb_size), - T_INT((int)rel15_ul->rb_start), - T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol - T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols - T_INT((int)rel15_ul->qam_mod_order), // modulation - T_INT((int)rel15_ul->mcs_index), // mcs - T_INT((int)rel15_ul->mcs_table), // mcs_table_index - T_INT((int)rel15_ul->nrOfLayers), // num_layer - T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1 - T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1 - T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions - T_INT((int)number_dmrs_symbols), - // dmrs_start_ofdm_symbol - // dmrs_duration_num_ofdm_symbols - // dmrs_num_add_positions - T_INT((int)dmrs_port), // dmrs_antenna_port - T_INT((int)rel15_ul->scid), // dmrs_nscid - T_INT((int)frame_parms->nb_antennas_rx), // rx antenna - T_INT(0), // number_of_bits - T_BUFFER((c16_t *)(&(rxFext_slot_mem[0])), - rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * frame_parms->nb_antennas_rx * 4)); - } - if (T_ACTIVE(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL)) { - // Log pusch_ch_est_dmrs_interpl_slot_mem using T-Tracer if activated - // FORMAT = int,frame : int,slot : int,datetime_yyyymmdd : int,datetime_hhmmssmmm : - // int,frame_type : int,freq_range : int,subcarrier_spacing : int,cyclic_prefix : int,symbols_per_slot : - // int,Nid_cell : int,rnti : - // int,rb_size : int,rb_start : int,start_symbol_index : int,nr_of_symbols : - // int,qam_mod_order : int,mcs_index : int,mcs_table : int,nrOfLayers : - // int,transform_precoding : int,dmrs_config_type : int,ul_dmrs_symb_pos : int,number_dmrs_symbols : int,dmrs_port : - // int,dmrs_nscid : int,nb_antennas_rx : int,number_of_bits : buffer,data + log_ul_fd_pusch_iq(frame, slot, frame_parms, rel15_ul, + number_dmrs_symbols, dmrs_port, + (const c16_t *)(&(rxFext_slot_mem[0])), + rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * frame_parms->nb_antennas_rx * 4); - T(T_GNB_PHY_UL_FD_CHAN_EST_DMRS_INTERPL, - T_INT((int)frame), - T_INT((int)slot), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 0, 8)), - T_INT((int)split_time_stamp_and_convert_to_int(trace_time_stamp_str, 8, 9)), - T_INT((int)frame_parms->frame_type), // Frame type (0 FDD, 1 TDD) frame_structure - T_INT((int)frame_parms->freq_range), // Frequency range (0 FR1, 1 FR2) - T_INT((int)rel15_ul->subcarrier_spacing), // Subcarrier spacing (0 15kHz, 1 30kHz, 2 60kHz) - T_INT((int)rel15_ul->cyclic_prefix), // Normal or extended prefix (0 normal, 1 extended) - T_INT((int)frame_parms->symbols_per_slot), // Number of symbols per slot - T_INT((int)frame_parms->Nid_cell), - T_INT((int)rel15_ul->rnti), - T_INT((int)rel15_ul->rb_size), - T_INT((int)rel15_ul->rb_start), - T_INT((int)rel15_ul->start_symbol_index), // start_ofdm_symbol - T_INT((int)rel15_ul->nr_of_symbols), // num_ofdm_symbols - T_INT((int)rel15_ul->qam_mod_order), // modulation - T_INT((int)rel15_ul->mcs_index), // mcs - T_INT((int)rel15_ul->mcs_table), // mcs_table_index - T_INT((int)rel15_ul->nrOfLayers), // num_layer - T_INT((int)rel15_ul->transform_precoding), // transformPrecoder_enabled = 0, transformPrecoder_disabled = 1 - T_INT((int)rel15_ul->dmrs_config_type), // dmrs_resource_map_config: pusch_dmrs_type1 = 0, pusch_dmrs_type2 = 1 - T_INT((int)rel15_ul->ul_dmrs_symb_pos), // used to derive the DMRS symbol positions - T_INT((int)number_dmrs_symbols), - // dmrs_start_ofdm_symbol - // dmrs_duration_num_ofdm_symbols - // dmrs_num_add_positions - T_INT((int)dmrs_port), // dmrs_antenna_port - T_INT((int)rel15_ul->scid), // dmrs_nscid - T_INT((int)frame_parms->nb_antennas_rx), // rx antenna - T_INT(0), // number_of_bits - T_BUFFER( - (c16_t *)pusch_ch_est_dmrs_interpl_slot_mem, - rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols * frame_parms->nb_antennas_rx * rel15_ul->nrOfLayers * 4)); - } + log_ul_fd_chan_est_dmrs_interpl(frame, slot, frame_parms, rel15_ul, + number_dmrs_symbols, dmrs_port, + (const c16_t *)pusch_ch_est_dmrs_interpl_slot_mem, + rel15_ul->rb_size * NR_NB_SC_PER_RB * rel15_ul->nr_of_symbols + * frame_parms->nb_antennas_rx * rel15_ul->nrOfLayers * 4); #endif join_task_ans(&ans);