From bc4b6cf2cf01f7aac8727a3af53efc4661b60aa9 Mon Sep 17 00:00:00 2001 From: Wang Tsu-Han Date: Wed, 26 Jun 2019 15:48:05 +0200 Subject: [PATCH] adding timing measurement for RT execution --- cmake_targets/CMakeLists.txt | 2 +- executables/nr-gnb.c | 22 +++++++++ .../PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c | 48 +++++++++---------- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 12 ++++- openair1/PHY/NR_TRANSPORT/nr_dlsch.h | 6 ++- openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 6 --- openair1/PHY/NR_TRANSPORT/nr_pbch.c | 4 +- openair1/PHY/defs_gNB.h | 2 + openair1/SCHED_NR/phy_procedures_nr_gNB.c | 6 ++- 9 files changed, 71 insertions(+), 37 deletions(-) diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index a085ce023e..c491438f3e 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -21,7 +21,7 @@ # Author: laurent THOMAS, Lionel GAUTHIER -cmake_minimum_required (VERSION 3.0) +cmake_minimum_required (VERSION 2.8) ############################################# # Base directories, compatible with legacy OAI building diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c index 4e7701f8af..bcf7e2e6d2 100644 --- a/executables/nr-gnb.c +++ b/executables/nr-gnb.c @@ -684,6 +684,27 @@ static void* gNB_thread_prach( void* param ) { extern void init_td_thread(PHY_VARS_gNB *); extern void init_te_thread(PHY_VARS_gNB *); +static void* process_stats_thread(void* param) { + + PHY_VARS_gNB *gNB = (PHY_VARS_gNB*)param; + + reset_meas(&gNB->dlsch_encoding_stats); + reset_meas(&gNB->dlsch_scrambling_stats); + reset_meas(&gNB->dlsch_modulation_stats); + + wait_sync("process_stats_thread"); + + while(!oai_exit) + { + sleep(1); + print_meas(&gNB->dlsch_encoding_stats, "pdsch_encoding", NULL, NULL); + print_meas(&gNB->dlsch_scrambling_stats, "pdsch_scrambling", NULL, NULL); + print_meas(&gNB->dlsch_modulation_stats, "pdsch_modulation", NULL, NULL); + } + return(NULL); +} + + void init_gNB_proc(int inst) { int i=0; int CC_id; @@ -731,6 +752,7 @@ void init_gNB_proc(int inst) { threadCreate( &L1_proc_tx->pthread, gNB_L1_thread_tx, gNB,"L1_proc_tx", -1, OAI_PRIORITY_RT); } + if(opp_enabled == 1) threadCreate(&proc->L1_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW); //pthread_create( &proc->pthread_prach, attr_prach, gNB_thread_prach, gNB ); char name[16]; diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c index 4466fc8eea..d5a815333e 100644 --- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c +++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c @@ -271,17 +271,17 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh memset(c,0,sizeof(unsigned char) * ncols * Zc); memset(d,0,sizeof(unsigned char) * nrows * Zc); - start_meas(tinput); + if(tinput != NULL) start_meas(tinput); for (i=0; i>(i&7); //printf("c(%d,%d)=%d\n",j,i,temp); } - stop_meas(tinput); + if(tinput != NULL) stop_meas(tinput); if ((BG==1 && Zc>176) || (BG==2 && Zc>64)) { // extend matrix - start_meas(tprep); + if(tprep != NULL) start_meas(tprep); for (i1=0; i1 < ncols; i1++) { memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char)); @@ -296,11 +296,11 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh printf("\n"); */ } - stop_meas(tprep); + if(tprep != NULL) stop_meas(tprep); //parity check part - start_meas(tparity); + if(tparity != NULL) start_meas(tparity); encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb); - stop_meas(tparity); + if(tparity != NULL) stop_meas(tparity); } else { if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) { @@ -308,12 +308,12 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh return(-1); } } - start_meas(toutput); + if(toutput != NULL) start_meas(toutput); // information part and puncture columns memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char)); memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char)); - stop_meas(toutput); + if(toutput != NULL) stop_meas(toutput); return 0; } @@ -408,7 +408,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i memset(c,0,sizeof(unsigned char) * ncols * Zc); memset(d,0,sizeof(unsigned char) * nrows * Zc); - start_meas(tinput); + if(tinput != NULL) start_meas(tinput); #if 0 for (i=0; i176) || (BG==2 && Zc>64)) { // extend matrix - start_meas(tprep); + if(tprep != NULL) start_meas(tprep); for (i1=0; i1 < ncols; i1++) { memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char)); @@ -460,11 +460,11 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i printf("\n"); */ } - stop_meas(tprep); + if(tprep != NULL) stop_meas(tprep); //parity check part - start_meas(tparity); + if(tparity != NULL) start_meas(tparity); encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb); - stop_meas(tparity); + if(tparity != NULL) stop_meas(tparity); } else { if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) { @@ -472,7 +472,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i return(-1); } } - start_meas(toutput); + if(toutput != NULL) start_meas(toutput); // information part and puncture columns /* memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char)); @@ -513,7 +513,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i AssertFatal(1==0,"Need AVX2 for now\n"); #endif - stop_meas(toutput); + if(toutput != NULL) stop_meas(toutput); return 0; } @@ -613,7 +613,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha memset(c,0,sizeof(unsigned char) * ncols * Zc); memset(d,0,sizeof(unsigned char) * nrows * Zc); - start_meas(tinput); + if(tinput != NULL) start_meas(tinput); #if 0 for (i=0; i176) || (BG==2 && Zc>64)) { // extend matrix - start_meas(tprep); + if(tprep != NULL) start_meas(tprep); for (i1=0; i1 < ncols; i1++) { memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char)); @@ -668,11 +668,11 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha printf("\n"); */ } - stop_meas(tprep); + if(tprep != NULL) stop_meas(tprep); //parity check part - start_meas(tparity); + if(tparity != NULL) start_meas(tparity); encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb); - stop_meas(tparity); + if(tparity != NULL) stop_meas(tparity); } else { if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) { @@ -680,7 +680,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha return(-1); } } - start_meas(toutput); + if(toutput != NULL) start_meas(toutput); // information part and puncture columns /* memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char)); @@ -726,7 +726,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha AssertFatal(1==0,"Need AVX2 for now\n"); #endif - stop_meas(toutput); + if(toutput != NULL) stop_meas(toutput); return 0; } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index 9a4df38895..aa75bd6555 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -74,7 +74,10 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch, int frame, uint8_t slot, NR_DL_FRAME_PARMS *frame_parms, - nfapi_nr_config_request_t *config) { + nfapi_nr_config_request_t *config, + time_stats_t *dlsch_encoding_stats, + time_stats_t *dlsch_scrambling_stats, + time_stats_t *dlsch_modulation_stats) { NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[dci_alloc->harq_pid]; nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15; @@ -89,7 +92,9 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch, /// CRC, coding, interleaving and rate matching AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n"); + start_meas(dlsch_encoding_stats); nr_dlsch_encoding(harq->pdu, frame, slot, dlsch, frame_parms); + stop_meas(dlsch_encoding_stats); #ifdef DEBUG_DLSCH printf("PDSCH encoding:\nPayload:\n"); for (int i=0; iB>>7; i++) { @@ -107,6 +112,7 @@ printf("\n"); #endif /// scrambling + start_meas(dlsch_scrambling_stats); for (int q=0; qnb_codewords; q++) memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t)); uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \ @@ -120,6 +126,7 @@ printf("\n"); Nid, n_RNTI, scrambled_output[q]); + stop_meas(dlsch_scrambling_stats); #ifdef DEBUG_DLSCH printf("PDSCH scrambling:\n"); for (int i=0; i>8; i++) { @@ -130,12 +137,13 @@ for (int i=0; i>8; i++) { #endif /// Modulation - + start_meas(dlsch_modulation_stats); for (int q=0; qnb_codewords; q++) nr_modulation(scrambled_output[q], encoded_length, Qm, mod_symbs[q]); + stop_meas(dlsch_modulation_stats); #ifdef DEBUG_DLSCH printf("PDSCH Modulation: Qm %d(%d)\n", Qm, nb_symbols); for (int i=0; i>3; i++) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h index 7c3e22a9e7..3419be30fa 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h @@ -74,7 +74,11 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch, int frame, uint8_t slot, NR_DL_FRAME_PARMS *frame_parms, - nfapi_nr_config_request_t *config); + nfapi_nr_config_request_t *config, + time_stats_t *dlsch_encoding_stats, + time_stats_t *dlsch_scrambling_stats, + time_stats_t *dlsch_modulation_stats); + void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index b3ce80d1ae..04098a8440 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -366,7 +366,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame, //printf("segment Z %d k %d Kr %d BG %d\n", *pz,dlsch->harq_processes[harq_pid]->K,Kr,BG); - //start_meas(te_stats); for (r=0; rharq_processes[harq_pid]->C; r++) { //d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; //channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0]; @@ -398,7 +397,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame, //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,dlsch->harq_processes[harq_pid]->d,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL); - //stop_meas(te_stats); //printf("end ldpc encoder -- output\n"); #ifdef DEBUG_DLSCH_CODING @@ -425,7 +423,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame, mod_order,nb_rb); #endif - //start_meas(rm_stats); #ifdef DEBUG_DLSCH_CODING printf("rvidx in encoding = %d\n", rel15.redundancy_version); #endif @@ -447,14 +444,11 @@ int nr_dlsch_encoding(unsigned char *a,int frame, for (int i =0; i<16; i++) printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i+r_offset], r_offset); #endif - //stop_meas(rm_stats); - //start_meas(i_stats); nr_interleaving_ldpc(E, mod_order, dlsch->harq_processes[harq_pid]->e+r_offset, dlsch->harq_processes[harq_pid]->f+r_offset); - //stop_meas(i_stats); #ifdef DEBUG_DLSCH_CODING diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c index ead8e3cda5..bb114fa390 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c @@ -239,7 +239,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, uint8_t nushift; uint32_t unscrambling_mask; uint64_t a_reversed=0; - LOG_I(PHY, "PBCH generation started\n"); + LOG_D(PHY, "PBCH generation started\n"); ///Payload generation memset((void *)pbch, 0, sizeof(NR_gNB_PBCH)); pbch->pbch_a=0; @@ -267,7 +267,7 @@ int nr_generate_pbch(NR_gNB_PBCH *pbch, else pbch->pbch_a |= ((config->sch_config.ssb_subcarrier_offset.value>>4)&1)<<29; //MSB of k_SSB (bit index 4) - LOG_I(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a); + LOG_D(PHY,"After extra byte: pbch_a = 0x%08x\n",pbch->pbch_a); // Payload interleaving diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index decb1a04bd..cbb9f56779 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -465,6 +465,8 @@ typedef struct gNB_L1_proc_t_s { pthread_t pthread_single; /// pthread structure for asychronous RX/TX processing thread pthread_t pthread_asynch_rxtx; + /// pthread structure for printing time meas + pthread_t L1_stats_thread; /// flag to indicate first RX acquisition int first_rx; /// flag to indicate first TX transmission diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index fdd8baea92..704bf91d06 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -196,7 +196,11 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, &gNB->pdcch_vars.dci_alloc[0], gNB->nr_gold_pdsch_dmrs[slot], gNB->common_vars.txdataF, - AMP, frame, slot, fp, cfg); + AMP, frame, slot, fp, cfg, + &gNB->dlsch_encoding_stats, + &gNB->dlsch_scrambling_stats, + &gNB->dlsch_modulation_stats); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0); } }