编码部分 编码部分分为基站侧和UE侧,两边都得替换为我们的GPU加速代码。进入ran/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c,将函数ldpc8blocks中208行的代码更换,结果如下: uint8_t tmp[8][68 * 384]__attribute__((aligned(32)));
for (int rr=impp->macro_num*8, i=0; rr < impp->n_segments && rr < (impp->macro_num+1)*8; rr++,i++ )
impp->d[rr]=tmp;
if(impp->Kb<10)
nrLDPC_encoder(harq->c,impp->d,*impp->Zc, impp->Kb,Kr,impp->BG,impp);
else{
// printf("GPU Encode start :...\n");
gpu_LDPCEncode_8block(harq->c,impp->d,*impp->Zc,impp->Kb,Kr, impp->BG,impp->macro_num, impp->n_segments);
}
// Compute where to place in output buffer that is concatenation of all segments
uint32_t r_offset=0;
然后是 UE侧,进入ran/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c,397行改为:
impp.macro_num = j;
if(Kb<10)
nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp);
else{
// printf("GPU Encode start :...\n");
gpu_LDPCEncode_8block(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,impp.macro_num, impp.n_segments);
}然后是 UE侧,进入ran/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c,397行改为:
impp.macro_num = j;
if(Kb<10)
nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp);
else{
// printf("GPU Encode start :...\n");
gpu_LDPCEncode_8block(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,impp.macro_num, impp.n_segments);
}
由于GPU不支持Kb小于10的情况,所以在编译码要分情况运行。 6.2 译码部分同样也分为基站侧和UE侧,先是基站侧,进入 ran/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c,将382行代码改为如下形式: ////////////////////////////////// pl =====> llrProcBuf //////////////////////////////////
// no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
// (int8_t*)&pl[0],
// llrProcBuf,
// ulsch_harq->p_nrLDPC_procBuf[r],
// p_procTime);
if(Kr<=640)
no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
(int8_t *)&pl[0],
llrProcBuf,
ulsch_harq->p_nrLDPC_procBuf[r],
p_procTime);
else{
// printf("GPU Decode...\n");
gpu_LDPCDecode_single((int8_t*)&pl[0],
llrProcBuf,
p_decoderParms->BG,
Kr/p_decoderParms->Z,
p_decoderParms->Z,
p_decoderParms->Coderate,
p_decoderParms->numMaxIter,
Kr,
"BPSK");
}
随后是UE侧,进入ran/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c中410行,将代码修改为如下形式
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
p_decoderParms->block_length=length_dec;
nrLDPC_initcall(p_decoderParms, (int8_t*)&pl[0], llrProcBuf);
if(Kr<=640)
no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,
(int8_t *)&pl[0],
llrProcBuf,
p_nrLDPC_procBuf[r],
p_procTime);
else{
// printf("GPU Decode...\n");
gpu_LDPCDecode_single((int8_t*)&pl[0],
llrProcBuf,
p_decoderParms->BG,
Kr/p_decoderParms->Z,
p_decoderParms->Z,
p_decoderParms->Coderate,
p_decoderParms->numMaxIter,
Kr,
"BPSK");
}
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
OAI中的码率是以一个整数表示,比如13就代表1/3,15就是1/5,因此我们需要在结构体p_decoderParms中加入一个double变量表示该码率,随后在 nr_dlsch_decoding.c的560行和nr_ulsch_decoding.c的511行将代码改为如下形式: if (Coderate < 0.3333) {
p_decParams->R = 15;
p_decParams->Coderate = 1.0/5;
} else if (Coderate <0.6667) {
p_decParams->R = 13;
p_decParams->Coderate = 1.0/3;
} else {
p_decParams->R = 23;
p_decParams->Coderate = 2.0/3;
}
} else {
p_decParams->BG = 1;
kc = 68;
if (Coderate < 0.6667) {
p_decParams->R = 13;
p_decParams->Coderate = 1.0/3;
} else if (Coderate <0.8889) {
p_decParams->R = 23;
p_decParams->Coderate = 2.0/3;
} else {
p_decParams->R = 89;
p_decParams->Coderate = 8.0/9;
}
}
最后运行基站和UE,如果能正常通信,则实验成功。
|