Merge remote-tracking branch 'origin/precoder_optimization' into integration_2025_w42 (!3623)
Optimization of PDSCH precoding operation x86/aarch64 optimizations for precoding, more complete timing reporting in nr_dlsim. Timing report in nr_dlsim now shows the total PDSCH generation time and is broken down into Layer mapping, resource mapping and precoding. The optimizations for x86 are basically reorganizing loops (for AVX512,AVX2, NEON but not SSE2) to minimize repetitive instructions when formatting of the precoder weights, and creation of inline functions for complex multiply-add. AVX512 optimization was added. requiring AVX512BW. Detection of up to 4 PRBs with common PMI for efficiency with AVX512 (was 2 in develop for AVX2). For aarch64, native coding of the precoder to avoid inefficient SIMDe translations for this operation. nr_dlsim now uses default precoding indices depending on the scenario instead of 0 which doesn't do precoding at all. See merge request description for nr_dlsim test results.
This commit is contained in:
@@ -136,8 +136,7 @@ int precoding_weigths_generation(nfapi_nr_pm_list_t *mat,
|
||||
nfapi_nr_pm_weights_t *weights = &mat->pmi_pdu[pmiq].weights[j_col][i_rows];
|
||||
res_code = sqrt(1 / (double)L) * v_lm[llc][mmc][i_rows];
|
||||
c16_t precoder_weight = convert_precoder_weight(res_code);
|
||||
weights->precoder_weight_Re = precoder_weight.r;
|
||||
weights->precoder_weight_Im = precoder_weight.i;
|
||||
*weights = precoder_weight;
|
||||
LOG_D(PHY,
|
||||
"%d Layer Precoding Matrix[pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
|
||||
L,
|
||||
@@ -146,15 +145,14 @@ int precoding_weigths_generation(nfapi_nr_pm_list_t *mat,
|
||||
j_col,
|
||||
creal(res_code),
|
||||
cimag(res_code),
|
||||
weights->precoder_weight_Re,
|
||||
weights->precoder_weight_Im);
|
||||
weights->r,
|
||||
weights->i);
|
||||
}
|
||||
for (int i_rows = N1 * N2; i_rows < 2 * N1 * N2; i_rows++) {
|
||||
nfapi_nr_pm_weights_t *weights = &mat->pmi_pdu[pmiq].weights[j_col][i_rows];
|
||||
res_code = sqrt(1 / (double)L) * (phase_sign)*theta_n[nn] * v_lm[llc][mmc][i_rows - N1 * N2];
|
||||
c16_t precoder_weight = convert_precoder_weight(res_code);
|
||||
weights->precoder_weight_Re = precoder_weight.r;
|
||||
weights->precoder_weight_Im = precoder_weight.i;
|
||||
*weights = precoder_weight;
|
||||
LOG_D(PHY,
|
||||
"%d Layer Precoding Matrix[pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",
|
||||
L,
|
||||
@@ -163,8 +161,8 @@ int precoding_weigths_generation(nfapi_nr_pm_list_t *mat,
|
||||
j_col,
|
||||
creal(res_code),
|
||||
cimag(res_code),
|
||||
weights->precoder_weight_Re,
|
||||
weights->precoder_weight_Im);
|
||||
weights->r,
|
||||
weights->i);
|
||||
}
|
||||
}
|
||||
pmiq++;
|
||||
|
||||
@@ -231,8 +231,7 @@ bool pdcp_data_req(protocol_ctxt_t *ctxt_pP,
|
||||
hashtable_rc_t h_rc;
|
||||
uint8_t rb_offset= (srb_flagP == 0) ? DTCH -1 : 0;
|
||||
uint16_t pdcp_uid=0;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ,VCD_FUNCTION_IN);
|
||||
CHECK_CTXT_ARGS(ctxt_pP);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_DATA_REQ, VCD_FUNCTION_IN);
|
||||
#if T_TRACER
|
||||
|
||||
if (ctxt_pP->enb_flag != ENB_FLAG_NO)
|
||||
|
||||
@@ -262,22 +262,6 @@ void rlc_data_ind(const protocol_ctxt_t *const,
|
||||
const sdu_size_t,
|
||||
uint8_t *const);
|
||||
|
||||
/*! \fn void rlc_data_conf (const protocol_ctxt_t* const ctxtP, const srb_flag_t srb_flagP, const rb_id_t rb_idP, const mui_t muiP, const rlc_tx_status_t statusP)
|
||||
* \brief Interface with higher layers, confirm to upper layer the transmission status for a SDU stamped with a MUI, scheduled for transmission.
|
||||
* \param[in] ctxtP Running context.
|
||||
* \param[in] srb_flagP Flag to indicate SRB (1) or DRB (0)
|
||||
* \param[in] rb_idP Radio bearer identifier.
|
||||
* \param[in] muiP Message Unit identifier.
|
||||
* \param[in] statusP Status of the transmission (RLC_SDU_CONFIRM_YES, RLC_SDU_CONFIRM_NO).
|
||||
*/
|
||||
void rlc_data_conf(
|
||||
const protocol_ctxt_t *const,
|
||||
const srb_flag_t,
|
||||
const rb_id_t,
|
||||
const mui_t,
|
||||
const rlc_tx_status_t );
|
||||
|
||||
|
||||
/*! \fn rlc_op_status_t rlc_stat_req (
|
||||
const protocol_ctxt_t* const ctxtP,
|
||||
const srb_flag_t srb_flagP,
|
||||
|
||||
Reference in New Issue
Block a user