feat(nr_dlsch): option to provide the number of symbols per thread
* Add option `--L1s.L1_num_tx_sym_per_thread` for the softmodems and `-Y` for `nr_dlsim` to provide the number of symbols processed per thread. It defaults to 0 which makes that every symbols are processed in one thread. * The last symbol processing task is processed in the L1 TX thread.
This commit is contained in:
@@ -669,9 +669,15 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
|
||||
|
||||
// spawn symbol threads
|
||||
|
||||
int nb_tasks = rel15->NrOfSymbols / gNB->num_pdsch_symbols_per_thread;
|
||||
if ((rel15->NrOfSymbols % gNB->num_pdsch_symbols_per_thread) > 0)
|
||||
nb_tasks++;
|
||||
int nb_tasks = 1;
|
||||
int num_pdsch_symbols_per_task = rel15->NrOfSymbols;
|
||||
if (gNB->num_pdsch_symbols_per_thread > 0) {
|
||||
// symbol processing in thread pool enabled
|
||||
num_pdsch_symbols_per_task = gNB->num_pdsch_symbols_per_thread;
|
||||
nb_tasks = rel15->NrOfSymbols / num_pdsch_symbols_per_task;
|
||||
if ((rel15->NrOfSymbols % num_pdsch_symbols_per_task) > 0)
|
||||
nb_tasks++;
|
||||
}
|
||||
pdschSymbolProc_t arr[nb_tasks];
|
||||
task_ans_t ans;
|
||||
init_task_ans(&ans, nb_tasks);
|
||||
@@ -679,7 +685,7 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
|
||||
unsigned int re_beginning_of_symbol = 0;
|
||||
int res = 0;
|
||||
for (int l_symbol = rel15->StartSymbolIndex; l_symbol < rel15->StartSymbolIndex + rel15->NrOfSymbols;
|
||||
l_symbol += gNB->num_pdsch_symbols_per_thread) {
|
||||
l_symbol += num_pdsch_symbols_per_task) {
|
||||
pdschSymbolProc_t *rdata = &arr[sz_arr];
|
||||
rdata->ans = &ans;
|
||||
++sz_arr;
|
||||
@@ -690,8 +696,8 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
|
||||
rdata->slot = slot;
|
||||
rdata->startSymbol = l_symbol;
|
||||
res = rel15->NrOfSymbols - (l_symbol - rel15->StartSymbolIndex);
|
||||
if (res >= gNB->num_pdsch_symbols_per_thread)
|
||||
rdata->numSymbols = gNB->num_pdsch_symbols_per_thread;
|
||||
if (res >= num_pdsch_symbols_per_task)
|
||||
rdata->numSymbols = num_pdsch_symbols_per_task;
|
||||
else
|
||||
rdata->numSymbols = res;
|
||||
rdata->layerSz2 = layerSz2;
|
||||
@@ -711,8 +717,12 @@ static int do_one_dlsch(unsigned char *input_ptr, PHY_VARS_gNB *gNB, NR_gNB_DLSC
|
||||
reset_meas(&rdata->dlsch_precoding_stats);
|
||||
for (int l = 0; l < rel15->nrOfLayers; l++)
|
||||
rdata->tx_layers[l] = tx_layers[l];
|
||||
task_t t = {.func = &nr_pdsch_symbol_processing, .args = rdata};
|
||||
pushTpool(&gNB->threadPool, t);
|
||||
if (l_symbol < rel15->StartSymbolIndex + rel15->NrOfSymbols - num_pdsch_symbols_per_task) {
|
||||
task_t t = {.func = &nr_pdsch_symbol_processing, .args = rdata};
|
||||
pushTpool(&gNB->threadPool, t);
|
||||
} else {
|
||||
nr_pdsch_symbol_processing(rdata);
|
||||
}
|
||||
}
|
||||
join_task_ans(&ans);
|
||||
for (int i = 0; i < nb_tasks; i++) {
|
||||
|
||||
@@ -382,6 +382,8 @@ int main(int argc, char **argv)
|
||||
uint8_t dlsch_threads = 0;
|
||||
int chest_type[2] = {0};
|
||||
uint8_t max_ldpc_iterations = 5;
|
||||
// number of PDSCH symbols per thread = 0 means do not use thread pool
|
||||
int num_pdsch_symbols_per_thread = 0;
|
||||
if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == 0) {
|
||||
exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
|
||||
}
|
||||
@@ -583,6 +585,10 @@ int main(int argc, char **argv)
|
||||
gNBthreads[sizeof(gNBthreads)-1]=0;
|
||||
break;
|
||||
|
||||
case 'Y':
|
||||
num_pdsch_symbols_per_thread = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'Z' :
|
||||
filename_csv = strdup(optarg);
|
||||
AssertFatal(filename_csv != NULL, "strdup() error: errno %d\n", errno);
|
||||
@@ -657,6 +663,7 @@ int main(int argc, char **argv)
|
||||
printf("-T Enable PTRS, arguments list L_PTRS{0,1,2} K_PTRS{2,4}, e.g. -T 2 0 2 \n");
|
||||
printf("-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2} DMRS ConfType{1:2}, e.g. -U 3 0 2 1 \n");
|
||||
printf("-X gNB thread pool configuration, n => no threads\n");
|
||||
printf("-Y Number of symbols processed per PDSCH generation thread\n");
|
||||
printf("-Z Output filename (.csv format) for stats\n");
|
||||
exit (-1);
|
||||
break;
|
||||
@@ -715,7 +722,7 @@ int main(int argc, char **argv)
|
||||
|
||||
AssertFatal((gNB->if_inst = NR_IF_Module_init(0)) != NULL, "Cannot register interface");
|
||||
gNB->if_inst->NR_PHY_config_req = nr_phy_config_request;
|
||||
gNB->num_pdsch_symbols_per_thread = 1;
|
||||
gNB->num_pdsch_symbols_per_thread = num_pdsch_symbols_per_thread;
|
||||
|
||||
NR_ServingCellConfigCommon_t *scc = calloc(1,sizeof(*scc));;
|
||||
prepare_scc(scc);
|
||||
|
||||
Reference in New Issue
Block a user