From 42b544cda96a1e3c378196b55b6c6ec80b554001 Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Wed, 16 Oct 2024 15:09:08 +0200 Subject: [PATCH 1/3] Correct max number of LDPC segments for T2 processing Fix error reported by the T2 card when running nr_dlsim with 4 DL layers. Error can be reproduced by running: ./nr_dlsim -n100 -s30 -e25 -b273 -R273 -x4 -z4 -y4 -P --ldpc_offload.dpdk_dev 41:00.0 -c So far we set NR_LDPC_MAX_NUM_CB to 72, which is sufficient for max 2 DL layers. Set max possible number of LDPC segments based on the max number of layers and max number of DLSCH segments (currently it is 144). --- openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h index d713340a19..43bf68f48d 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPCdecoder_defs.h @@ -99,7 +99,8 @@ /** Maximum number of possible input LLR = NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX */ #define NR_LDPC_MAX_NUM_LLR 27000 -#define NR_LDPC_MAX_NUM_CB 72 +/** Maximum number of segments per TB = MAX_NUM_NR_DLSCH_SEGMENTS_PER_LAYER*NR_MAX_NB_LAYERS */ +#define NR_LDPC_MAX_NUM_CB 144 // ============================================================================== // GLOBAL CONSTANT VARIABLES From 0021b696451fb41a8a7a96385318bfd63def6c85 Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Tue, 19 Nov 2024 17:42:36 +0100 Subject: [PATCH 2/3] Optimize memory usage in decode_offload function - Reduce the size of z_ol to LDPC_MAX_CB_SIZE to reduce memory footprint. - Simplify memcpy and pointer casting for z_ol. --- openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c index 32ce0acba2..44bb20115d 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c @@ -232,7 +232,7 @@ int decode_offload(PHY_VARS_gNB *phy_vars_gNB, { NR_gNB_ULSCH_t *ulsch = &phy_vars_gNB->ulsch[ULSCH_id]; NR_UL_gNB_HARQ_t *harq_process = ulsch->harq_process; - int16_t z_ol[NR_LDPC_MAX_NUM_CB * LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); + int16_t z_ol[LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); int8_t l_ol[NR_LDPC_MAX_NUM_CB * LDPC_MAX_CB_SIZE] __attribute__((aligned(16))); const int kc = decParams->BG == 2 ? 52 : 68; uint32_t A = (harq_process->TBS) << 3; @@ -247,8 +247,8 @@ int decode_offload(PHY_VARS_gNB *phy_vars_gNB, for (int r = 0; r < harq_process->C; r++) { decParams->perCB[r].E_cb = nr_get_E(G, harq_process->C, decParams->Qm, pusch_pdu->nrOfLayers, r); - memcpy(&z_ol[offset], ulsch_llr + r_offset, decParams->perCB[r].E_cb * sizeof(*z_ol)); - simde__m128i *pv_ol128 = (simde__m128i *)&z_ol[offset]; + memcpy(z_ol, ulsch_llr + r_offset, decParams->perCB[r].E_cb * sizeof(int16_t)); + simde__m128i *pv_ol128 = (simde__m128i *)z_ol; simde__m128i *pl_ol128 = (simde__m128i *)&l_ol[offset]; for (int i = 0, j = 0; j < ((kc * harq_process->Z) >> 4) + 1; i += 2, j++) { pl_ol128[j] = simde_mm_packs_epi16(pv_ol128[i], pv_ol128[i + 1]); From 2f27839515b0f11606961b3eb53115e6b0e3be25 Mon Sep 17 00:00:00 2001 From: Jaroslava Fiedlerova Date: Wed, 20 Nov 2024 08:36:12 +0100 Subject: [PATCH 3/3] T2: Rework retrieve_ldpc_enc_op() --- .../nrLDPC_decoder/nrLDPC_decoder_offload.c | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c index 77a1209709..fd222f40b4 100644 --- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c +++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_decoder_offload.c @@ -595,23 +595,22 @@ static int retrieve_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, static int retrieve_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, uint8_t *p_out, nrLDPC_params_per_cb_t *perCB) { - struct rte_bbdev_op_data *output; - struct rte_mbuf *m; - unsigned int i; - char *data; - uint8_t *out; int offset = 0; - for (i = 0; i < n; ++i) { - output = &ops[i]->ldpc_enc.output; - m = output->data; + for (int i = 0; i < n; ++i) { + struct rte_bbdev_op_data *output = &ops[i]->ldpc_enc.output; + struct rte_mbuf *m = output->data; uint16_t data_len = rte_pktmbuf_data_len(m) - output->offset; - out = &p_out[offset]; - data = m->buf_addr; - for (int byte = 0; byte < data_len; byte++) - for (int bit = 0; bit < 8; bit++) - out[byte * 8 + bit] = (data[m->data_off + byte] >> (7 - bit)) & 1; + uint8_t *out = &p_out[offset]; + const char *data = m->buf_addr + m->data_off; + const char *end = data + data_len; + while (data < end) { + uint8_t byte = *data++; // get the current byte + for (int bit = 7; bit >= 0; --bit) { + *out++ = (byte >> bit) & 1; // extract each bit + } + } offset += perCB[i].E_cb; - rte_pktmbuf_free(ops[i]->ldpc_enc.output.data); + rte_pktmbuf_free(m); rte_pktmbuf_free(ops[i]->ldpc_enc.input.data); } return 0;