Commit cdabdd06 authored by mir's avatar mir

Demodulation added

parent ef340749
...@@ -487,14 +487,14 @@ void init_gNB_Tpool(int inst) { ...@@ -487,14 +487,14 @@ void init_gNB_Tpool(int inst) {
printf("[MIR]: log cores %d \n", log_cores); printf("[MIR]: log cores %d \n", log_cores);
// Assuming: 2 x Physical cores = Logical cores // Assuming: 2 x Physical cores = Logical cores
init_task_manager(&gNB->man, log_cores/2); init_task_manager(&gNB->man, log_cores/2);
#endif
// PUSCH symbols per thread need to be calculated by how many threads we have
gNB->num_pusch_symbols_per_thread = 1;
// ULSCH decoding threadpool
#else #else
initTpool(get_softmodem_params()->threadPoolConfig, &gNB->threadPool, cpumeas(CPUMEAS_GETSTATE)); initTpool(get_softmodem_params()->threadPoolConfig, &gNB->threadPool, cpumeas(CPUMEAS_GETSTATE));
#endif #endif
// ULSCH decoder result FIFO
// PUSCH symbols per thread need to be calculated by how many threads we have
gNB->num_pusch_symbols_per_thread = 1;
// ULSCH decoder result FIFO
initNotifiedFIFO(&gNB->respPuschSymb); initNotifiedFIFO(&gNB->respPuschSymb);
initNotifiedFIFO(&gNB->respDecode); initNotifiedFIFO(&gNB->respDecode);
......
...@@ -1440,6 +1440,11 @@ static void nr_pusch_symbol_processing(void *arg) ...@@ -1440,6 +1440,11 @@ static void nr_pusch_symbol_processing(void *arg)
for (int i = 0; i < (nb_re_pusch * rel15_ul->qam_mod_order * rel15_ul->nrOfLayers); i++) for (int i = 0; i < (nb_re_pusch * rel15_ul->qam_mod_order * rel15_ul->nrOfLayers); i++)
llr16[i] = llr_ptr[i] * rdata->s[i]; llr16[i] = llr_ptr[i] * rdata->s[i];
} }
#ifdef TASK_MANAGER
assert(rdata->task_finished != NULL);
atomic_store_explicit(rdata->task_finished, 1, memory_order_seq_cst); // memory_order order );
#endif
} }
...@@ -1471,7 +1476,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1471,7 +1476,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) { for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01; uint8_t dmrs_symbol_flag = (rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01;
LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag); LOG_D(PHY, "symbol %d, dmrs_symbol_flag :%d\n", symbol, dmrs_symbol_flag);
if (dmrs_symbol_flag == 1) { if (dmrs_symbol_flag == 1) {
if (pusch_vars->dmrs_symbol == INVALID_VALUE) if (pusch_vars->dmrs_symbol == INVALID_VALUE)
pusch_vars->dmrs_symbol = symbol; pusch_vars->dmrs_symbol = symbol;
...@@ -1479,28 +1484,28 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1479,28 +1484,28 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
for (int nl=0; nl<rel15_ul->nrOfLayers; nl++) { for (int nl=0; nl<rel15_ul->nrOfLayers; nl++) {
uint32_t nvar_tmp = 0; uint32_t nvar_tmp = 0;
nr_pusch_channel_estimation(gNB, nr_pusch_channel_estimation(gNB,
slot, slot,
get_dmrs_port(nl,rel15_ul->dmrs_ports), get_dmrs_port(nl,rel15_ul->dmrs_ports),
symbol, symbol,
ulsch_id, ulsch_id,
bwp_start_subcarrier, bwp_start_subcarrier,
rel15_ul, rel15_ul,
&max_ch, &max_ch,
&nvar_tmp); &nvar_tmp);
nvar += nvar_tmp; nvar += nvar_tmp;
} }
// measure the SNR from the channel estimation // measure the SNR from the channel estimation
nr_gnb_measurements(gNB, nr_gnb_measurements(gNB,
&gNB->ulsch[ulsch_id], &gNB->ulsch[ulsch_id],
pusch_vars, pusch_vars,
symbol, symbol,
rel15_ul->nrOfLayers); rel15_ul->nrOfLayers);
allocCast2D(n0_subband_power, allocCast2D(n0_subband_power,
unsigned int, unsigned int,
gNB->measurements.n0_subband_power, gNB->measurements.n0_subband_power,
frame_parms->nb_antennas_rx, frame_parms->nb_antennas_rx,
frame_parms->N_RB_UL, frame_parms->N_RB_UL,
false); false);
for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
{ {
if (symbol == rel15_ul->start_symbol_index) if (symbol == rel15_ul->start_symbol_index)
...@@ -1526,14 +1531,14 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1526,14 +1531,14 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
if (gNB->chest_time == 1) if (gNB->chest_time == 1)
{ {
nr_chest_time_domain_avg(frame_parms, nr_chest_time_domain_avg(frame_parms,
pusch_vars->ul_ch_estimates, pusch_vars->ul_ch_estimates,
rel15_ul->nr_of_symbols, rel15_ul->nr_of_symbols,
rel15_ul->start_symbol_index, rel15_ul->start_symbol_index,
rel15_ul->ul_dmrs_symb_pos, rel15_ul->ul_dmrs_symb_pos,
rel15_ul->rb_size); rel15_ul->rb_size);
pusch_vars->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos, pusch_vars->dmrs_symbol = get_next_dmrs_symbol_in_slot(rel15_ul->ul_dmrs_symb_pos,
rel15_ul->start_symbol_index, rel15_ul->start_symbol_index,
rel15_ul->nr_of_symbols); rel15_ul->nr_of_symbols);
} }
stop_meas(&gNB->ulsch_channel_estimation_stats); stop_meas(&gNB->ulsch_channel_estimation_stats);
...@@ -1598,15 +1603,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1598,15 +1603,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++)
nr_ulsch_extract_rbs(gNB->common_vars.rxdataF[aarx], nr_ulsch_extract_rbs(gNB->common_vars.rxdataF[aarx],
(c16_t *)pusch_vars->ul_ch_estimates[aatx * frame_parms->nb_antennas_rx + aarx], (c16_t *)pusch_vars->ul_ch_estimates[aatx * frame_parms->nb_antennas_rx + aarx],
(c16_t*)&pusch_vars->rxdataF_ext[aarx][meas_symbol * nb_re_pusch], (c16_t*)&pusch_vars->rxdataF_ext[aarx][meas_symbol * nb_re_pusch],
(c16_t*)&pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][meas_symbol * nb_re_pusch], (c16_t*)&pusch_vars->ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][meas_symbol * nb_re_pusch],
soffset + meas_symbol * frame_parms->ofdm_symbol_size, soffset + meas_symbol * frame_parms->ofdm_symbol_size,
pusch_vars->dmrs_symbol * frame_parms->ofdm_symbol_size, pusch_vars->dmrs_symbol * frame_parms->ofdm_symbol_size,
aarx, aarx,
(rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01, (rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01,
rel15_ul, rel15_ul,
frame_parms); frame_parms);
int avgs = 0; int avgs = 0;
int avg[frame_parms->nb_antennas_rx*rel15_ul->nrOfLayers]; int avg[frame_parms->nb_antennas_rx*rel15_ul->nrOfLayers];
...@@ -1616,32 +1621,32 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1616,32 +1621,32 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
//--------------------- Channel Scaling -------------------- //--------------------- Channel Scaling --------------------
//---------------------------------------------------------- //----------------------------------------------------------
nr_ulsch_scale_channel(pusch_vars->ul_ch_estimates_ext, nr_ulsch_scale_channel(pusch_vars->ul_ch_estimates_ext,
frame_parms, frame_parms,
meas_symbol, meas_symbol,
(rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01, (rel15_ul->ul_dmrs_symb_pos >> meas_symbol) & 0x01,
nb_re_pusch, nb_re_pusch,
rel15_ul->nrOfLayers, rel15_ul->nrOfLayers,
rel15_ul->rb_size, rel15_ul->rb_size,
shift_ch_ext); shift_ch_ext);
nr_ulsch_channel_level(pusch_vars->ul_ch_estimates_ext, nr_ulsch_channel_level(pusch_vars->ul_ch_estimates_ext,
frame_parms, frame_parms,
avg, avg,
meas_symbol, // index of the start symbol meas_symbol, // index of the start symbol
nb_re_pusch, // number of the re in pusch nb_re_pusch, // number of the re in pusch
rel15_ul->nrOfLayers); rel15_ul->nrOfLayers);
for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++) for (int aatx = 0; aatx < rel15_ul->nrOfLayers; aatx++)
for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
avgs = cmax(avgs, avg[aatx*frame_parms->nb_antennas_rx+aarx]); avgs = cmax(avgs, avg[aatx*frame_parms->nb_antennas_rx+aarx]);
pusch_vars->log2_maxh = (log2_approx(avgs) >> 1); pusch_vars->log2_maxh = (log2_approx(avgs) >> 1);
if (rel15_ul->nrOfLayers == 2 && rel15_ul->qam_mod_order >= 6) if (rel15_ul->nrOfLayers == 2 && rel15_ul->qam_mod_order >= 6)
pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) - 3; // for MMSE pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) - 3; // for MMSE
else if (rel15_ul->nrOfLayers == 1) else if (rel15_ul->nrOfLayers == 1)
pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) + 1 + log2_approx(frame_parms->nb_antennas_rx >> 2); pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) + 1 + log2_approx(frame_parms->nb_antennas_rx >> 2);
if (pusch_vars->log2_maxh < 0) if (pusch_vars->log2_maxh < 0)
pusch_vars->log2_maxh = 0; pusch_vars->log2_maxh = 0;
...@@ -1650,6 +1655,17 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1650,6 +1655,17 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
start_meas(&gNB->rx_pusch_symbol_processing_stats); start_meas(&gNB->rx_pusch_symbol_processing_stats);
int numSymbols = gNB->num_pusch_symbols_per_thread; int numSymbols = gNB->num_pusch_symbols_per_thread;
#ifdef TASK_MANAGER
int const loop_iter = rel15_ul->nr_of_symbols/numSymbols;
puschSymbolProc_t arr[loop_iter];
_Atomic(int) arr_tf[loop_iter];
memset(arr, 0, loop_iter*sizeof(puschSymbolProc_t));
memset(arr_tf, 0, loop_iter*sizeof(_Atomic(int)));
int sz_arr = 0;
#endif
for(uint8_t symbol = rel15_ul->start_symbol_index; for(uint8_t symbol = rel15_ul->start_symbol_index;
symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols);
symbol += numSymbols) symbol += numSymbols)
...@@ -1658,15 +1674,21 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1658,15 +1674,21 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
for (int s = 0; s < numSymbols;s++) { for (int s = 0; s < numSymbols;s++) {
pusch_vars->ul_valid_re_per_slot[symbol+s] = get_nb_re_pusch(frame_parms,rel15_ul,symbol+s); pusch_vars->ul_valid_re_per_slot[symbol+s] = get_nb_re_pusch(frame_parms,rel15_ul,symbol+s);
pusch_vars->llr_offset[symbol+s] = ((symbol+s) == rel15_ul->start_symbol_index) ? pusch_vars->llr_offset[symbol+s] = ((symbol+s) == rel15_ul->start_symbol_index) ?
0 : 0 :
pusch_vars->llr_offset[symbol+s-1] + pusch_vars->ul_valid_re_per_slot[symbol+s-1] * rel15_ul->qam_mod_order; pusch_vars->llr_offset[symbol+s-1] + pusch_vars->ul_valid_re_per_slot[symbol+s-1] * rel15_ul->qam_mod_order;
total_res+=pusch_vars->ul_valid_re_per_slot[symbol+s]; total_res+=pusch_vars->ul_valid_re_per_slot[symbol+s];
} }
if (total_res > 0) { if (total_res > 0) {
#ifdef TASK_MANAGER
puschSymbolProc_t *rdata = &arr[sz_arr];
rdata->task_finished = &arr_tf[sz_arr];
++sz_arr;
#else
union puschSymbolReqUnion id = {.s={ulsch_id,frame,slot,0}}; union puschSymbolReqUnion id = {.s={ulsch_id,frame,slot,0}};
id.p=1+symbol; id.p=1+symbol;
notifiedFIFO_elt_t *req = newNotifiedFIFO_elt(sizeof(puschSymbolProc_t), id.p, &gNB->respPuschSymb, &nr_pusch_symbol_processing); // create a job for Tpool notifiedFIFO_elt_t *req = newNotifiedFIFO_elt(sizeof(puschSymbolProc_t), id.p, &gNB->respPuschSymb, &nr_pusch_symbol_processing); // create a job for Tpool
puschSymbolProc_t *rdata = (puschSymbolProc_t*)NotifiedFifoData(req); // data for the job puschSymbolProc_t *rdata = (puschSymbolProc_t*)NotifiedFifoData(req); // data for the job
#endif
rdata->gNB = gNB; rdata->gNB = gNB;
rdata->frame_parms = frame_parms; rdata->frame_parms = frame_parms;
...@@ -1681,9 +1703,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1681,9 +1703,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
rdata->nvar = nvar; rdata->nvar = nvar;
if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) { if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
// Obvious memory leak when TASK_MANAGER not defined
nr_pusch_symbol_processing(rdata); nr_pusch_symbol_processing(rdata);
} else { } else {
#ifdef TASK_MANAGER
task_t t = { .args = rdata, .func = &nr_pusch_symbol_processing };
async_task_manager(&gNB->man , t);
#else
pushTpool(&gNB->threadPool, req); pushTpool(&gNB->threadPool, req);
#endif
gNB->nbSymb++; gNB->nbSymb++;
} }
...@@ -1691,11 +1719,19 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB, ...@@ -1691,11 +1719,19 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
} }
} // symbol loop } // symbol loop
#ifdef TASK_MANAGER
if(gNB->nbSymb > 0){
trigger_all_task_manager(&gNB->man);
wait_spin_all_atomics_one(sz_arr, arr_tf);
gNB->nbSymb = 0;
}
#else
while (gNB->nbSymb > 0) { while (gNB->nbSymb > 0) {
notifiedFIFO_elt_t *req = pullTpool(&gNB->respPuschSymb, &gNB->threadPool); notifiedFIFO_elt_t *req = pullTpool(&gNB->respPuschSymb, &gNB->threadPool);
gNB->nbSymb--; gNB->nbSymb--;
delNotifiedFIFO_elt(req); delNotifiedFIFO_elt(req);
} }
#endif
stop_meas(&gNB->rx_pusch_symbol_processing_stats); stop_meas(&gNB->rx_pusch_symbol_processing_stats);
return 0; return 0;
......
...@@ -757,6 +757,9 @@ typedef struct puschSymbolProc_s { ...@@ -757,6 +757,9 @@ typedef struct puschSymbolProc_s {
int16_t **llr_layers; int16_t **llr_layers;
int16_t *s; int16_t *s;
uint32_t nvar; uint32_t nvar;
#ifdef TASK_MANAGER
_Atomic(int)* task_finished;
#endif
} puschSymbolProc_t; } puschSymbolProc_t;
struct puschSymbolReqId { struct puschSymbolReqId {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment