Merge remote-tracking branch 'origin/dmrs_channel_estimation_parallelization' into integration_2024_w47 (!2972)
Parallelize PUSCH channel estimation This MR adds PUSCH channel estimation parallelization which reduces the processing time. It also adds time measurements for each antenna and makes num_antennas_per_thread configurable in nr_ulsim and the gNB config file. Some results: - **273 PRBs 4 antennas** `./nr_ulsim -n200 -m25 -s40 -S40 -q1 -R273 -r273 -z4 -P` | Number of threads | ULSCH channel estimation time (us) develop| ULSCH channel estimation time (us)| Antenna Processing time (us) | | ------ | ------ | ------ | ------ | | 0 | 194.06 |193.17 | 134.82| | 2 | 194.88 |154.02 | 93.43 | | 4 | 195.23 |134.27 | 72.71| - **273 PRBs 8 antennas** `./nr_ulsim -n200 -m25 -s40 -S40 -q1 -R273 -r273 -z8 -P` | Number of threads | ULSCH channel estimation time (us) develop| ULSCH channel estimation time (us)| Antenna Processing time (us) | | ------ | ------ | ------ | ------ | | 0 | 387.93 |384.99 | 269.39| | 2 | 388.10 |279.47 | 161.32| | 4 | 387.47 |225.37 | 106.52| | 8 | 390.53 |204.48 | 83.74| - **106 PRBs MIMO 4 layers** `./nr_ulsim -n100 -m9 -r106 -s10 -W4 -y4 -z4 -P` | Number of threads | ULSCH channel estimation time (us) develop| ULSCH channel estimation time (us)| Antenna Processing time (us) | | ------ | ------ | ------ | ------ | | 0 | 263.20 |268.97 | 57.49 | | 2 | 263.90 |252.61 | 51.22 | | 4 | 264.17 |192.49 | 36.29 |
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -543,6 +543,7 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
time_stats_t ulsch_decoding_stats;
|
time_stats_t ulsch_decoding_stats;
|
||||||
time_stats_t ulsch_deinterleaving_stats;
|
time_stats_t ulsch_deinterleaving_stats;
|
||||||
time_stats_t ulsch_channel_estimation_stats;
|
time_stats_t ulsch_channel_estimation_stats;
|
||||||
|
time_stats_t pusch_channel_estimation_antenna_processing_stats;
|
||||||
time_stats_t ulsch_llr_stats;
|
time_stats_t ulsch_llr_stats;
|
||||||
time_stats_t rx_srs_stats;
|
time_stats_t rx_srs_stats;
|
||||||
time_stats_t generate_srs_stats;
|
time_stats_t generate_srs_stats;
|
||||||
@@ -562,7 +563,10 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
notifiedFIFO_t L1_rx_out;
|
notifiedFIFO_t L1_rx_out;
|
||||||
notifiedFIFO_t resp_RU_tx;
|
notifiedFIFO_t resp_RU_tx;
|
||||||
tpool_t threadPool;
|
tpool_t threadPool;
|
||||||
|
int nbSymb;
|
||||||
|
int nbAarx;
|
||||||
int num_pusch_symbols_per_thread;
|
int num_pusch_symbols_per_thread;
|
||||||
|
int dmrs_num_antennas_per_thread;
|
||||||
pthread_t L1_rx_thread;
|
pthread_t L1_rx_thread;
|
||||||
int L1_rx_thread_core;
|
int L1_rx_thread_core;
|
||||||
pthread_t L1_tx_thread;
|
pthread_t L1_tx_thread;
|
||||||
@@ -585,6 +589,37 @@ union puschSymbolReqUnion {
|
|||||||
uint64_t p;
|
uint64_t p;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct puschAntennaProc_s {
|
||||||
|
unsigned char Ns;
|
||||||
|
int nl;
|
||||||
|
unsigned short p;
|
||||||
|
unsigned char symbol;
|
||||||
|
unsigned short bwp_start_subcarrier;
|
||||||
|
int aarx;
|
||||||
|
int beam_nb;
|
||||||
|
int numAntennas;
|
||||||
|
nfapi_nr_pusch_pdu_t *pusch_pdu;
|
||||||
|
int *max_ch;
|
||||||
|
c16_t *pilot;
|
||||||
|
int *nest_count;
|
||||||
|
uint64_t *noise_amp2;
|
||||||
|
delay_t *delay;
|
||||||
|
int chest_freq;
|
||||||
|
NR_gNB_PUSCH *pusch_vars;
|
||||||
|
NR_DL_FRAME_PARMS *frame_parms;
|
||||||
|
c16_t ***rxdataF;
|
||||||
|
} puschAntennaProc_t;
|
||||||
|
|
||||||
|
struct puschAntennaReqId {
|
||||||
|
uint16_t ul_id;
|
||||||
|
uint16_t spare;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
union puschAntennaReqUnion {
|
||||||
|
struct puschAntennaReqId s;
|
||||||
|
uint64_t p;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct LDPCDecode_s {
|
typedef struct LDPCDecode_s {
|
||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
NR_UL_gNB_HARQ_t *ulsch_harq;
|
NR_UL_gNB_HARQ_t *ulsch_harq;
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ int main(int argc, char *argv[])
|
|||||||
int params_from_file = 0;
|
int params_from_file = 0;
|
||||||
int threadCnt=0;
|
int threadCnt=0;
|
||||||
int max_ldpc_iterations = 5;
|
int max_ldpc_iterations = 5;
|
||||||
|
int num_antennas_per_thread = 1;
|
||||||
if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == 0) {
|
if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == 0) {
|
||||||
exit_fun("[NR_ULSIM] Error, configuration module init failed\n");
|
exit_fun("[NR_ULSIM] Error, configuration module init failed\n");
|
||||||
}
|
}
|
||||||
@@ -224,7 +225,7 @@ int main(int argc, char *argv[])
|
|||||||
InitSinLUT();
|
InitSinLUT();
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) {
|
while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:A:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) {
|
||||||
|
|
||||||
/* ignore long options starting with '--', option '-O' and their arguments that are handled by configmodule */
|
/* ignore long options starting with '--', option '-O' and their arguments that are handled by configmodule */
|
||||||
/* with this opstring getopt returns 1 for non-option arguments, refer to 'man 3 getopt' */
|
/* with this opstring getopt returns 1 for non-option arguments, refer to 'man 3 getopt' */
|
||||||
@@ -395,6 +396,10 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'A':
|
||||||
|
num_antennas_per_thread = atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
case 'F':
|
case 'F':
|
||||||
input_fd = fopen(optarg, "r");
|
input_fd = fopen(optarg, "r");
|
||||||
if (input_fd == NULL) {
|
if (input_fd == NULL) {
|
||||||
@@ -512,6 +517,7 @@ int main(int argc, char *argv[])
|
|||||||
printf("-w Start PRB for PUSCH\n");
|
printf("-w Start PRB for PUSCH\n");
|
||||||
printf("-y Number of TX antennas used at UE\n");
|
printf("-y Number of TX antennas used at UE\n");
|
||||||
printf("-z Number of RX antennas used at gNB\n");
|
printf("-z Number of RX antennas used at gNB\n");
|
||||||
|
printf("-A Number of antennas per thread for PUSCH channel estimation\n");
|
||||||
printf("-C Specify the number of threads for the simulation\n");
|
printf("-C Specify the number of threads for the simulation\n");
|
||||||
printf("-E {SRS: [0] Disabled, [1] Enabled} e.g. -E 1\n");
|
printf("-E {SRS: [0] Disabled, [1] Enabled} e.g. -E 1\n");
|
||||||
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
printf("-F Input filename (.txt format) for RX conformance testing\n");
|
||||||
@@ -559,6 +565,7 @@ int main(int argc, char *argv[])
|
|||||||
gNB = RC.gNB[0];
|
gNB = RC.gNB[0];
|
||||||
gNB->ofdm_offset_divisor = UINT_MAX;
|
gNB->ofdm_offset_divisor = UINT_MAX;
|
||||||
gNB->num_pusch_symbols_per_thread = 1;
|
gNB->num_pusch_symbols_per_thread = 1;
|
||||||
|
gNB->dmrs_num_antennas_per_thread = num_antennas_per_thread;
|
||||||
gNB->RU_list[0] = calloc(1, sizeof(**gNB->RU_list));
|
gNB->RU_list[0] = calloc(1, sizeof(**gNB->RU_list));
|
||||||
gNB->RU_list[0]->rfdevice.openair0_cfg = openair0_cfg;
|
gNB->RU_list[0]->rfdevice.openair0_cfg = openair0_cfg;
|
||||||
|
|
||||||
@@ -952,6 +959,7 @@ int main(int argc, char *argv[])
|
|||||||
reset_meas(&gNB->rx_pusch_symbol_processing_stats);
|
reset_meas(&gNB->rx_pusch_symbol_processing_stats);
|
||||||
reset_meas(&gNB->ulsch_decoding_stats);
|
reset_meas(&gNB->ulsch_decoding_stats);
|
||||||
reset_meas(&gNB->ulsch_channel_estimation_stats);
|
reset_meas(&gNB->ulsch_channel_estimation_stats);
|
||||||
|
reset_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
|
||||||
reset_meas(&gNB->rx_srs_stats);
|
reset_meas(&gNB->rx_srs_stats);
|
||||||
reset_meas(&gNB->generate_srs_stats);
|
reset_meas(&gNB->generate_srs_stats);
|
||||||
reset_meas(&gNB->get_srs_signal_stats);
|
reset_meas(&gNB->get_srs_signal_stats);
|
||||||
@@ -1512,6 +1520,7 @@ int main(int argc, char *argv[])
|
|||||||
printDistribution(&gNB->phy_proc_rx,table_rx, "Total PHY proc rx");
|
printDistribution(&gNB->phy_proc_rx,table_rx, "Total PHY proc rx");
|
||||||
printStatIndent(&gNB->rx_pusch_stats, "RX PUSCH time");
|
printStatIndent(&gNB->rx_pusch_stats, "RX PUSCH time");
|
||||||
printStatIndent2(&gNB->ulsch_channel_estimation_stats, "ULSCH channel estimation time");
|
printStatIndent2(&gNB->ulsch_channel_estimation_stats, "ULSCH channel estimation time");
|
||||||
|
printStatIndent3(&gNB->pusch_channel_estimation_antenna_processing_stats, "Antenna Processing time");
|
||||||
printStatIndent2(&gNB->rx_pusch_init_stats, "RX PUSCH Initialization time");
|
printStatIndent2(&gNB->rx_pusch_init_stats, "RX PUSCH Initialization time");
|
||||||
printStatIndent2(&gNB->rx_pusch_symbol_processing_stats, "RX PUSCH Symbol Processing time");
|
printStatIndent2(&gNB->rx_pusch_symbol_processing_stats, "RX PUSCH Symbol Processing time");
|
||||||
printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
|
printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
|
||||||
|
|||||||
@@ -59,6 +59,8 @@
|
|||||||
#define HLP_L1TX_BO "Backoff from full-scale output at the L1 entity(frequency domain), ex. 12 would corresponding to 14-bit input level (6 dB/bit). Default 36 dBFS for OAI RU entity"
|
#define HLP_L1TX_BO "Backoff from full-scale output at the L1 entity(frequency domain), ex. 12 would corresponding to 14-bit input level (6 dB/bit). Default 36 dBFS for OAI RU entity"
|
||||||
#define CONFIG_STRING_L1_PHASE_COMP "phase_compensation"
|
#define CONFIG_STRING_L1_PHASE_COMP "phase_compensation"
|
||||||
#define HLP_L1_PHASE_COMP "Apply NR symbolwise phase rotation"
|
#define HLP_L1_PHASE_COMP "Apply NR symbolwise phase rotation"
|
||||||
|
#define CONFIG_STRING_NUM_ANTENNAS_PER_THREAD "dmrs_num_antennas_per_thread"
|
||||||
|
#define HLP_NUM_ARX "Number of antennas per thread for PUSCH channel estimation"
|
||||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
/* L1 configuration parameters */
|
/* L1 configuration parameters */
|
||||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||||
@@ -84,6 +86,7 @@
|
|||||||
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
|
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
|
||||||
{CONFIG_STRING_L1_TX_AMP_BACKOFF_dB, HLP_L1TX_BO,0, .uptr=NULL, .defintval=36, TYPE_UINT, 0}, \
|
{CONFIG_STRING_L1_TX_AMP_BACKOFF_dB, HLP_L1TX_BO,0, .uptr=NULL, .defintval=36, TYPE_UINT, 0}, \
|
||||||
{CONFIG_STRING_L1_PHASE_COMP, HLP_L1_PHASE_COMP,PARAMFLAG_BOOL, .uptr=NULL,.defintval=1, TYPE_UINT, 0}, \
|
{CONFIG_STRING_L1_PHASE_COMP, HLP_L1_PHASE_COMP,PARAMFLAG_BOOL, .uptr=NULL,.defintval=1, TYPE_UINT, 0}, \
|
||||||
|
{CONFIG_STRING_NUM_ANTENNAS_PER_THREAD, HLP_NUM_ARX,0, .uptr=NULL, .defintval=1, TYPE_UINT, 0}, \
|
||||||
}
|
}
|
||||||
// clang-format on
|
// clang-format on
|
||||||
#define L1_CC_IDX 0
|
#define L1_CC_IDX 0
|
||||||
@@ -105,6 +108,7 @@
|
|||||||
#define L1_TX_THREAD_CORE 16
|
#define L1_TX_THREAD_CORE 16
|
||||||
#define L1_TX_AMP_BACKOFF_dB 17
|
#define L1_TX_AMP_BACKOFF_dB 17
|
||||||
#define L1_PHASE_COMP 18
|
#define L1_PHASE_COMP 18
|
||||||
|
#define NUM_ANTENNAS_PER_THREAD 19
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -914,6 +914,7 @@ void RCconfig_NR_L1(void)
|
|||||||
LOG_I(NR_PHY, "L1_RX_THREAD_CORE %d (%d)\n", *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr), L1_RX_THREAD_CORE);
|
LOG_I(NR_PHY, "L1_RX_THREAD_CORE %d (%d)\n", *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr), L1_RX_THREAD_CORE);
|
||||||
gNB->TX_AMP = (int16_t)(32767.0 / pow(10.0, .05 * (double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr)));
|
gNB->TX_AMP = (int16_t)(32767.0 / pow(10.0, .05 * (double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr)));
|
||||||
gNB->phase_comp = *L1_ParamList.paramarray[j][L1_PHASE_COMP].uptr;
|
gNB->phase_comp = *L1_ParamList.paramarray[j][L1_PHASE_COMP].uptr;
|
||||||
|
gNB->dmrs_num_antennas_per_thread = *(L1_ParamList.paramarray[j][NUM_ANTENNAS_PER_THREAD].uptr);
|
||||||
LOG_I(NR_PHY, "TX_AMP = %d (-%d dBFS)\n", gNB->TX_AMP, *L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr);
|
LOG_I(NR_PHY, "TX_AMP = %d (-%d dBFS)\n", gNB->TX_AMP, *L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr);
|
||||||
AssertFatal(gNB->TX_AMP > 300, "TX_AMP is too small, must be larger than 300 (is %d)\n", gNB->TX_AMP);
|
AssertFatal(gNB->TX_AMP > 300, "TX_AMP is too small, must be larger than 300 (is %d)\n", gNB->TX_AMP);
|
||||||
// Midhaul configuration
|
// Midhaul configuration
|
||||||
|
|||||||
Reference in New Issue
Block a user