From 200006c4b75a6332be374b6c68c8c9451c2df70c Mon Sep 17 00:00:00 2001 From: Francisco Date: Thu, 27 May 2021 18:39:22 +0100 Subject: [PATCH] bugfix,scheduler: avoid offset to increase decrease unboundedly when mcs is equal to 0 or max_mcs --- srsenb/enb.conf.example | 2 +- .../hdr/stack/mac/sched_ue_ctrl/sched_harq.h | 5 +- .../stack/mac/sched_ue_ctrl/sched_ue_cell.h | 2 +- srsenb/src/main.cc | 2 +- .../src/stack/mac/sched_ue_ctrl/sched_harq.cc | 8 +-- .../stack/mac/sched_ue_ctrl/sched_ue_cell.cc | 54 ++++++++++++------- 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/srsenb/enb.conf.example b/srsenb/enb.conf.example index a0e73714e..1672bfcdb 100644 --- a/srsenb/enb.conf.example +++ b/srsenb/enb.conf.example @@ -181,7 +181,7 @@ enable = false #policy_args = 2 #min_aggr_level = 0 #max_aggr_level = 3 -#adaptive_aggr_level = true +#adaptive_aggr_level = false #pdsch_mcs = -1 #pdsch_max_mcs = -1 #pusch_mcs = -1 diff --git a/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_harq.h b/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_harq.h index ecc76b1f8..d274296e9 100644 --- a/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_harq.h +++ b/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_harq.h @@ -36,6 +36,7 @@ public: srsran::tti_point get_tti() const; bool get_ndi(uint32_t tb_idx) const; uint32_t max_nof_retx() const; + int get_mcs(uint32_t tb_idx) const { return last_mcs[tb_idx]; } protected: void new_tx_common(uint32_t tb_idx, srsran::tti_point tti, int mcs, int tbs, uint32_t max_retx_); @@ -147,9 +148,9 @@ public: * @param tti_rx tti the DL ACK was received * @param tb_idx TB index for the given ACK * @param ack true for ACK and false for NACK - * @return pair with pid and size of TB of the DL harq that was ACKed + * @return tuple with pid, TBS and MCS of the DL harq that was ACKed */ - std::pair set_ack_info(tti_point tti_rx, uint32_t tb_idx, bool ack); + std::tuple set_ack_info(tti_point tti_rx, uint32_t tb_idx, bool ack); //! Get UL Harq for a given tti_tx_ul ul_harq_proc* get_ul_harq(tti_point tti_tx_ul); diff --git a/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_ue_cell.h b/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_ue_cell.h index 5779fee8e..4e0020b41 100644 --- a/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_ue_cell.h +++ b/srsenb/hdr/stack/mac/sched_ue_ctrl/sched_ue_cell.h @@ -91,7 +91,7 @@ private: cc_st cc_state_ = cc_st::idle; // CQI - float delta_down = 0, delta_up = 0; + float delta_inc = 0, delta_dec = 0; float dl_cqi_coeff = 0, ul_snr_coeff = 0; float max_cqi_coeff = -5, max_snr_coeff = 5; diff --git a/srsenb/src/main.cc b/srsenb/src/main.cc index 8ec826e56..d03812f52 100644 --- a/srsenb/src/main.cc +++ b/srsenb/src/main.cc @@ -147,7 +147,7 @@ void parse_args(all_args_t* args, int argc, char* argv[]) ("scheduler.pusch_max_mcs", bpo::value(&args->stack.mac.sched.pusch_max_mcs)->default_value(-1), "Optional PUSCH MCS limit") ("scheduler.min_aggr_level", bpo::value(&args->stack.mac.sched.min_aggr_level)->default_value(0), "Optional minimum aggregation level index (l=log2(L)) ") ("scheduler.max_aggr_level", bpo::value(&args->stack.mac.sched.max_aggr_level)->default_value(3), "Optional maximum aggregation level index (l=log2(L)) ") - ("scheduler.adaptive_aggr_level", bpo::value(&args->stack.mac.sched.adaptive_aggr_level)->default_value(true), "Boolean flag to enable/disable adaptive aggregation level based on target BLER") + ("scheduler.adaptive_aggr_level", bpo::value(&args->stack.mac.sched.adaptive_aggr_level)->default_value(false), "Boolean flag to enable/disable adaptive aggregation level based on target BLER") ("scheduler.max_nof_ctrl_symbols", bpo::value(&args->stack.mac.sched.max_nof_ctrl_symbols)->default_value(3), "Number of control symbols") ("scheduler.min_nof_ctrl_symbols", bpo::value(&args->stack.mac.sched.min_nof_ctrl_symbols)->default_value(1), "Minimum number of control symbols") ("scheduler.pucch_multiplex_enable", bpo::value(&args->stack.mac.sched.pucch_mux_enabled)->default_value(false), "Enable PUCCH multiplexing") diff --git a/srsenb/src/stack/mac/sched_ue_ctrl/sched_harq.cc b/srsenb/src/stack/mac/sched_ue_ctrl/sched_harq.cc index 92dffcf2e..97d963bdf 100644 --- a/srsenb/src/stack/mac/sched_ue_ctrl/sched_harq.cc +++ b/srsenb/src/stack/mac/sched_ue_ctrl/sched_harq.cc @@ -366,17 +366,17 @@ dl_harq_proc* harq_entity::get_pending_dl_harq(tti_point tti_tx_dl) return get_oldest_dl_harq(tti_tx_dl); } -std::pair harq_entity::set_ack_info(tti_point tti_rx, uint32_t tb_idx, bool ack) +std::tuple harq_entity::set_ack_info(tti_point tti_rx, uint32_t tb_idx, bool ack) { for (auto& h : dl_harqs) { if (h.get_tti() + FDD_HARQ_DELAY_DL_MS == tti_rx) { if (h.set_ack(tb_idx, ack) == SRSRAN_SUCCESS) { - return {h.get_id(), h.get_tbs(tb_idx)}; + return {h.get_id(), h.get_tbs(tb_idx), h.get_mcs(tb_idx)}; } - return {h.get_id(), -1}; + return {h.get_id(), -1, -1}; } } - return {dl_harqs.size(), -1}; + return {dl_harqs.size(), -1, -1}; } ul_harq_proc* harq_entity::get_ul_harq(tti_point tti_tx_ul) diff --git a/srsenb/src/stack/mac/sched_ue_ctrl/sched_ue_cell.cc b/srsenb/src/stack/mac/sched_ue_ctrl/sched_ue_cell.cc index c34a6511c..1a6bd1294 100644 --- a/srsenb/src/stack/mac/sched_ue_ctrl/sched_ue_cell.cc +++ b/srsenb/src/stack/mac/sched_ue_ctrl/sched_ue_cell.cc @@ -49,8 +49,8 @@ sched_ue_cell::sched_ue_cell(uint16_t rnti_, const sched_cell_params_t& cell_cfg clear_feedback(); float target_bler = cell_cfg->sched_cfg->target_bler; - delta_down = cell_cfg->sched_cfg->adaptive_link_step_size; - delta_up = (1 - target_bler) * delta_down / target_bler; + delta_inc = cell_cfg->sched_cfg->adaptive_link_step_size; // delta_{down} of OLLA + delta_dec = (1 - target_bler) * delta_inc / target_bler; max_cqi_coeff = cell_cfg->sched_cfg->max_delta_dl_cqi; max_snr_coeff = cell_cfg->sched_cfg->max_delta_ul_snr; } @@ -178,6 +178,24 @@ int sched_ue_cell::set_dl_wb_cqi(tti_point tti_rx, uint32_t dl_cqi_) int sched_ue_cell::set_ul_crc(tti_point tti_rx, bool crc_res) { CHECK_VALID_CC("UL CRC"); + + // Adapt UL MCS based on BLER + if (cell_cfg->sched_cfg->target_bler > 0 and fixed_mcs_ul < 0) { + auto* ul_harq = harq_ent.get_ul_harq(tti_rx); + if (ul_harq != nullptr) { + int mcs = ul_harq->get_mcs(0); + // Note: Avoid keeping increasing the snr delta offset, if MCS is already is at its limit + float delta_dec_eff = mcs <= 0 ? 0 : delta_dec; + float delta_inc_eff = mcs >= (int)max_mcs_ul ? 0 : delta_inc; + ul_snr_coeff += crc_res ? delta_inc_eff : -delta_dec_eff; + ul_snr_coeff = std::min(std::max(-max_snr_coeff, ul_snr_coeff), max_snr_coeff); + logger.info("SCHED: UL adaptive link: snr_estim=%.2f, last_mcs=%d, snr_offset=%f", + tpc_fsm.get_ul_snr_estim(), + mcs, + ul_snr_coeff); + } + } + // Update HARQ process int pid = harq_ent.set_ul_crc(tti_rx, 0, crc_res); if (pid < 0) { @@ -185,30 +203,30 @@ int sched_ue_cell::set_ul_crc(tti_point tti_rx, bool crc_res) return SRSRAN_ERROR; } - if (cell_cfg->sched_cfg->target_bler > 0) { - ul_snr_coeff += delta_down - static_cast(not crc_res) * (delta_down + delta_up); - ul_snr_coeff = std::min(std::max(-max_snr_coeff, ul_snr_coeff), max_snr_coeff); - logger.info("SCHED: UL adaptive link: snr_estim=%f, snr_offset=%f", tpc_fsm.get_ul_snr_estim(), ul_snr_coeff); - } return pid; } int sched_ue_cell::set_ack_info(tti_point tti_rx, uint32_t tb_idx, bool ack) { CHECK_VALID_CC("DL ACK Info"); - std::pair p2 = harq_ent.set_ack_info(tti_rx, tb_idx, ack); - int tbs_acked = p2.second; - if (tbs_acked > 0) { - logger.debug( - "SCHED: Set DL ACK=%d for rnti=0x%x, pid=%d, tb=%d, tti=%d", ack, rnti, p2.first, tb_idx, tti_rx.to_uint()); - if (cell_cfg->sched_cfg->target_bler > 0) { - dl_cqi_coeff += delta_down - static_cast(not ack) * (delta_down + delta_up); - dl_cqi_coeff = std::min(std::max(-max_cqi_coeff, dl_cqi_coeff), max_cqi_coeff); - logger.info("SCHED: DL adaptive link: cqi=%d, cqi_offset=%f", dl_cqi_ctxt.get_avg_cqi(), dl_cqi_coeff); - } - } else { + std::tuple p2 = harq_ent.set_ack_info(tti_rx, tb_idx, ack); + int tbs_acked = std::get<1>(p2); + if (tbs_acked <= 0) { logger.warning("SCHED: Received ACK info for unknown TTI=%d", tti_rx.to_uint()); + return tbs_acked; + } + + // Adapt DL MCS based on BLER + if (cell_cfg->sched_cfg->target_bler > 0 and fixed_mcs_dl < 0) { + int mcs = std::get<2>(p2); + // Note: Avoid keeping increasing the snr delta offset, if MCS is already is at its limit + float delta_dec_eff = mcs <= 0 ? 0 : delta_dec; + float delta_inc_eff = mcs >= (int)max_mcs_dl ? 0 : delta_inc; + dl_cqi_coeff += ack ? delta_inc_eff : -delta_dec_eff; + dl_cqi_coeff = std::min(std::max(-max_cqi_coeff, dl_cqi_coeff), max_cqi_coeff); + logger.info( + "SCHED: DL adaptive link: cqi=%d, last_mcs=%d, cqi_offset=%f", dl_cqi_ctxt.get_avg_cqi(), mcs, dl_cqi_coeff); } return tbs_acked; }