Commit daecbbbf authored by root's avatar root

bug fixes and performance improvements

parent 9e1b1064
......@@ -157,7 +157,7 @@ typedef struct {
/// Turbo-code outputs (36-212 V8.6 2009-03, p.12
uint8_t *d[MAX_NUM_DLSCH_SEGMENTS];//[(96+3+(3*6144))];
/// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17)
uint8_t w[MAX_NUM_DLSCH_SEGMENTS][3*6144];
uint8_t w[MAX_NUM_DLSCH_SEGMENTS][3*8448] __attribute__((aligned(32)));
/// Number of code segments (for definition see 36-212 V8.6 2009-03, p.9)
uint32_t C;
/// Number of "small" code segments (for definition see 36-212 V8.6 2009-03, p.10)
......
......@@ -62,7 +62,7 @@
extern int codingw;
uint8_t segments_per_worker[9][3] = {{1,0,0},{2,0,0},{3,0,0},{2,4,0},{2,5,0},{3,6,0},{2,4,7},{2,5,8},{3,6,9}};
uint16_t segments_per_worker[9][3] = {{1,0,0},{2,0,0},{2,3,0},{2,4,0},{2,4,5},{2,4,6},{2,4,7},{2,5,8},{3,6,9}};
void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
{
......@@ -524,10 +524,12 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
stop_meas(&eNB->dlsch_turbo_encoding_segmentation_stats);
if (dlsch->harq_processes[harq_pid]->C >= 7) worker_num=2;
else if (dlsch->harq_processes[harq_pid]->C >=4) worker_num=1;
if (dlsch->harq_processes[harq_pid]->C >= 6) worker_num=2;
else if (dlsch->harq_processes[harq_pid]->C >=3) worker_num=1;
else worker_num=0;
//LOG_I(PHY,"dlsch_encoding (round 0): C=%d, worker_num=%d\n",dlsch->harq_processes[harq_pid]->C,worker_num);
start_meas(&eNB->dlsch_turbo_encoding_signal_stats);
for(int i=0;i<worker_num;i++)
{
......@@ -614,7 +616,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
else
Kr_int = Kr;
for (r0=0,r=segments_per_worker[dlsch->harq_processes[harq_pid]->C-1][worker_num-1]; r<dlsch->harq_processes[harq_pid]->C; r++,r0++) {
for (r0=0,r=(worker_num==0 ? 0 : segments_per_worker[dlsch->harq_processes[harq_pid]->C-1][worker_num-1]); r<dlsch->harq_processes[harq_pid]->C; r++,r0++) {
memset(dlsch->harq_processes[harq_pid]->d[r],0,(96+12+3+3*8448)*sizeof(uint8_t));
c_tmp[r0] = &dlsch->harq_processes[harq_pid]->c[r][0];
d_tmp[r0] = &dlsch->harq_processes[harq_pid]->d[r][96];
......@@ -625,7 +627,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
stop_meas(te_stats);
start_meas(i_stats);
for (r=segments_per_worker[dlsch->harq_processes[harq_pid]->C-1][worker_num-1]; r<dlsch->harq_processes[harq_pid]->C; r++) {
for (r=(worker_num==0 ? 0 : segments_per_worker[dlsch->harq_processes[harq_pid]->C-1][worker_num-1]); r<dlsch->harq_processes[harq_pid]->C; r++) {
dlsch->harq_processes[harq_pid]->RTC[r] =
sub_block_interleaving_turbo((Kr_int),
&dlsch->harq_processes[harq_pid]->d[r][96],
......@@ -637,6 +639,12 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
}
else {
if (dlsch->harq_processes[harq_pid]->C >= 6) worker_num=2;
else if (dlsch->harq_processes[harq_pid]->C >=3) worker_num=1;
else worker_num=0;
//LOG_I(PHY,"dlsch_encoding (round >0): C=%d, worker_num=%d\n",dlsch->harq_processes[harq_pid]->C,worker_num);
for(int i=0;i<worker_num;i++)
{
proc->tep[i].eNB = eNB;
......@@ -658,7 +666,7 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
for (r=0,r_offset=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
// get information for E for the segments that are handled by the worker thread
if (r<segments_per_worker[dlsch->harq_processes[harq_pid]->C-1][worker_num-1]) {
if (r<(worker_num==0 ? 0 : segments_per_worker[dlsch->harq_processes[harq_pid]->C-1][worker_num-1])) {
int Nl=dlsch->harq_processes[harq_pid]->Nl;
int Qm=dlsch->harq_processes[harq_pid]->Qm;
int C = dlsch->harq_processes[harq_pid]->C;
......@@ -733,26 +741,7 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
time_stats_t *i_stats)
{
int encoding_return = 0;
/*
unsigned int L,C,B;
B = dlsch->harq_processes[dlsch->harq_ids[subframe]]->B;
if(B<=8448)
{
L=0;
C=1;
}
else
{
L=24;
C = B/(8448-L);
if((8448-L)*C < B)
{
C = C+1;
}
}
*/
//if(C >= 8 && get_nprocs()>=8 && codingw)//one main three worker
{
encoding_return =
dlsch_encoding_2threads(eNB,
a,
......@@ -768,47 +757,7 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
te_wakeup_stats1,
i_stats,
3);
}
/*
if(C >= 7 && get_nprocs()>=6 && codingw)//one main two worker
{
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
2);
}
else if(C >= 4 && get_nprocs()>=4 && codingw)//one main one worker
{
encoding_return =
dlsch_encoding_2threads(eNB,
a,
num_pdcch_symbols,
dlsch,
frame,
subframe,
rm_stats,
te_stats,
te_wait_stats,
te_main_stats,
te_wakeup_stats0,
te_wakeup_stats1,
i_stats,
1);
}
else
{
printf("what? C=%d, nproc=%d, codingw=%d\n",C,get_nprocs(),codingw);
/*
encoding_return =
dlsch_encoding(eNB,
a,
......@@ -819,8 +768,7 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
rm_stats,
te_stats,
i_stats);
}
*/
*/
return encoding_return;
}
......
......@@ -582,7 +582,7 @@ void schedule_response(Sched_Rsp_t *Sched_INFO)
eNB = RC.eNB[Mod_id][CC_id];
fp = &eNB->frame_parms;
proc = &eNB->proc.proc_rxtx[0];
proc = &eNB->proc.proc_rxtx[1];
ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe);
......
......@@ -520,6 +520,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
harq_pid = dlsch0->harq_ids[subframe];
if ((harq_pid>=0) && (harq_pid<8)) {
// generate pdsch
LOG_I(PHY,"subframe %d: harq_pid %d: generating PDSCH\n",subframe,harq_pid);
pdsch_procedures(eNB,
proc,
harq_pid,
......@@ -528,7 +529,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
&eNB->UE_stats[(uint32_t)UE_id],
0);
} else {
LOG_E(PHY,"harq_pid %d is not valid, not generating PDSCH\n",harq_pid);
LOG_E(PHY,"subframe %d: harq_pid %d is not valid, not generating PDSCH\n",subframe,harq_pid);
}
}
......
......@@ -71,7 +71,7 @@ schedule_ue_spec_phy_test(
uint16_t rnti = 0x1235;
uint32_t rb_alloc = 0x1FFFFFFF;
int32_t tpc = 1;
int32_t mcs = 6;
int32_t mcs = 15;
int32_t cqi = 15;
int32_t ndi = subframeP/5;
int32_t dai = 0;
......
......@@ -138,7 +138,8 @@ void handle_ulsch(UL_IND_t *UL_info) {
} //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
// UL_info->rx_ind.rx_pdu_list[i].rx_ue_information.rnti) {
} // for (j=0;j<UL_info->crc_ind.number_of_crcs;j++) {
AssertFatal(j<UL_info->crc_ind.number_of_crcs,"Couldn't find matchin CRC indication\n");
//AssertFatal(j<UL_info->crc_ind.number_of_crcs,"Couldn't find matchin CRC indication\n");
LOG_W(MAC,"Couldn't find matchin CRC indication\n");
} // for (i=0;i<UL_info->rx_ind.number_of_pdus;i++) {
UL_info->rx_ind.number_of_pdus=0;
......
[*]
[*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI
[*] Fri Nov 3 16:03:52 2017
[*] Wed Feb 21 13:06:28 2018
[*]
[dumpfile] "/tmp/openair_dump_eNB.vcd"
[dumpfile_mtime] "Fri Nov 3 16:00:30 2017"
[dumpfile_size] 56765827
[savefile] "/homes/wangts/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw"
[timestart] 15220241000
[size] 1920 1018
[dumpfile_mtime] "Wed Feb 21 13:03:32 2018"
[dumpfile_size] 745020518
[savefile] "/home/tct-labo4/dev/oai_gNB_mwc18_integration/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw"
[timestart] 79635579000
[size] 1855 1018
[pos] 0 22
*-19.666586 15221741584 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
*-19.666586 79639241598 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
[sst_width] 386
[signals_width] 302
[sst_expanded] 1
......@@ -35,10 +35,12 @@ functions.phy_eNB_ofdm_mod_l
@24
variables.frame_number_RX0_eNB[63:0]
variables.frame_number_TX0_eNB[63:0]
@25
variables.frame_number_RX1_eNB[63:0]
@420
variables.subframe_number_TX0_eNB[63:0]
@24
variables.frame_number_RX1_eNB[63:0]
variables.frame_number_TX1_eNB[63:0]
variables.subframe_number_TX1_eNB[63:0]
@28
functions.phy_eNB_dlsch_modulation
functions.phy_eNB_dlsch_encoding
......@@ -57,6 +59,9 @@ functions.phy_procedures_ru_feptx_ofdm0
functions.phy_procedures_ru_feptx_ofdm1
functions.phy_procedures_ru_feptx_prec0
functions.phy_procedures_ru_feptx_prec1
@29
functions.eNB_thread_rxtx0
@28
functions.eNB_thread_rxtx1
functions.phy_enb_sfgen
functions.phy_enb_prach_rx
......
......@@ -173,6 +173,14 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
// UE-specific RX processing for subframe n
phy_procedures_eNB_uespec_RX(eNB, proc, no_relay );
if(get_nprocs() >= 8)
{
wakeup_tx(eNB,eNB->proc.ru_proc);
}
else if(get_nprocs() > 4)
{
if(oai_exit) return(-1);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
pthread_mutex_lock(&eNB->UL_INFO_mutex);
......@@ -184,14 +192,6 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
if(get_nprocs() >= 8)
{
wakeup_tx(eNB,eNB->proc.ru_proc);
}
else if(get_nprocs() > 4)
{
if(oai_exit) return(-1);
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
wakeup_txfh(proc,eNB->proc.ru_proc);
......@@ -234,6 +234,18 @@ static void* tx_thread(void* param) {
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB,proc->frame_tx);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,proc->frame_rx);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
pthread_mutex_lock(&eNB->UL_INFO_mutex);
eNB->UL_INFO.frame = proc->frame_rx;
eNB->UL_INFO.subframe = proc->subframe_rx;
eNB->UL_INFO.module_id = eNB->Mod_id;
eNB->UL_INFO.CC_id = eNB->CC_id;
eNB->if_inst->UL_indication(&eNB->UL_INFO);
pthread_mutex_unlock(&eNB->UL_INFO_mutex);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
phy_procedures_eNB_TX(eNB, proc, no_relay, NULL, 1);
if (release_thread(&proc->mutex_rxtx,&proc->instance_cnt_rxtx,thread_name)<0) break;
......@@ -366,6 +378,15 @@ int wakeup_txfh(eNB_rxtx_proc_t *proc,RU_proc_t *ru_proc) {
wait.tv_nsec=5000000L;
if (ru_proc->instance_cnt_eNBs == 0) {
usleep(50);
}
if (ru_proc->instance_cnt_eNBs == 0) {
LOG_E(PHY,"Frame %d, subframe %d: TX FH thread busy, dropping\n",proc->frame_tx,proc->subframe_tx);
return(-1);
}
if (pthread_mutex_timedlock(&ru_proc->mutex_eNBs,&wait) != 0) {
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX1 thread %d (IC %d)\n", ru_proc->subframe_rx&1,ru_proc->instance_cnt_eNBs );
exit_fun( "error locking mutex_eNB" );
......@@ -404,6 +425,10 @@ int wakeup_tx(PHY_VARS_eNB *eNB,RU_proc_t *ru_proc) {
wait.tv_sec=0;
wait.tv_nsec=5000000L;
if (proc_rxtx1->instance_cnt_rxtx == 0) {
usleep(50);
}
if (proc_rxtx1->instance_cnt_rxtx == 0) {
LOG_E(PHY,"Frame %d, subframe %d: TX1 thread busy, dropping\n",proc_rxtx1->frame_rx,proc_rxtx1->subframe_rx);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,++num_busy);
......@@ -479,6 +504,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
if (proc_rxtx->instance_cnt_rxtx == 0) {
usleep(50);
}
if (proc_rxtx->instance_cnt_rxtx == 0) {
LOG_E(PHY,"Frame %d, subframe %d: RXTX0 thread busy, dropping\n",proc_rxtx->frame_rx,proc_rxtx->subframe_rx);
return(-1);
......
......@@ -1433,8 +1433,8 @@ static void* ru_thread_tx( void* param ) {
if (oai_exit) break;
LOG_D(PHY,"ru_thread_tx: Waiting for TX processing\n");
// wait until eNBs are finished subframe RX n and TX n+4
LOG_D(PHY,"ru_thread_tx: Waiting for TX processing\n");
// wait until eNBs are finished subframe RX n and TX n+4
wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread_tx");
// do TX front-end processing if needed (precoding and/or IDFTs)
......
......@@ -171,8 +171,8 @@ static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
//char rf_config_file[1024];
//char rf_config_file[1024]="./targets/ARCH/gNB.ini";
//FIXME!
//char rf_config_file[1024]="./targets/ARCH/ADRV9371_ZC706/USERSPACE/PROFILES/gnb.band7.tm1.PRB100.NR80.adrv9371-zc706_HWgain15dB.ini";
char rf_config_file[1024]="./targets/ARCH/ADRV9371_ZC706/USERSPACE/PROFILES/gnb.band7.tm1.PRB100.adrv9371-zc706_HWgain15dB.ini";
char rf_config_file[1024]="./targets/ARCH/ADRV9371_ZC706/USERSPACE/PROFILES/gnb.band7.tm1.PRB100.NR80.adrv9371-zc706_HWgain15dB.ini";
//char rf_config_file[1024]="./targets/ARCH/ADRV9371_ZC706/USERSPACE/PROFILES/gnb.band7.tm1.PRB100.adrv9371-zc706_HWgain15dB.ini";
int chain_offset=0;
int phy_test = 0;
......
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