开源无线网络-OSRAN

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 205|回复: 0

将GPU耦合进OAI rfsim中

[复制链接]

42

主题

42

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2023-6-23 01:33:27 | 显示全部楼层 |阅读模式
编码部分
编码部分分为基站侧和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,如果能正常通信,则实验成功。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|OpenXG  

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.2

快速回复 返回顶部 返回列表