bigbing 发表于 2023-6-23 01:33:27

将GPU耦合进OAI rfsim中

编码部分编码部分分为基站侧和UE侧,两边都得替换为我们的GPU加速代码。进入ran/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c,将函数ldpc8blocks中208行的代码更换,结果如下:uint8_t tmp__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=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,

//                   llrProcBuf,

//                   ulsch_harq->p_nrLDPC_procBuf,

//                   p_procTime);

if(Kr<=640)

no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,

                   (int8_t *)&pl,

                   llrProcBuf,

                   ulsch_harq->p_nrLDPC_procBuf,

                   p_procTime);

else{

// printf("GPU Decode...\n");

gpu_LDPCDecode_single((int8_t*)&pl,

             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, llrProcBuf);

   if(Kr<=640)

    no_iteration_ldpc = nrLDPC_decoder(p_decoderParms,

                     (int8_t *)&pl,

                     llrProcBuf,

                     p_nrLDPC_procBuf,

                     p_procTime);

   else{

    // printf("GPU Decode...\n");

    gpu_LDPCDecode_single((int8_t*)&pl,

               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,如果能正常通信,则实验成功。
页: [1]
查看完整版本: 将GPU耦合进OAI rfsim中