degradation of performance in BLER corrected | bnProc & bnProcPc unrolled

This commit is contained in:
Sy
2020-07-01 14:12:53 +02:00
parent 5e5bc1a9e3
commit 0f704894f4
41 changed files with 3902 additions and 6695 deletions
@@ -1,4 +1,3 @@
/* /*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
@@ -35,7 +34,7 @@
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
| cn processing files -->AVX512 | cn processing files -->AVX512
/----------------------------------------------------------------------*/ /----------------------------------------------------------------------*/
//BG1------------------------------------------------------------------- //BG1-------------------------------------------------------------------
@@ -53,7 +52,7 @@
#else #else
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
| cn Processing files -->AVX2 | cn Processing files -->AVX2
/----------------------------------------------------------------------*/ /----------------------------------------------------------------------*/
//BG1------------------------------------------------------------------ //BG1------------------------------------------------------------------
@@ -68,7 +67,7 @@
#endif #endif
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
| bn Processing files -->AVX2 | bn Processing files -->AVX2
/----------------------------------------------------------------------*/ /----------------------------------------------------------------------*/
//bnProcPc------------------------------------------------------------- //bnProcPc-------------------------------------------------------------
@@ -94,6 +93,9 @@
#define NR_LDPC_ENABLE_PARITY_CHECK #define NR_LDPC_ENABLE_PARITY_CHECK
#define NR_LDPC_PROFILER_DETAIL #define NR_LDPC_PROFILER_DETAIL
@@ -179,7 +181,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
#endif #endif
if (BG == 1) if (BG == 1)
{ {
nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, p_procBuf, Z); nrLDPC_llr2CnProcBuf_BG1(p_lut, p_llr, p_procBuf, Z);
} }
else else
{ {
@@ -217,8 +219,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
case 23: case 23:
{ {
#ifdef __AVX512BW__ #ifdef __AVX512BW__
nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z);
//nrLDPC_cnProc_BG1_R13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
#else #else
nrLDPC_cnProc_BG1_R23_AVX2(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); nrLDPC_cnProc_BG1_R23_AVX2(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z);
#endif #endif
@@ -236,7 +237,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
@@ -272,7 +273,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
} }
} }
}//end of else }
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
stop_meas(&p_profiler->cnProc); stop_meas(&p_profiler->cnProc);
#endif #endif
@@ -315,47 +316,47 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
{ {
case 13: case 13:
{ {
nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 89: case 89:
{ {
nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
{ {
case 15: case 15:
{ {
nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 13: case 13:
{ {
nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
} }
}//end of else }
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
@@ -370,9 +371,9 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
start_meas(&p_profiler->bnProc); start_meas(&p_profiler->bnProc);
#endif #endif
nrLDPC_bnProc(p_lut, p_procBuf, Z); // nrLDPC_bnProc(p_lut, p_procBuf, Z);
/*
if (BG==1) if (BG==1)
{ {
switch (R) switch (R)
@@ -393,7 +394,7 @@ if (BG==1)
break; break;
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
@@ -404,23 +405,23 @@ if (BG==1)
break; break;
} }
case 13: case 13:
{ {
nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z);
break; break;
} }
} }
}//end of else }
*/
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
stop_meas(&p_profiler->bnProc); stop_meas(&p_profiler->bnProc);
#endif #endif
@@ -500,7 +501,7 @@ if (BG==1)
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
@@ -536,7 +537,7 @@ if (BG==1)
} }
} }
}//end of else }
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
stop_meas(&p_profiler->cnProc); stop_meas(&p_profiler->cnProc);
#endif #endif
@@ -577,47 +578,47 @@ if (BG==1)
{ {
case 13: case 13:
{ {
nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 89: case 89:
{ {
nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
{ {
case 15: case 15:
{ {
nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 13: case 13:
{ {
nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
} }
}//end of else }
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
@@ -631,8 +632,8 @@ if (BG==1)
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
start_meas(&p_profiler->bnProc); start_meas(&p_profiler->bnProc);
#endif #endif
nrLDPC_bnProc(p_lut, p_procBuf, Z); // nrLDPC_bnProc(p_lut, p_procBuf, Z);
/*
if (BG==1) if (BG==1)
{ {
switch (R) switch (R)
@@ -653,7 +654,7 @@ if (BG==1)
break; break;
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
@@ -664,23 +665,23 @@ if (BG==1)
break; break;
} }
case 13: case 13:
{ {
nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z);
break; break;
} }
} }
}//end of else }
*/
@@ -759,7 +760,6 @@ if (BG==1)
{ {
#ifdef __AVX512BW__ #ifdef __AVX512BW__
nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); nrLDPC_cnProc_BG1_R23_AVX512(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z);
//nrLDPC_cnProc_BG1_R13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
#else #else
nrLDPC_cnProc_BG1_R23_AVX2(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z); nrLDPC_cnProc_BG1_R23_AVX2(p_procBuf->cnProcBuf, p_procBuf->cnProcBufRes, Z);
#endif #endif
@@ -777,7 +777,7 @@ if (BG==1)
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
@@ -813,7 +813,7 @@ if (BG==1)
} }
} }
}//end of else }
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
stop_meas(&p_profiler->cnProc); stop_meas(&p_profiler->cnProc);
#endif #endif
@@ -854,47 +854,47 @@ if (BG==1)
{ {
case 13: case 13:
{ {
nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 89: case 89:
{ {
nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG1_R89_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
{ {
case 15: case 15:
{ {
nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R15_AVX2(p_procBuf->bnProcBuf, p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 13: case 13:
{ {
nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R13_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z); nrLDPC_bnProcPc_BG2_R23_AVX2(p_procBuf->bnProcBuf,p_procBuf->llrRes, p_procBuf->llrProcBuf, Z);
break; break;
} }
} }
}//end of else }
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
@@ -912,9 +912,9 @@ if (BG==1)
start_meas(&p_profiler->bnProc); start_meas(&p_profiler->bnProc);
#endif #endif
nrLDPC_bnProc(p_lut, p_procBuf, Z); //nrLDPC_bnProc(p_lut, p_procBuf, Z);
/*
if (BG==1) if (BG==1)
{ {
switch (R) switch (R)
@@ -935,7 +935,7 @@ if (BG==1)
break; break;
} }
} }
} //end if }
else else
{ {
switch (R) switch (R)
@@ -946,23 +946,23 @@ if (BG==1)
break; break;
} }
case 13: case 13:
{ {
nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); nrLDPC_bnProc_BG2_R13_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z);
break; break;
} }
case 23: case 23:
{ {
nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z); nrLDPC_bnProc_BG2_R23_AVX2(p_procBuf->bnProcBuf, p_procBuf->bnProcBufRes,p_procBuf->llrRes, Z);
break; break;
} }
} }
} }
*/
#ifdef NR_LDPC_PROFILER_DETAIL #ifdef NR_LDPC_PROFILER_DETAIL
@@ -1053,3 +1053,4 @@ if (BG==1)
@@ -1,4 +1,3 @@
/* /*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with * contributor license agreements. See the NOTICE file distributed with
@@ -22,7 +21,7 @@
/*!\file nrLDPC_mPass.h /*!\file nrLDPC_mPass.h
* \brief Defines the functions for message passing * \brief Defines the functions for message passing
* *
*/ */
#ifndef __NR_LDPC_MPASS__H__ #ifndef __NR_LDPC_MPASS__H__
#define __NR_LDPC_MPASS__H__ #define __NR_LDPC_MPASS__H__
@@ -42,7 +41,7 @@
\param Z Lifting size \param Z Lifting size
\param cshift Circular shift \param cshift Circular shift
*/ */
//more faster memcpy by using "rep movsb", which on modern processors is highly optimized //more faster memcpy by using "rep movsb", which on modern processors is highly optimized
void *memcpy1(void *dst, const void *src, size_t n) void *memcpy1(void *dst, const void *src, size_t n)
{ {
@@ -177,8 +176,7 @@ static inline void nrLDPC_llr2CnProcBuf_BG1(t_nrLDPC_lut* p_lut, int8_t* llr, t_
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX;
// #pragma omp simd
// #pragma omp parallel for schedule(dynamic)
for (j=0; j<3; j++) for (j=0; j<3; j++)
{ {
@@ -1026,7 +1024,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 3 BNs // CN group with 3 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX;
// #pragma omp simd
for (j=0;j<2; j++) for (j=0;j<2; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[0] + j*bitOffsetInGroup];
@@ -1037,11 +1035,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 4 BNs // CN group with 4 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX;
// #pragma omp simd
for (j=0; j<3; j++) for (j=0; j<3; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[1] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[1]; i++) for (i=0; i<lut_numCnInCnGroups[1]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG4[j][i] + lut_bnPosBnProcBuf_CNG4[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG4[j][i] + lut_bnPosBnProcBuf_CNG4[j][i]*Z;
@@ -1053,11 +1051,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 5 BNs // CN group with 5 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX;
// #pragma omp simd
for (j=0; j<4; j++) for (j=0; j<4; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[2] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[2] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[2]; i++) for (i=0; i<lut_numCnInCnGroups[2]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG5[j][i] + lut_bnPosBnProcBuf_CNG5[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG5[j][i] + lut_bnPosBnProcBuf_CNG5[j][i]*Z;
@@ -1070,11 +1068,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 6 BNs // CN group with 6 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX;
//#pragma omp simd
for (j=0; j<5; j++) for (j=0; j<5; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[3] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[3] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[3]; i++) for (i=0; i<lut_numCnInCnGroups[3]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG6[j][i] + lut_bnPosBnProcBuf_CNG6[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG6[j][i] + lut_bnPosBnProcBuf_CNG6[j][i]*Z;
@@ -1087,12 +1085,12 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 7 BNs // CN group with 7 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX;
//#pragma omp simd
for (j=0; j<6; j++) for (j=0; j<6; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[4] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[4] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[4]; i++) for (i=0; i<lut_numCnInCnGroups[4]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG7[j][i] + lut_bnPosBnProcBuf_CNG7[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG7[j][i] + lut_bnPosBnProcBuf_CNG7[j][i]*Z;
@@ -1105,7 +1103,7 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 8 BNs // CN group with 8 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX;
// #pragma omp simd
for (j=0; j<7; j++) for (j=0; j<7; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[5] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[5] + j*bitOffsetInGroup];
@@ -1121,11 +1119,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 9 BNs // CN group with 9 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX;
// #pragma omp simd
for (j=0; j<8; j++) for (j=0; j<8; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[6] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[6] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[6]; i++) for (i=0; i<lut_numCnInCnGroups[6]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG9[j][i] + lut_bnPosBnProcBuf_CNG9[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG9[j][i] + lut_bnPosBnProcBuf_CNG9[j][i]*Z;
@@ -1138,11 +1136,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 10 BNs // CN group with 10 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX;
//#pragma omp simd
for (j=0; j<9; j++) for (j=0; j<9; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[7] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[7] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[7]; i++) for (i=0; i<lut_numCnInCnGroups[7]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG10[j][i] + lut_bnPosBnProcBuf_CNG10[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG10[j][i] + lut_bnPosBnProcBuf_CNG10[j][i]*Z;
@@ -1155,11 +1153,11 @@ static inline void nrLDPC_bn2cnProcBuf_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// CN group with 19 BNs // CN group with 19 BNs
bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX; bitOffsetInGroup = lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX;
//#pragma omp simd
for (j=0; j<19; j++) for (j=0; j<19; j++)
{ {
p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[8] + j*bitOffsetInGroup]; p_cnProcBuf = &cnProcBuf[lut_startAddrCnGroups[8] + j*bitOffsetInGroup];
// #pragma omp simd
for (i=0; i<lut_numCnInCnGroups[8]; i++) for (i=0; i<lut_numCnInCnGroups[8]; i++)
{ {
idxBn = lut_startAddrBnProcBuf_CNG19[j][i] + lut_bnPosBnProcBuf_CNG19[j][i]*Z; idxBn = lut_startAddrBnProcBuf_CNG19[j][i] + lut_bnPosBnProcBuf_CNG19[j][i]*Z;
@@ -1211,3 +1209,5 @@ static inline void nrLDPC_llrRes2llrOut(t_nrLDPC_lut* p_lut, int8_t* llrOut, t_n
#endif #endif
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
@@ -22,8 +23,8 @@ void nrLDPC_bnProcPc_BG1_generator_AVX2(int R)
// fprintf(fd,"#include <stdint.h>\n"); // fprintf(fd,"#include <stdint.h>\n");
// fprintf(fd,"#include <immintrin.h>\n"); // fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); fprintf(fd,"static inline void nrLDPC_bnProcPc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
const uint8_t* lut_numBnInBnGroups; const uint8_t* lut_numBnInBnGroups;
const uint32_t* lut_startAddrBnGroups; const uint32_t* lut_startAddrBnGroups;
const uint16_t* lut_startAddrBnGroupsLlr; const uint16_t* lut_startAddrBnGroupsLlr;
@@ -59,72 +60,67 @@ void nrLDPC_bnProcPc_BG1_generator_AVX2(int R)
fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n"); fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n");
fprintf(fd," __m128i* p_bnProcBuf; \n"); fprintf(fd," __m128i* p_bnProcBuf; \n");
fprintf(fd," __m256i* p_bnProcBufRes; \n");
fprintf(fd," __m128i* p_llrProcBuf;\n"); fprintf(fd," __m128i* p_llrProcBuf;\n");
fprintf(fd," __m256i* p_llrProcBuf256; \n");
fprintf(fd," __m256i* p_llrRes; \n"); fprintf(fd," __m256i* p_llrRes; \n");
fprintf(fd," uint32_t M ;\n"); fprintf(fd," uint32_t M ;\n");
// =====================================================================
// Process group with 1 CN
// Already done in bnProcBufPc
// =====================================================================
fprintf(fd, "// Process group with 1 CNs \n"); fprintf(fd, "// Process group with 1 CNs \n");
// if (lut_numBnInBnGroups[1] > 0)
// { // Process group with 2 CNs
if (lut_numBnInBnGroups[0] > 0)
{
// If elements in group move to next address // If elements in group move to next address
// idxBnGroup++; // idxBnGroup++;
// Number of groups of 32 BNs for parallel processing // Number of groups of 32 BNs for parallel processing
fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] ); fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] );
fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); // Set the offset to each CN within a group in terms of 16 Byte
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4;
fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
fprintf(fd," p_llrProcBuf256 = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
// Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
// Loop over BNs
fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n");
//for (i=0,j=0;i<M;i++,j+=2) {
// Store results in bnProcBufRes of first CN for further processing for next iteration
// In case parity check fails
fprintf(fd," p_bnProcBufRes[i] = p_llrProcBuf256[i];\n");
// First 16 LLRs of first CN // First 16 LLRs of first CN
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymm0, ymm1);\n");
// Second 16 LLRs of first CN // Loop over CNs
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]);\n"); for (k=1; k<1; k++)
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]);\n"); {
fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymm0, ymm1);\n"); fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
}
// Add LLR from receiver input
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
// Pack results back to epi8 // Pack results back to epi8
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
//}
fprintf(fd,"}\n");
fprintf(fd,"}\n");
}
// ===================================================================== // =====================================================================
// Process group with 2 CNs // Process group with 2 CNs
@@ -153,7 +149,7 @@ fprintf(fd, "// Process group with 2 CNs \n");
fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n");
// First 16 LLRs of first CN // First 16 LLRs of first CN
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
// Loop over CNs // Loop over CNs
for (k=1; k<2; k++) for (k=1; k<2; k++)
@@ -177,8 +173,8 @@ fprintf(fd, "// Process group with 2 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -233,8 +229,8 @@ fprintf(fd, "// Process group with 3 CNs \n");
// Pack results back to epi8 // Pack results back to epi8
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -291,15 +287,15 @@ fprintf(fd, "// Process group with 4 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 5 CNs // Process group with 5 CNs
fprintf(fd, "// Process group with 5 CNs \n"); fprintf(fd, "// Process group with 5 CNs \n");
// Process group with 5 CNs // Process group with 5 CNs
@@ -347,8 +343,8 @@ fprintf(fd, "// Process group with 5 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -356,7 +352,7 @@ fprintf(fd, "// Process group with 5 CNs \n");
// ===================================================================== // =====================================================================
// Process group with 6 CNs // Process group with 6 CNs
fprintf(fd, "// Process group with 6 CNs \n"); fprintf(fd, "// Process group with 6 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -404,15 +400,15 @@ fprintf(fd, "// Process group with 6 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 7 CNs // Process group with 7 CNs
fprintf(fd, "// Process group with 7 CNs \n"); fprintf(fd, "// Process group with 7 CNs \n");
// Process group with 7 CNs // Process group with 7 CNs
@@ -461,15 +457,15 @@ fprintf(fd, "// Process group with 7 CNs \n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
//fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 8 CNs // Process group with 8 CNs
fprintf(fd, "// Process group with 8 CNs \n"); fprintf(fd, "// Process group with 8 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -519,14 +515,14 @@ fprintf(fd, "// Process group with 8 CNs \n");
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
//fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 9 CNs // Process group with 9 CNs
fprintf(fd, "// Process group with 9 CNs \n"); fprintf(fd, "// Process group with 9 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -575,15 +571,15 @@ fprintf(fd, "// Process group with 9 CNs \n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
//fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 10 CNs // Process group with 10 CNs
fprintf(fd, "// Process group with 10 CNs \n"); fprintf(fd, "// Process group with 10 CNs \n");
// Process group with 10 CNs // Process group with 10 CNs
@@ -631,15 +627,15 @@ fprintf(fd, "// Process group with 10 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 11 CNs \n"); fprintf(fd, "// Process group with 11 CNs \n");
@@ -689,8 +685,8 @@ fprintf(fd, "// Process group with 11 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
@@ -744,8 +740,8 @@ fprintf(fd, "// Process group with 12 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -800,8 +796,8 @@ fprintf(fd, "// Process group with 13 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -857,15 +853,15 @@ fprintf(fd, "// Process group with 14 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 5 CNs // Process group with 5 CNs
fprintf(fd, "// Process group with 15 CNs \n"); fprintf(fd, "// Process group with 15 CNs \n");
// Process group with 5 CNs // Process group with 5 CNs
@@ -913,8 +909,8 @@ fprintf(fd, "// Process group with 15 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -922,7 +918,7 @@ fprintf(fd, "// Process group with 15 CNs \n");
// ===================================================================== // =====================================================================
// Process group with 6 CNs // Process group with 6 CNs
fprintf(fd, "// Process group with 16 CNs \n"); fprintf(fd, "// Process group with 16 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -970,15 +966,15 @@ fprintf(fd, "// Process group with 16 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 17 CNs // Process group with 17 CNs
fprintf(fd, "// Process group with 17 CNs \n"); fprintf(fd, "// Process group with 17 CNs \n");
// Process group with 17 CNs // Process group with 17 CNs
@@ -1026,15 +1022,15 @@ fprintf(fd, "// Process group with 17 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 18 CNs // Process group with 18 CNs
fprintf(fd, "// Process group with 18 CNs \n"); fprintf(fd, "// Process group with 18 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -1082,14 +1078,14 @@ fprintf(fd, "// Process group with 18 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 9 CNs // Process group with 9 CNs
fprintf(fd, "// Process group with 19 CNs \n"); fprintf(fd, "// Process group with 19 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -1137,15 +1133,15 @@ fprintf(fd, "// Process group with 19 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 20 CNs // Process group with 20 CNs
fprintf(fd, "// Process group with 20 CNs \n"); fprintf(fd, "// Process group with 20 CNs \n");
// Process group with 20 CNs // Process group with 20 CNs
@@ -1193,8 +1189,8 @@ fprintf(fd, "// Process group with 20 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1203,7 +1199,7 @@ fprintf(fd, "// Process group with 20 CNs \n");
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 21 CNs \n"); fprintf(fd, "// Process group with 21 CNs \n");
@@ -1253,8 +1249,8 @@ fprintf(fd, "// Process group with 21 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
@@ -1308,8 +1304,8 @@ fprintf(fd, "// Process group with 22 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1364,8 +1360,8 @@ fprintf(fd, "// Process group with <23 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1421,15 +1417,15 @@ fprintf(fd, "// Process group with 24 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 5 CNs // Process group with 5 CNs
fprintf(fd, "// Process group with 25 CNs \n"); fprintf(fd, "// Process group with 25 CNs \n");
// Process group with 5 CNs // Process group with 5 CNs
@@ -1477,8 +1473,8 @@ fprintf(fd, "// Process group with 25 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1486,7 +1482,7 @@ fprintf(fd, "// Process group with 25 CNs \n");
// ===================================================================== // =====================================================================
// Process group with 6 CNs // Process group with 6 CNs
fprintf(fd, "// Process group with 26 CNs \n"); fprintf(fd, "// Process group with 26 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -1534,15 +1530,15 @@ fprintf(fd, "// Process group with 26 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 17 CNs // Process group with 17 CNs
fprintf(fd, "// Process group with 27 CNs \n"); fprintf(fd, "// Process group with 27 CNs \n");
// Process group with 17 CNs // Process group with 17 CNs
@@ -1590,15 +1586,15 @@ fprintf(fd, "// Process group with 27 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 18 CNs // Process group with 18 CNs
fprintf(fd, "// Process group with 28 CNs \n"); fprintf(fd, "// Process group with 28 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -1646,14 +1642,14 @@ fprintf(fd, "// Process group with 28 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 9 CNs // Process group with 9 CNs
fprintf(fd, "// Process group with 29 CNs \n"); fprintf(fd, "// Process group with 29 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -1701,15 +1697,15 @@ fprintf(fd, "// Process group with 29 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 20 CNs // Process group with 20 CNs
fprintf(fd, "// Process group with 30 CNs \n"); fprintf(fd, "// Process group with 30 CNs \n");
// Process group with 20 CNs // Process group with 20 CNs
@@ -1757,8 +1753,8 @@ fprintf(fd, "// Process group with 30 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1769,3 +1765,5 @@ fprintf(fd, "// Process group with 30 CNs \n");
@@ -1,5 +1,7 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
@@ -22,8 +24,8 @@ void nrLDPC_bnProcPc_BG2_generator_AVX2(int R)
// fprintf(fd,"#include <stdint.h>\n"); // fprintf(fd,"#include <stdint.h>\n");
//fprintf(fd,"#include <immintrin.h>\n"); //fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]); fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
const uint8_t* lut_numBnInBnGroups; const uint8_t* lut_numBnInBnGroups;
const uint32_t* lut_startAddrBnGroups; const uint32_t* lut_startAddrBnGroups;
const uint16_t* lut_startAddrBnGroupsLlr; const uint16_t* lut_startAddrBnGroupsLlr;
@@ -60,72 +62,67 @@ void nrLDPC_bnProcPc_BG2_generator_AVX2(int R)
fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n"); fprintf(fd," __m256i ymm0, ymm1, ymmRes0, ymmRes1; \n");
fprintf(fd," __m128i* p_bnProcBuf; \n"); fprintf(fd," __m128i* p_bnProcBuf; \n");
fprintf(fd," __m256i* p_bnProcBufRes; \n");
fprintf(fd," __m128i* p_llrProcBuf;\n"); fprintf(fd," __m128i* p_llrProcBuf;\n");
fprintf(fd," __m256i* p_llrProcBuf256; \n");
fprintf(fd," __m256i* p_llrRes; \n"); fprintf(fd," __m256i* p_llrRes; \n");
fprintf(fd," uint32_t M ;\n"); fprintf(fd," uint32_t M ;\n");
// =====================================================================
// Process group with 1 CN
// Already done in bnProcBufPc
// =====================================================================
fprintf(fd, "// Process group with 1 CNs \n"); fprintf(fd, "// Process group with 1 CNs \n");
// if (lut_numBnInBnGroups[1] > 0)
// { // Process group with 2 CNs
if (lut_numBnInBnGroups[0] > 0)
{
// If elements in group move to next address // If elements in group move to next address
// idxBnGroup++; // idxBnGroup++;
// Number of groups of 32 BNs for parallel processing // Number of groups of 32 BNs for parallel processing
fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[26] ); fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[0] );
fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); // Set the offset to each CN within a group in terms of 16 Byte
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); cnOffsetInGroup = (lut_numBnInBnGroups[0]*NR_LDPC_ZMAX)>>4;
fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
fprintf(fd," p_llrProcBuf256 = (__m256i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
// Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m128i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_llrProcBuf = (__m128i*) &llrProcBuf [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
// Loop over BNs
fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n");
//for (i=0,j=0;i<M;i++,j+=2) {
// Store results in bnProcBufRes of first CN for further processing for next iteration
// In case parity check fails
fprintf(fd," p_bnProcBufRes[i] = p_llrProcBuf256[i];\n");
// First 16 LLRs of first CN // First 16 LLRs of first CN
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n");
fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymm0, ymm1);\n");
// Second 16 LLRs of first CN // Loop over CNs
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]);\n"); /*for (k=1; k<1; k++)
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]);\n"); {
fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymm0, ymm1);\n"); fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j]);\n", k*cnOffsetInGroup);
fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[%d + j +1]);\n", k*cnOffsetInGroup);
fprintf(fd, " ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); \n");
}
*/
// Add LLR from receiver input
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j+1]);\n");
fprintf(fd," ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);\n");
fprintf(fd," ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);\n");
// Pack results back to epi8 // Pack results back to epi8
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
//}
fprintf(fd,"}\n");
fprintf(fd,"}\n");
}
// ===================================================================== // =====================================================================
// Process group with 2 CNs // Process group with 2 CNs
@@ -154,7 +151,7 @@ fprintf(fd, "// Process group with 2 CNs \n");
fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n"); fprintf(fd," for (int i=0,j=0;i<M;i++,j+=2) {\n");
// First 16 LLRs of first CN // First 16 LLRs of first CN
fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n"); fprintf(fd," ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);\n");
fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);\n"); fprintf(fd," ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);\n");
// Loop over CNs // Loop over CNs
for (k=1; k<2; k++) for (k=1; k<2; k++)
@@ -178,8 +175,8 @@ fprintf(fd, "// Process group with 2 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -234,8 +231,8 @@ fprintf(fd, "// Process group with 3 CNs \n");
// Pack results back to epi8 // Pack results back to epi8
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -292,15 +289,15 @@ fprintf(fd, "// Process group with 4 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 5 CNs // Process group with 5 CNs
fprintf(fd, "// Process group with 5 CNs \n"); fprintf(fd, "// Process group with 5 CNs \n");
// Process group with 5 CNs // Process group with 5 CNs
@@ -348,8 +345,8 @@ fprintf(fd, "// Process group with 5 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -357,7 +354,7 @@ fprintf(fd, "// Process group with 5 CNs \n");
// ===================================================================== // =====================================================================
// Process group with 6 CNs // Process group with 6 CNs
fprintf(fd, "// Process group with 6 CNs \n"); fprintf(fd, "// Process group with 6 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -405,15 +402,15 @@ fprintf(fd, "// Process group with 6 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 7 CNs // Process group with 7 CNs
fprintf(fd, "// Process group with 7 CNs \n"); fprintf(fd, "// Process group with 7 CNs \n");
// Process group with 7 CNs // Process group with 7 CNs
@@ -462,15 +459,15 @@ fprintf(fd, "// Process group with 7 CNs \n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
//fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 8 CNs // Process group with 8 CNs
fprintf(fd, "// Process group with 8 CNs \n"); fprintf(fd, "// Process group with 8 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -520,14 +517,14 @@ fprintf(fd, "// Process group with 8 CNs \n");
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
//fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 9 CNs // Process group with 9 CNs
fprintf(fd, "// Process group with 9 CNs \n"); fprintf(fd, "// Process group with 9 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -576,15 +573,15 @@ fprintf(fd, "// Process group with 9 CNs \n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
//fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 ); //fprintf(fd," (__m256i*) &llrRes[%d + i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n",lut_startAddrBnGroupsLlr[idxBnGroup]>>5 );
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 10 CNs // Process group with 10 CNs
fprintf(fd, "// Process group with 10 CNs \n"); fprintf(fd, "// Process group with 10 CNs \n");
// Process group with 10 CNs // Process group with 10 CNs
@@ -632,15 +629,15 @@ fprintf(fd, "// Process group with 10 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 11 CNs \n"); fprintf(fd, "// Process group with 11 CNs \n");
@@ -690,8 +687,8 @@ fprintf(fd, "// Process group with 11 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
@@ -745,8 +742,8 @@ fprintf(fd, "// Process group with 12 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -801,8 +798,8 @@ fprintf(fd, "// Process group with 13 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -858,15 +855,15 @@ fprintf(fd, "// Process group with 14 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 5 CNs // Process group with 5 CNs
fprintf(fd, "// Process group with 15 CNs \n"); fprintf(fd, "// Process group with 15 CNs \n");
// Process group with 5 CNs // Process group with 5 CNs
@@ -914,8 +911,8 @@ fprintf(fd, "// Process group with 15 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -923,7 +920,7 @@ fprintf(fd, "// Process group with 15 CNs \n");
// ===================================================================== // =====================================================================
// Process group with 6 CNs // Process group with 6 CNs
fprintf(fd, "// Process group with 16 CNs \n"); fprintf(fd, "// Process group with 16 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -971,15 +968,15 @@ fprintf(fd, "// Process group with 16 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 17 CNs // Process group with 17 CNs
fprintf(fd, "// Process group with 17 CNs \n"); fprintf(fd, "// Process group with 17 CNs \n");
// Process group with 17 CNs // Process group with 17 CNs
@@ -1027,15 +1024,15 @@ fprintf(fd, "// Process group with 17 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 18 CNs // Process group with 18 CNs
fprintf(fd, "// Process group with 18 CNs \n"); fprintf(fd, "// Process group with 18 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -1083,14 +1080,14 @@ fprintf(fd, "// Process group with 18 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 9 CNs // Process group with 9 CNs
fprintf(fd, "// Process group with 19 CNs \n"); fprintf(fd, "// Process group with 19 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -1138,15 +1135,15 @@ fprintf(fd, "// Process group with 19 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 20 CNs // Process group with 20 CNs
fprintf(fd, "// Process group with 20 CNs \n"); fprintf(fd, "// Process group with 20 CNs \n");
// Process group with 20 CNs // Process group with 20 CNs
@@ -1194,8 +1191,8 @@ fprintf(fd, "// Process group with 20 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1204,7 +1201,7 @@ fprintf(fd, "// Process group with 20 CNs \n");
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 21 CNs \n"); fprintf(fd, "// Process group with 21 CNs \n");
@@ -1254,8 +1251,8 @@ fprintf(fd, "// Process group with 21 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
@@ -1309,8 +1306,8 @@ fprintf(fd, "// Process group with 22 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1318,7 +1315,7 @@ fprintf(fd, "// Process group with 22 CNs \n");
// Process group with 13 CNs // Process group with 13 CNs
fprintf(fd, "// Process group with 23 CNs \n"); fprintf(fd, "// Process group with <23 CNs \n");
// Process group with 3 CNs // Process group with 3 CNs
@@ -1365,8 +1362,8 @@ fprintf(fd, "// Process group with 23 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1422,15 +1419,15 @@ fprintf(fd, "// Process group with 24 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 5 CNs // Process group with 5 CNs
fprintf(fd, "// Process group with 25 CNs \n"); fprintf(fd, "// Process group with 25 CNs \n");
// Process group with 5 CNs // Process group with 5 CNs
@@ -1478,8 +1475,8 @@ fprintf(fd, "// Process group with 25 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1487,7 +1484,7 @@ fprintf(fd, "// Process group with 25 CNs \n");
// ===================================================================== // =====================================================================
// Process group with 6 CNs // Process group with 6 CNs
fprintf(fd, "// Process group with 26 CNs \n"); fprintf(fd, "// Process group with 26 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -1535,15 +1532,15 @@ fprintf(fd, "// Process group with 26 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 17 CNs // Process group with 17 CNs
fprintf(fd, "// Process group with 27 CNs \n"); fprintf(fd, "// Process group with 27 CNs \n");
// Process group with 17 CNs // Process group with 17 CNs
@@ -1591,15 +1588,15 @@ fprintf(fd, "// Process group with 27 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 18 CNs // Process group with 18 CNs
fprintf(fd, "// Process group with 28 CNs \n"); fprintf(fd, "// Process group with 28 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -1647,14 +1644,14 @@ fprintf(fd, "// Process group with 28 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 9 CNs // Process group with 9 CNs
fprintf(fd, "// Process group with 29 CNs \n"); fprintf(fd, "// Process group with 29 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -1702,15 +1699,15 @@ fprintf(fd, "// Process group with 29 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
// ===================================================================== // =====================================================================
// Process group with 20 CNs // Process group with 20 CNs
fprintf(fd, "// Process group with 30 CNs \n"); fprintf(fd, "// Process group with 30 CNs \n");
// Process group with 20 CNs // Process group with 20 CNs
@@ -1758,8 +1755,8 @@ fprintf(fd, "// Process group with 30 CNs \n");
fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n"); fprintf(fd," ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);\n");
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]] // ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]] // p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
fprintf(fd," *p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8);\n"); fprintf(fd," p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -1770,3 +1767,8 @@ fprintf(fd, "// Process group with 30 CNs \n");
@@ -1,4 +1,5 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
@@ -25,9 +26,9 @@ void nrLDPC_bnProc_BG1_generator_AVX2(int R)
//fprintf(fd,"#include <stdint.h>\n"); //fprintf(fd,"#include <stdint.h>\n");
//fprintf(fd,"#include <immintrin.h>\n"); //fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]); fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]);
const uint8_t* lut_numBnInBnGroups; const uint8_t* lut_numBnInBnGroups;
const uint32_t* lut_startAddrBnGroups; const uint32_t* lut_startAddrBnGroups;
const uint16_t* lut_startAddrBnGroupsLlr; const uint16_t* lut_startAddrBnGroupsLlr;
@@ -63,7 +64,7 @@ void nrLDPC_bnProc_BG1_generator_AVX2(int R)
uint8_t idxBnGroup = 0; uint8_t idxBnGroup = 0;
fprintf(fd," __m256i* p_bnProcBuf; \n"); fprintf(fd," __m256i* p_bnProcBuf; \n");
fprintf(fd," __m256i* p_bnProcBufRes; \n"); fprintf(fd," __m256i* p_bnProcBufRes; \n");
fprintf(fd," __m256i* p_llrRes; \n"); fprintf(fd," __m256i* p_llrRes; \n");
@@ -78,6 +79,9 @@ void nrLDPC_bnProc_BG1_generator_AVX2(int R)
// ===================================================================== // =====================================================================
// =====================================================================
fprintf(fd, "// Process group with 2 CNs \n"); fprintf(fd, "// Process group with 2 CNs \n");
if (lut_numBnInBnGroups[1] > 0) if (lut_numBnInBnGroups[1] > 0)
@@ -87,15 +91,15 @@ fprintf(fd, "// Process group with 2 CNs \n");
// Number of groups of 32 BNs or parallel processing // Number of groups of 32 BNs or parallel processing
fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] ); fprintf(fd," M = (%d*Z + 31)>>5;\n",lut_numBnInBnGroups[1] );
// Set the offset to each CN within a group in terms of 16 Byte // Set the offset to each CN within a group in terms of 16 Byte
cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5; cnOffsetInGroup = (lut_numBnInBnGroups[1]*NR_LDPC_ZMAX)>>5;
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<2; k++) for (k=0; k<2; k++)
{ {
@@ -104,16 +108,14 @@ fprintf(fd, "// Process group with 2 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
@@ -136,8 +138,8 @@ fprintf(fd, "// Process group with 3 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
for (k=0; k<3; k++) for (k=0; k<3; k++)
{ {
fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup);
@@ -145,9 +147,7 @@ fprintf(fd, "// Process group with 3 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -156,11 +156,11 @@ fprintf(fd, "// Process group with 3 CNs \n");
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 4 CNs \n"); fprintf(fd, "// Process group with 4 CNs \n");
if (lut_numBnInBnGroups[3] > 0) if (lut_numBnInBnGroups[3] > 0)
{ {
@@ -175,8 +175,8 @@ fprintf(fd, "// Process group with 4 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
for (k=0; k<4; k++) for (k=0; k<4; k++)
{ {
fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup);
@@ -184,9 +184,7 @@ fprintf(fd, "// Process group with 4 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
@@ -195,7 +193,7 @@ fprintf(fd, "// Process group with 4 CNs \n");
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 5 CNs \n"); fprintf(fd, "// Process group with 5 CNs \n");
@@ -213,8 +211,8 @@ fprintf(fd, "// Process group with 4 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<5; k++) for (k=0; k<5; k++)
{ {
@@ -223,20 +221,18 @@ fprintf(fd, "// Process group with 4 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 6 CNs \n"); fprintf(fd, "// Process group with 6 CNs \n");
// Process group with 6 CNs // Process group with 6 CNs
@@ -254,8 +250,8 @@ fprintf(fd, "// Process group with 6 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<6; k++) for (k=0; k<6; k++)
{ {
@@ -264,19 +260,17 @@ fprintf(fd, "// Process group with 6 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 7 CNs \n"); fprintf(fd, "// Process group with 7 CNs \n");
// Process group with 7 CNs // Process group with 7 CNs
@@ -294,8 +288,8 @@ fprintf(fd, "// Process group with 7 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<7; k++) for (k=0; k<7; k++)
{ {
@@ -304,19 +298,17 @@ fprintf(fd, "// Process group with 7 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 8 CNs \n"); fprintf(fd, "// Process group with 8 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -334,8 +326,8 @@ fprintf(fd, "// Process group with 8 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<8; k++) for (k=0; k<8; k++)
{ {
@@ -344,18 +336,16 @@ fprintf(fd, "// Process group with 8 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 9 CNs \n"); fprintf(fd, "// Process group with 9 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -373,8 +363,8 @@ fprintf(fd, "// Process group with 9 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<9; k++) for (k=0; k<9; k++)
{ {
@@ -383,12 +373,10 @@ fprintf(fd, "// Process group with 9 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
@@ -412,8 +400,8 @@ fprintf(fd, "// Process group with 10 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<10; k++) for (k=0; k<10; k++)
{ {
@@ -422,19 +410,17 @@ fprintf(fd, "// Process group with 10 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 11 CNs \n"); fprintf(fd, "// Process group with 11 CNs \n");
if (lut_numBnInBnGroups[10] > 0) if (lut_numBnInBnGroups[10] > 0)
@@ -450,8 +436,8 @@ fprintf(fd, "// Process group with 11 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<11; k++) for (k=0; k<11; k++)
{ {
@@ -460,12 +446,10 @@ fprintf(fd, "// Process group with 11 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
@@ -488,8 +472,8 @@ fprintf(fd, "// Process group with 12 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<12; k++) for (k=0; k<12; k++)
{ {
@@ -498,12 +482,10 @@ fprintf(fd, "// Process group with 12 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
@@ -528,29 +510,27 @@ fprintf(fd, "// Process group with 13 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<1; k++) for (k=0; k<13; k++)
{ {
fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup); fprintf(fd," p_res = &p_bnProcBufRes[%d];\n", k*cnOffsetInGroup);
fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]); fprintf(fd," p_llrRes = (__m256i*) &llrRes [%d];\n",lut_startAddrBnGroupsLlr[idxBnGroup]);
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 14 CNs \n"); fprintf(fd, "// Process group with 14 CNs \n");
@@ -569,8 +549,8 @@ fprintf(fd, "// Process group with 14 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<14; k++) for (k=0; k<14; k++)
{ {
@@ -579,19 +559,17 @@ fprintf(fd, "// Process group with 14 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 15 CNs \n"); fprintf(fd, "// Process group with 15 CNs \n");
@@ -609,8 +587,8 @@ fprintf(fd, "// Process group with 15 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<15; k++) for (k=0; k<15; k++)
{ {
@@ -619,12 +597,10 @@ fprintf(fd, "// Process group with 15 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
@@ -632,10 +608,10 @@ fprintf(fd, "// Process group with 15 CNs \n");
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 16 CNs \n"); fprintf(fd, "// Process group with 16 CNs \n");
if (lut_numBnInBnGroups[15] > 0) if (lut_numBnInBnGroups[15] > 0)
{ {
@@ -650,8 +626,8 @@ fprintf(fd, "// Process group with 16 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<16; k++) for (k=0; k<16; k++)
{ {
@@ -660,19 +636,17 @@ fprintf(fd, "// Process group with 16 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
// Process group with 17 CNs // Process group with 17 CNs
fprintf(fd, "// Process group with 17 CNs \n"); fprintf(fd, "// Process group with 17 CNs \n");
// Process group with 17 CNs // Process group with 17 CNs
@@ -690,8 +664,8 @@ fprintf(fd, "// Process group with 17 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<17; k++) for (k=0; k<17; k++)
{ {
@@ -700,19 +674,17 @@ fprintf(fd, "// Process group with 17 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 18 CNs \n"); fprintf(fd, "// Process group with 18 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -730,8 +702,8 @@ fprintf(fd, "// Process group with 18 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<18; k++) for (k=0; k<18; k++)
{ {
@@ -740,18 +712,16 @@ fprintf(fd, "// Process group with 18 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 19 CNs \n"); fprintf(fd, "// Process group with 19 CNs \n");
@@ -769,8 +739,8 @@ fprintf(fd, "// Process group with 19 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<19; k++) for (k=0; k<19; k++)
{ {
@@ -779,19 +749,17 @@ fprintf(fd, "// Process group with 19 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 20 CNs \n"); fprintf(fd, "// Process group with 20 CNs \n");
@@ -809,8 +777,8 @@ fprintf(fd, "// Process group with 20 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<20; k++) for (k=0; k<20; k++)
{ {
@@ -819,12 +787,10 @@ fprintf(fd, "// Process group with 20 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
@@ -833,12 +799,12 @@ fprintf(fd, "// Process group with 20 CNs \n");
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 21 CNs \n"); fprintf(fd, "// Process group with 21 CNs \n");
if (lut_numBnInBnGroups[20] > 0) if (lut_numBnInBnGroups[20] > 0)
{ {
@@ -853,8 +819,8 @@ fprintf(fd, "// Process group with 21 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<21; k++) for (k=0; k<21; k++)
{ {
@@ -863,12 +829,10 @@ fprintf(fd, "// Process group with 21 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
@@ -891,8 +855,8 @@ fprintf(fd, "// Process group with 22 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<22; k++) for (k=0; k<22; k++)
{ {
@@ -901,17 +865,15 @@ fprintf(fd, "// Process group with 22 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with <23 CNs \n"); fprintf(fd, "// Process group with <23 CNs \n");
@@ -931,8 +893,8 @@ fprintf(fd, "// Process group with <23 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<23; k++) for (k=0; k<23; k++)
{ {
@@ -941,19 +903,17 @@ fprintf(fd, "// Process group with <23 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 24 CNs \n"); fprintf(fd, "// Process group with 24 CNs \n");
@@ -972,8 +932,8 @@ fprintf(fd, "// Process group with 24 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<24; k++) for (k=0; k<24; k++)
{ {
@@ -982,19 +942,17 @@ fprintf(fd, "// Process group with 24 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 25 CNs \n"); fprintf(fd, "// Process group with 25 CNs \n");
@@ -1012,8 +970,8 @@ fprintf(fd, "// Process group with 25 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<25; k++) for (k=0; k<25; k++)
{ {
@@ -1022,23 +980,22 @@ fprintf(fd, "// Process group with 25 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 26 CNs \n"); fprintf(fd, "// Process group with 26 CNs \n");
if (lut_numBnInBnGroups[25] > 0) if (lut_numBnInBnGroups[25] > 0)
{ {
@@ -1053,8 +1010,8 @@ fprintf(fd, "// Process group with 26 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<26; k++) for (k=0; k<26; k++)
{ {
@@ -1063,19 +1020,17 @@ fprintf(fd, "// Process group with 26 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 27 CNs \n"); fprintf(fd, "// Process group with 27 CNs \n");
// Process group with 17 CNs // Process group with 17 CNs
@@ -1093,8 +1048,8 @@ fprintf(fd, "// Process group with 27 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<27; k++) for (k=0; k<27; k++)
{ {
@@ -1103,19 +1058,17 @@ fprintf(fd, "// Process group with 27 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 28 CNs \n"); fprintf(fd, "// Process group with 28 CNs \n");
// Process group with 8 CNs // Process group with 8 CNs
@@ -1133,8 +1086,8 @@ fprintf(fd, "// Process group with 28 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<28; k++) for (k=0; k<28; k++)
{ {
@@ -1143,17 +1096,15 @@ fprintf(fd, "// Process group with 28 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
// ===================================================================== // =====================================================================
fprintf(fd, "// Process group with 29 CNs \n"); fprintf(fd, "// Process group with 29 CNs \n");
// Process group with 9 CNs // Process group with 9 CNs
@@ -1171,8 +1122,8 @@ fprintf(fd, "// Process group with 29 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<29; k++) for (k=0; k<29; k++)
{ {
@@ -1181,12 +1132,10 @@ fprintf(fd, "// Process group with 29 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
@@ -1210,8 +1159,8 @@ fprintf(fd, "// Process group with 30 CNs \n");
// Set pointers to start of group 2 // Set pointers to start of group 2
fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBuf = (__m256i*) &bnProcBuf [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]); fprintf(fd," p_bnProcBufRes = (__m256i*) &bnProcBufRes [%d];\n",lut_startAddrBnGroups[idxBnGroup]);
// Loop over CNs // Loop over CNs
for (k=0; k<30; k++) for (k=0; k<30; k++)
{ {
@@ -1220,12 +1169,10 @@ fprintf(fd, "// Process group with 30 CNs \n");
// Loop over BNs // Loop over BNs
fprintf(fd," for (i=0;i<M;i++) {\n"); fprintf(fd," for (i=0;i<M;i++) {\n");
fprintf(fd," *p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup); fprintf(fd," p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[%d + i]);\n",k*cnOffsetInGroup);
fprintf(fd," p_res++;\n");
fprintf(fd," p_llrRes++;\n");
fprintf(fd,"}\n"); fprintf(fd,"}\n");
} }
} }
@@ -1236,3 +1183,4 @@ fprintf(fd, "// Process group with 30 CNs \n");
File diff suppressed because it is too large Load Diff
@@ -386,10 +386,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(int R)
// Process group with 8 BNs // Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n"); fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 24 // Offset is 2*384/32 = 24
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
@@ -1,5 +1,3 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
@@ -327,14 +325,13 @@ void nrLDPC_cnProc_BG1_generator_AVX512(int R)
// ===================================================================== // =====================================================================
// Process group with 8 BNs // Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n"); fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12 // Offset is 2*384/32 = 24
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168}, const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168}, {0,24,72,96,120,144,168}, {0,24,48,96,120,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168}, {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}}; {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
if (lut_numCnInCnGroups[5] > 0) if (lut_numCnInCnGroups[5] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
@@ -1,603 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include "../../nrLDPCdecoder_defs.h"
void nrLDPC_cnProc_BG1_generator_AVX512(int R)
{
const char *ratestr[3]={"13","23","89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
// system("mkdir -p ../ldpc_gen_files");
char fname[50];
sprintf(fname,"../ldpc_gen_files/cnProc_avx512/nrLDPC_cnProc_BG1_R%s_AVX512.h",ratestr[R]);
FILE *fd=fopen(fname,"w");
if (fd == NULL) {printf("Cannot create \n");abort();}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX512(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf, uint16_t Z) {\n",ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
uint32_t i,j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
fprintf(fd," uint32_t M, i;\n");
fprintf(fd," int8_t* cnProcBuf = p_procBuf->cnProcBuf;\n");
fprintf(fd," int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;\n");
fprintf(fd," __m512i* p_cnProcBufResBit;\n");
fprintf(fd," __m512i* p_cnProcBufRes;\n");
fprintf(fd," __m512i* p_cnProcBuf;\n");
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR, ones;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
fprintf(fd," ones = _mm512_set1_epi8((char)1);\n");
// =====================================================================
// Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup (1*384/32)12
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
//M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[0]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[0]);
// Loop over every BN
for (j=0; j<3; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG3[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// for (k=1; k<2; k++)
// {
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG3[j][1]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// }
// Store result
// min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/32 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
//M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[1]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[1]);
// Loop over every BN
for (j=0; j<4; j++)
{
// Loop over CNs
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
// {
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG4[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<3; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG4[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 5 BNs
fprintf(fd,"//Process group with 5 BNs\n");
// Offset is 18*384/32 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
//M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[2]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[2]);
// Loop over every BN
for (j=0; j<5; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG5[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<4; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG5[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/32 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,96,288,384,480}, {0,96,192,384,480},
{0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
//M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[3]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[3]);
// Loop over every BN
for (j=0; j<6; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG6[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<5; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG6[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/32 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
// M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[4]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[4]);
// Loop over every BN
for (j=0; j<7; j++)
{
// Loop over CNs
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
// {
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0= p_cnProcBuf[%d+i];\n",lut_idxCnProcG7[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<6; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG7[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
// M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[5]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[5]);
// Loop over every BN
for (j=0; j<8; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
// {
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG8[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG8[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,24,48,72,96,120,144,168}};
if (lut_numCnInCnGroups[6] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
// M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
fprintf(fd, "M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[6] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[6]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[6]);
// Loop over every BN
for (j=0; j<9; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG9[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<8; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG9[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/32 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
{0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
if (lut_numCnInCnGroups[7] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
//M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[7] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[7]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[7]);
// Loop over every BN
for (j=0; j<10; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
// {
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG10[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG10[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 19 BNs
fprintf(fd,"//Process group with 19 BNs\n");
// Offset is 4*384/32 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
// M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
fprintf(fd, " M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[8] );
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups[8]*NR_LDPC_ZMAX)>>6;
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]);
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf[%d];\n", lut_startAddrCnGroups[8]);
// Loop over every BN
for (j=0; j<19; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d ;\n", (j*bitOffsetInGroup));
fprintf(fd," for (i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG19[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<18; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf[%d+i];\n",lut_idxCnProcG19[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
fprintf(fd,"}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
@@ -1,4 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
@@ -24,7 +25,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n"); fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]); fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
const uint8_t* lut_numCnInCnGroups; const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2; const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2;
@@ -42,16 +43,17 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
// Offset to each bit within a group in terms of 64 Byte // Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup; uint32_t bitOffsetInGroup;
fprintf(fd," uint32_t M;\n"); fprintf(fd," uint32_t M;\n");
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n"); fprintf(fd," __m512i zmm0, min, sgn,zeros,ones,maxLLR;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n"); fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n"); fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
fprintf(fd," ones = _mm512_set1_epi8((char)1);\n");
// ===================================================================== // =====================================================================
// Process group with 3 BNs // Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n"); fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed // LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc. // 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup // Offsets are in units of bitOffsetInGroup
const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}}; const uint8_t lut_idxCnProcG3[3][2] = {{72,144}, {0,144}, {0,72}};
@@ -59,7 +61,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[1] ); fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[0] );
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6; bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6;
@@ -71,57 +73,38 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
{ {
fprintf(fd," for (int i=0;i<M;i+=2) {\n");
fprintf(fd," for (int i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0); fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); // for (k=1; k<2; k++)
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); //{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
// sgn = _mm512_sign_epi8(sgn, zmm0); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, *maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup));
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][0]/2)+1);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][1]/2)+1);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)+1);
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
// ===================================================================== // =====================================================================
// Process group with 4 BNs // Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n"); fprintf(fd,"//Process group with 4 BNs\n");
@@ -140,14 +123,13 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
// Loop over every BN // Loop over every BN
for (j=0; j<4; j++) for (j=0; j<4; j++)
{ {
fprintf(fd," for (int i=0;i<M;i++) {\n"); fprintf(fd," for (int i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0); fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
@@ -179,6 +161,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
// Offset is 9*384/32 = 108 // Offset is 9*384/32 = 108
const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432}, const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432},
{0,108,324,432}, {0,108,216,432}, {0,108,216,324}}; {0,108,324,432}, {0,108,216,432}, {0,108,216,324}};
@@ -199,10 +182,9 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
fprintf(fd," for (int i=0;i<M;i++) {\n"); fprintf(fd," for (int i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0); fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
@@ -233,6 +215,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180}, const uint16_t lut_idxCnProcG6[6][5] = {{36,72,108,144,180}, {0,72,108,144,180},
{0,36,108,144,180}, {0,36,72,144,180}, {0,36,108,144,180}, {0,36,72,144,180},
{0,36,72,108,180}, {0,36,72,108,144}}; {0,36,72,108,180}, {0,36,72,108,144}};
@@ -253,10 +236,9 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
fprintf(fd," for (int i=0;i<M;i++) {\n"); fprintf(fd," for (int i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0); fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
@@ -291,6 +273,8 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
{0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, {0,24,48,72,120,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; {0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}};
if (lut_numCnInCnGroups[4] > 0) if (lut_numCnInCnGroups[4] > 0)
{ {
@@ -305,14 +289,13 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
for (j=0; j<8; j++) for (j=0; j<8; j++)
{ {
fprintf(fd," for (int i=0;i<M;i++) {\n"); fprintf(fd," for (int i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][0]/2); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0); fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
@@ -330,7 +313,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
@@ -340,13 +323,15 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
// ===================================================================== // =====================================================================
// Process group with 10 BNs // Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n"); fprintf(fd,"//Process group with 10 BNs\n");
const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216}, const uint8_t lut_idxCnProcG10[10][9] = {{24,48,72,96,120,144,168,192,216}, {0,48,72,96,120,144,168,192,216},
{0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216}, {0,24,72,96,120,144,168,192,216}, {0,24,48,96,120,144,168,192,216},
{0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216}, {0,24,48,72,120,144,168,192,216}, {0,24,48,72,96,144,168,192,216},
{0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216}, {0,24,48,72,96,120,168,192,216}, {0,24,48,72,96,120,144,192,216},
{0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}}; {0,24,48,72,96,120,144,168,216}, {0,24,48,72,96,120,144,168,192}};
if (lut_numCnInCnGroups[5] > 0) if (lut_numCnInCnGroups[5] > 0)
{ {
@@ -365,10 +350,9 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
fprintf(fd," for (int i=0;i<M;i++) {\n"); fprintf(fd," for (int i=0;i<M;i++) {\n");
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][0]/2); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0); fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
@@ -392,7 +376,7 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
} }
} }
fprintf(fd,"}\n"); fprintf(fd,"}\n");
fclose(fd); fclose(fd);
}//end of the function nrLDPC_cnProc_BG2 }//end of the function nrLDPC_cnProc_BG2
@@ -404,3 +388,4 @@ void nrLDPC_cnProc_BG2_generator_AVX512(int R)
@@ -1,583 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include "../../nrLDPCdecoder_defs.h"
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{
const char *ratestr[3]={"13","23","89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
// system("mkdir -p ../ldpc_gen_files");
char fname[50];
sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_%s_AVX512.c",Z,ratestr[R]);
FILE *fd=fopen(fname,"w");
if (fd == NULL) {printf("Cannot create \n");abort();}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
uint32_t M;
uint32_t j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
// =====================================================================
// Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup (1*384/32)12
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<3; j++)
{
fprintf(fd," for (int i=0;i<%d;i+=2) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup));
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][0]/2)+1);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][1]/2)+1);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)+1);
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/32 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<4; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<3; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 5 BNs
fprintf(fd,"//Process group with 5 BNs\n");
// Offset is 18*384/32 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<5; j++)
{
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<4; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/32 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,96,288,384,480}, {0,96,192,384,480},
{0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<6; j++)
{
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<5; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/32 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<7; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn= ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][0]/2);
// sgn = _mm512_sign_epi816(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<6; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<8; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,24,48,72,96,120,144,168}};
if (lut_numCnInCnGroups[6] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group
// Loop over every BN
for (j=0; j<9; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<8; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn, zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/32 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
{0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
if (lut_numCnInCnGroups[7] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<10; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 19 BNs
fprintf(fd,"//Process group with 19 BNs\n");
// Offset is 4*384/32 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<19; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][0]/2);
// sgn = _mm512_sign_epi8(ones, zmm0);
// min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs
for (k=1; k<18; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
fprintf(fd,"}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
@@ -1,557 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include "../../nrLDPCdecoder_defs.h"
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{
const char *ratestr[3]={"13","23","89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
// system("mkdir -p ../ldpc_gen_files");
char fname[50];
sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]);
FILE *fd=fopen(fname,"w");
if (fd == NULL) {printf("Cannot create \n");abort();}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_procBuf) {\n",Z,ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
uint32_t M;
uint32_t j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
// =====================================================================
// Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup (1*384/32)12
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," int8_t* cnProcBuf = p_procBuf->cnProcBuf;\n");
fprintf(fd," int8_t* cnProcBufRes = p_procBuf->cnProcBufRes;\n");
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n");
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<3; j++)
{
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/32 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<4; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<3; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 5 BNs
fprintf(fd,"//Process group with 5 BNs\n");
// Offset is 18*384/32 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<5; j++)
{
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<4; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/32 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,96,288,384,480}, {0,96,192,384,480},
{0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<6; j++)
{
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<5; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/32 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<7; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0= ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<6; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<8; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,24,48,72,96,120,144,168}};
if (lut_numCnInCnGroups[6] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group
// Loop over every BN
for (j=0; j<9; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<8; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn, zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/32 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
{0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
if (lut_numCnInCnGroups[7] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<10; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 19 BNs
fprintf(fd,"//Process group with 19 BNs\n");
// Offset is 4*384/32 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j=0; j<19; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<18; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
fprintf(fd,"}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
@@ -1,596 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include "../../nrLDPCdecoder_defs.h"
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{
const char *ratestr[3]={"13","23","89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
// system("mkdir -p ../ldpc_gen_files");
char fname[50];
sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]);
FILE *fd=fopen(fname,"w");
if (fd == NULL) {printf("Cannot create \n");abort();}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
uint32_t M;
uint32_t j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
// =====================================================================
// Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup (1*384/32)12
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
fprintf(fd," __m512i* p_cnProcBufResBit;\n");
fprintf(fd," __m512i* p_cnProcBuf;\n");
fprintf(fd," __m512i* p_cnProcBufRes;\n");
fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n");
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[0]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]);
// Loop over every BN
// Loop over every BN
for (j=0; j<3; j++)
{
// Set of results pointer to correct BN address
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][1]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/32 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[1]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]);
// Loop over every BN
for (j=0; j<4; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<3; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 5 BNs
fprintf(fd,"//Process group with 5 BNs\n");
// Offset is 18*384/32 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[2]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]);
// Loop over every BN
for (j=0; j<5; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<4; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/32 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,96,288,384,480}, {0,96,192,384,480},
{0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[3]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]);
// Loop over every BN
for (j=0; j<6; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<5; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/32 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[4]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]);
// Loop over every BN
for (j=0; j<7; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0= p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<6; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[5]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]);
// Loop over every BN
for (j=0; j<8; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,24,48,72,96,120,144,168}};
if (lut_numCnInCnGroups[6] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[6]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]);
// Set pointers to start of group
// Loop over every BN
for (j=0; j<9; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<8; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/32 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
{0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
if (lut_numCnInCnGroups[7] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[7]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]);
// Loop over every BN
for (j=0; j<10; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 19 BNs
fprintf(fd,"//Process group with 19 BNs\n");
// Offset is 4*384/32 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[8]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]);
// Loop over every BN
for (j=0; j<19; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<18; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
fprintf(fd,"}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
@@ -1,596 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include "../../nrLDPCdecoder_defs.h"
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{
const char *ratestr[3]={"13","23","89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
// system("mkdir -p ../ldpc_gen_files");
char fname[50];
sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]);
FILE *fd=fopen(fname,"w");
if (fd == NULL) {printf("Cannot create \n");abort();}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
uint32_t M;
uint32_t j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
// =====================================================================
// Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup (1*384/32)12
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
fprintf(fd," __m512i* p_cnProcBufResBit;\n");
fprintf(fd," __m512i* p_cnProcBuf;\n");
fprintf(fd," __m512i* p_cnProcBufRes;\n");
fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n");
fprintf(fd," const __m512i* p_maxLLR = (__m512i*) maxLLR512_epi8;\n");
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[0]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]);
// Loop over every BN
// Loop over every BN
for (j=0; j<3; j++)
{
// Set of results pointer to correct BN address
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG3[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG3[j][1]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/32 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[1]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]);
// Loop over every BN
for (j=0; j<4; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG4[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<3; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG4[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 5 BNs
fprintf(fd,"//Process group with 5 BNs\n");
// Offset is 18*384/32 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[2]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]);
// Loop over every BN
for (j=0; j<5; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG5[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<4; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG5[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/32 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,96,288,384,480}, {0,96,192,384,480},
{0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[3]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]);
// Loop over every BN
for (j=0; j<6; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG6[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<5; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG6[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/32 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[4]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]);
// Loop over every BN
for (j=0; j<7; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0= p_cnProcBuf [%d+i];\n",lut_idxCnProcG7[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<6; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG7[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[5]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]);
// Loop over every BN
for (j=0; j<8; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG8[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG8[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,24,48,72,96,120,144,168}};
if (lut_numCnInCnGroups[6] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[6]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]);
// Set pointers to start of group
// Loop over every BN
for (j=0; j<9; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG9[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<8; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG9[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/32 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
{0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
if (lut_numCnInCnGroups[7] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[7]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]);
// Loop over every BN
for (j=0; j<10; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG10[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG10[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
// =====================================================================
// Process group with 19 BNs
fprintf(fd,"//Process group with 19 BNs\n");
// Offset is 4*384/32 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[8]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]);
// Loop over every BN
for (j=0; j<19; j++)
{
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", j*bitOffsetInGroup);
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG19[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<18; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",lut_idxCnProcG19[j][k]/2);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, *p_maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
}
}
fprintf(fd,"}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
@@ -1,590 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include "../../nrLDPCdecoder_defs.h"
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{
const char *ratestr[3]={"13","23","89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
// system("mkdir -p ../ldpc_gen_files");
char fname[50];
sprintf(fname,"../ldpc_gen_files/nrLDPC_cnProc_BG1_Z%d_R%s_AVX512.c",Z,ratestr[R]);
FILE *fd=fopen(fname,"w");
if (fd == NULL) {printf("Cannot create \n");abort();}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_R%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG1;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R13;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R23;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG1_R89;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
uint32_t M;
uint32_t j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
// =====================================================================
// Process group with 3 BNs
fprintf(fd,"//Process group with 3 BNs\n");
// LUT with offsets for bits that need to be processed
// 1. bit proc requires LLRs of 2. and 3. bit, 2.bits of 1. and 3. etc.
// Offsets are in units of bitOffsetInGroup (1*384/32)12
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\n");
fprintf(fd," zeros = _mm512_setzero_si512();\n");
fprintf(fd," maxLLR = _mm512_set1_epi8((char)127);\n");
fprintf(fd," __m512i* p_cnProcBufResBit;\n");
fprintf(fd," __m512i* p_cnProcBuf;\n");
fprintf(fd," __m512i* p_cnProcBufRes;\n");
fprintf(fd," const __m512i* p_ones = (__m512i*) ones512_epi8;\n");
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[0]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[0]);
// Loop over every BN
// Loop over every BN
fprintf(fd," for (int j=0;j<3;j++) {\n");
// Set of results pointer to correct BN address
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG3[j][1]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/32 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[1]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[1]);
// Loop over every BN
//for (j=0; j<4; j++)
// {
fprintf(fd," for (int j=0;j<4;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<3; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG4[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 5 BNs
fprintf(fd,"//Process group with 5 BNs\n");
// Offset is 18*384/32 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[2]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[2]);
// Loop over every BN
fprintf(fd," for (int j=0;j<5;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<4; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG5[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/32 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,96,288,384,480}, {0,96,192,384,480},
{0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[3]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[3]);
// Loop over every BN
fprintf(fd," for (int j=0;j<6;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<5; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG6[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/32 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[4]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[4]);
// Loop over every BN
fprintf(fd," for (int j=0;j<7;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0= p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<6; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG7[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[5]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[5]);
// Loop over every BN
fprintf(fd," for (int j=0;j<8;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG8[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/32 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,24,48,72,96,120,144,168}};
if (lut_numCnInCnGroups[6] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[6]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[6]);
// Set pointers to start of group
// Loop over every BN
fprintf(fd," for (int j=0;j<9;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<8; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG9[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/32 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{12,24,36,48,60,72,84,96,108}, {0,24,36,48,60,72,84,96,108},
{0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
if (lut_numCnInCnGroups[7] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[7]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[7]);
// Loop over every BN
fprintf(fd," for (int j=0;j<10;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG10[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
// =====================================================================
// Process group with 19 BNs
fprintf(fd,"//Process group with 19 BNs\n");
// Offset is 4*384/32 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,192,240,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,240,288,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,288,336,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,336,384,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,384,432,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,432,480,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,480,528,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,528,576,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,576,624,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,624,672,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,672,720,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,720,768,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,768,816,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,816,864}, {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,864},
{0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3
fprintf(fd," p_cnProcBuf = (__m512i*) &cnProcBuf [%d];\n", lut_startAddrCnGroups[8]);
fprintf(fd," p_cnProcBufRes = (__m512i*) &cnProcBufRes[%d];\n", lut_startAddrCnGroups[8]);
// Loop over every BN
fprintf(fd," for (int j=0;j<11;j++) {\n");
fprintf(fd," p_cnProcBufResBit = p_cnProcBufRes + %d;\n", (j*bitOffsetInGroup));
fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][0]/2));
fprintf(fd," sgn = _mm512_xor_si512(*p_ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over BNs
for (k=1; k<18; k++)
{
fprintf(fd," zmm0 = p_cnProcBuf [%d+i];\n",(lut_idxCnProcG19[j][k]/2));
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
fprintf(fd," *p_cnProcBufResBit = conditional_negate(min, sgn,zeros);\n");
fprintf(fd," p_cnProcBufResBit++;\n");
fprintf(fd," }\n");
fprintf(fd,"}\n");
}
fprintf(fd,"}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
@@ -11,16 +11,12 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [3456]; p_llrRes = (__m256i*) &llrRes [3456];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[12]; p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [3456]; p_llrRes = (__m256i*) &llrRes [3456];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[12 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 3 CNs // Process group with 3 CNs
M = (5*Z + 31)>>5; M = (5*Z + 31)>>5;
@@ -29,23 +25,17 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [3840]; p_llrRes = (__m256i*) &llrRes [3840];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[60]; p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [3840]; p_llrRes = (__m256i*) &llrRes [3840];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[60 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[120]; p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [3840]; p_llrRes = (__m256i*) &llrRes [3840];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[120 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 4 CNs // Process group with 4 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -54,30 +44,22 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [5760]; p_llrRes = (__m256i*) &llrRes [5760];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[36]; p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [5760]; p_llrRes = (__m256i*) &llrRes [5760];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[36 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[72]; p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [5760]; p_llrRes = (__m256i*) &llrRes [5760];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[72 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[108]; p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [5760]; p_llrRes = (__m256i*) &llrRes [5760];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[108 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (7*Z + 31)>>5; M = (7*Z + 31)>>5;
@@ -86,37 +68,27 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [6912]; p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[84]; p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [6912]; p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[84 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[168]; p_res = &p_bnProcBufRes[168];
p_llrRes = (__m256i*) &llrRes [6912]; p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[168 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[252]; p_res = &p_bnProcBufRes[252];
p_llrRes = (__m256i*) &llrRes [6912]; p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[252 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[252 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[336]; p_res = &p_bnProcBufRes[336];
p_llrRes = (__m256i*) &llrRes [6912]; p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[336 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[336 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
M = (8*Z + 31)>>5; M = (8*Z + 31)>>5;
@@ -125,44 +97,32 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[96]; p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[96 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[192]; p_res = &p_bnProcBufRes[192];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[192 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[288]; p_res = &p_bnProcBufRes[288];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[288 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[288 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[384]; p_res = &p_bnProcBufRes[384];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[384 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[384 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[480]; p_res = &p_bnProcBufRes[480];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[480 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[480 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 7 CNs // Process group with 7 CNs
// Process group with 8 CNs // Process group with 8 CNs
@@ -175,79 +135,57 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[12]; p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[12 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[24]; p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[24 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[36]; p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[36 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[48]; p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[48 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[60]; p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[60 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[72]; p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[72 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[84]; p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[84 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[96]; p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[96 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[108]; p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[108 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[120]; p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [12672]; p_llrRes = (__m256i*) &llrRes [12672];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[120 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 12 CNs // Process group with 12 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -256,86 +194,62 @@ static inline void nrLDPC_bnProc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[12]; p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[12 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[24]; p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[24 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[36]; p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[36 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[48]; p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[48 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[60]; p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[60 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[72]; p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[72 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[84]; p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[84 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[96]; p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[96 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[108]; p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[108 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[120]; p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[120 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[132]; p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [13056]; p_llrRes = (__m256i*) &llrRes [13056];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[132 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 13 CNs // Process group with 13 CNs
// Process group with 14 CNs // Process group with 14 CNs
@@ -11,16 +11,12 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [384]; p_llrRes = (__m256i*) &llrRes [384];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[36]; p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [384]; p_llrRes = (__m256i*) &llrRes [384];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[36 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 3 CNs // Process group with 3 CNs
M = (21*Z + 31)>>5; M = (21*Z + 31)>>5;
@@ -29,23 +25,17 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [1536]; p_llrRes = (__m256i*) &llrRes [1536];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[252]; p_res = &p_bnProcBufRes[252];
p_llrRes = (__m256i*) &llrRes [1536]; p_llrRes = (__m256i*) &llrRes [1536];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[252 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[252 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[504]; p_res = &p_bnProcBufRes[504];
p_llrRes = (__m256i*) &llrRes [1536]; p_llrRes = (__m256i*) &llrRes [1536];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[504 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[504 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 4 CNs // Process group with 4 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -54,30 +44,22 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[12]; p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[12 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[24]; p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[24 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[36]; p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [9600]; p_llrRes = (__m256i*) &llrRes [9600];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[36 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -86,37 +68,27 @@ static inline void nrLDPC_bnProc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBu
p_res = &p_bnProcBufRes[0]; p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [9984]; p_llrRes = (__m256i*) &llrRes [9984];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[0 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[12]; p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [9984]; p_llrRes = (__m256i*) &llrRes [9984];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[12 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[24]; p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [9984]; p_llrRes = (__m256i*) &llrRes [9984];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[24 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[36]; p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [9984]; p_llrRes = (__m256i*) &llrRes [9984];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[36 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
p_res++;
p_llrRes++;
} }
p_res = &p_bnProcBufRes[48]; p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [9984]; p_llrRes = (__m256i*) &llrRes [9984];
for (i=0;i<M;i++) { for (i=0;i<M;i++) {
*p_res = _mm256_subs_epi8(*p_llrRes, p_bnProcBuf[48 + i]); p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
p_res++;
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
// Process group with 7 CNs // Process group with 7 CNs
@@ -0,0 +1,440 @@
#include <stdint.h>
#include <immintrin.h>
void nrLDPC_bnProc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {
__m256i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m256i* p_llrRes;
__m256i* p_res;
uint32_t M, i;
// Process group with 2 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [6912];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [6912];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [6912];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
// Process group with 3 CNs
// Process group with 4 CNs
M = (2*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [7680];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [7680];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [7296];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [7296];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [7296];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [7296];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
// Process group with 5 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [10752];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [10752];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [8064];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [8064];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [8064];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [8064];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [8064];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
// Process group with 6 CNs
M = (5*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [12672];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [12672];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [8448];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [8448];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [8448];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[180];
p_llrRes = (__m256i*) &llrRes [8448];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]);
}
p_res = &p_bnProcBufRes[240];
p_llrRes = (__m256i*) &llrRes [8448];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[240 + i]);
}
p_res = &p_bnProcBufRes[300];
p_llrRes = (__m256i*) &llrRes [8448];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[300 + i]);
}
// Process group with 7 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [24192];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [24192];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [10368];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
// Process group with 8 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [26880];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [26880];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [10752];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
// Process group with 9 CNs
// Process group with 10 CNs
// Process group with 11 CNs
// Process group with 12 CNs
// Process group with 13 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [29952];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [29952];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [11136];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
// Process group with 14 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [34944];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [34944];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[156];
p_llrRes = (__m256i*) &llrRes [11520];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]);
}
// Process group with 15 CNs
// Process group with 16 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [40320];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [40320];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[156];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]);
}
p_res = &p_bnProcBufRes[168];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]);
}
p_res = &p_bnProcBufRes[180];
p_llrRes = (__m256i*) &llrRes [11904];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]);
}
// Process group with 17 CNs
// Process group with 18 CNs
// Process group with 19 CNs
// Process group with 20 CNs
// Process group with 21 CNs
// Process group with 22 CNs
// Process group with <23 CNs
// Process group with 24 CNs
// Process group with 25 CNs
// Process group with 26 CNs
// Process group with 27 CNs
// Process group with 28 CNs
// Process group with 29 CNs
// Process group with 30 CNs
}
@@ -0,0 +1,799 @@
#include <stdint.h>
#include <immintrin.h>
void nrLDPC_bnProc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {
__m256i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m256i* p_llrRes;
__m256i* p_res;
uint32_t M, i;
// Process group with 2 CNs
// Process group with 3 CNs
// Process group with 4 CNs
// Process group with 5 CNs
M = (2*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [14592];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [14592];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [14592];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [14592];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [14592];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [14592];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [14592];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
// Process group with 6 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [18432];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [18432];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [15360];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [15360];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [15360];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [15360];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [15360];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [15360];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
// Process group with 7 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [20736];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [20736];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [15744];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
// Process group with 8 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [23424];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [23424];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [16128];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
// Process group with 9 CNs
M = (2*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [26496];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [26496];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[168];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]);
}
p_res = &p_bnProcBufRes[192];
p_llrRes = (__m256i*) &llrRes [16512];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]);
}
// Process group with 10 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [33408];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [33408];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [17280];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
// Process group with 11 CNs
// Process group with 12 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [37248];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [37248];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [17664];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
// Process group with 13 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [41856];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [41856];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [18048];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
// Process group with 14 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [46848];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [46848];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[156];
p_llrRes = (__m256i*) &llrRes [18432];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]);
}
// Process group with 15 CNs
// Process group with 16 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [52224];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [52224];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[156];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]);
}
p_res = &p_bnProcBufRes[168];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]);
}
p_res = &p_bnProcBufRes[180];
p_llrRes = (__m256i*) &llrRes [18816];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]);
}
// Process group with 17 CNs
// Process group with 18 CNs
// Process group with 19 CNs
// Process group with 20 CNs
// Process group with 21 CNs
// Process group with 22 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [58368];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [58368];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[156];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]);
}
p_res = &p_bnProcBufRes[168];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]);
}
p_res = &p_bnProcBufRes[180];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]);
}
p_res = &p_bnProcBufRes[192];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]);
}
p_res = &p_bnProcBufRes[204];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[204 + i]);
}
p_res = &p_bnProcBufRes[216];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[216 + i]);
}
p_res = &p_bnProcBufRes[228];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[228 + i]);
}
p_res = &p_bnProcBufRes[240];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[240 + i]);
}
p_res = &p_bnProcBufRes[252];
p_llrRes = (__m256i*) &llrRes [19200];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[252 + i]);
}
// Process group with <23 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [66816];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [66816];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[84];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[84 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
p_res = &p_bnProcBufRes[132];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[132 + i]);
}
p_res = &p_bnProcBufRes[144];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[144 + i]);
}
p_res = &p_bnProcBufRes[156];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[156 + i]);
}
p_res = &p_bnProcBufRes[168];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[168 + i]);
}
p_res = &p_bnProcBufRes[180];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[180 + i]);
}
p_res = &p_bnProcBufRes[192];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[192 + i]);
}
p_res = &p_bnProcBufRes[204];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[204 + i]);
}
p_res = &p_bnProcBufRes[216];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[216 + i]);
}
p_res = &p_bnProcBufRes[228];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[228 + i]);
}
p_res = &p_bnProcBufRes[240];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[240 + i]);
}
p_res = &p_bnProcBufRes[252];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[252 + i]);
}
p_res = &p_bnProcBufRes[264];
p_llrRes = (__m256i*) &llrRes [19584];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[264 + i]);
}
// Process group with 24 CNs
// Process group with 25 CNs
// Process group with 26 CNs
// Process group with 27 CNs
// Process group with 28 CNs
// Process group with 29 CNs
// Process group with 30 CNs
}
@@ -0,0 +1,153 @@
#include <stdint.h>
#include <immintrin.h>
void nrLDPC_bnProc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {
__m256i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m256i* p_llrRes;
__m256i* p_res;
uint32_t M, i;
// Process group with 2 CNs
M = (3*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [1152];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [1152];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [1152];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [1152];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
// Process group with 3 CNs
M = (5*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [3456];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [3456];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [2304];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [2304];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
p_res = &p_bnProcBufRes[120];
p_llrRes = (__m256i*) &llrRes [2304];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[120 + i]);
}
// Process group with 4 CNs
M = (3*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [9216];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [9216];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [4224];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [4224];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [4224];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[108];
p_llrRes = (__m256i*) &llrRes [4224];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[108 + i]);
}
// Process group with 5 CNs
M = (2*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [13824];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [13824];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [5376];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [5376];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [5376];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[72];
p_llrRes = (__m256i*) &llrRes [5376];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[72 + i]);
}
p_res = &p_bnProcBufRes[96];
p_llrRes = (__m256i*) &llrRes [5376];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[96 + i]);
}
// Process group with 6 CNs
M = (1*Z + 31)>>5;
p_bnProcBuf = (__m256i*) &bnProcBuf [17664];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [17664];
p_res = &p_bnProcBufRes[0];
p_llrRes = (__m256i*) &llrRes [6144];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[0 + i]);
}
p_res = &p_bnProcBufRes[12];
p_llrRes = (__m256i*) &llrRes [6144];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[12 + i]);
}
p_res = &p_bnProcBufRes[24];
p_llrRes = (__m256i*) &llrRes [6144];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[24 + i]);
}
p_res = &p_bnProcBufRes[36];
p_llrRes = (__m256i*) &llrRes [6144];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[36 + i]);
}
p_res = &p_bnProcBufRes[48];
p_llrRes = (__m256i*) &llrRes [6144];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[48 + i]);
}
p_res = &p_bnProcBufRes[60];
p_llrRes = (__m256i*) &llrRes [6144];
for (i=0;i<M;i++) {
p_res[i] = _mm256_subs_epi8(p_llrRes[i], p_bnProcBuf[60 + i]);
}
// Process group with 7 CNs
// Process group with 8 CNs
// Process group with 9 CNs
// Process group with 10 CNs
// Process group with 11 CNs
// Process group with 12 CNs
// Process group with 13 CNs
// Process group with 14 CNs
// Process group with 15 CNs
// Process group with 16 CNs
// Process group with 17 CNs
// Process group with 18 CNs
// Process group with 19 CNs
// Process group with 20 CNs
// Process group with 21 CNs
// Process group with 22 CNs
// Process group with <23 CNs
// Process group with 24 CNs
// Process group with 25 CNs
// Process group with 26 CNs
// Process group with 27 CNs
// Process group with 28 CNs
// Process group with 29 CNs
// Process group with 30 CNs
}
@@ -1,29 +1,23 @@
static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {
__m256i ymm0, ymm1, ymmRes0, ymmRes1; __m256i ymm0, ymm1, ymmRes0, ymmRes1;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
__m256i* p_llrProcBuf256;
__m256i* p_llrRes; __m256i* p_llrRes;
uint32_t M ; uint32_t M ;
// Process group with 1 CNs // Process group with 1 CNs
M = (0*Z + 31)>>5; M = (42*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [0]; p_bnProcBuf = (__m128i*) &bnProcBuf [0];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [0];
p_llrProcBuf = (__m128i*) &llrProcBuf [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0];
p_llrProcBuf256 = (__m256i*) &llrProcBuf [0];
p_llrRes = (__m256i*) &llrRes [0]; p_llrRes = (__m256i*) &llrRes [0];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
p_bnProcBufRes[i] = p_llrProcBuf256[i];
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymmRes0 = _mm256_adds_epi16(ymm0, ymm1); ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymm0, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 2 CNs // Process group with 2 CNs
// Process group with 3 CNs // Process group with 3 CNs
@@ -52,8 +46,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -84,8 +77,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
M = (2*Z + 31)>>5; M = (2*Z + 31)>>5;
@@ -120,8 +112,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 7 CNs // Process group with 7 CNs
M = (4*Z + 31)>>5; M = (4*Z + 31)>>5;
@@ -160,8 +151,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 8 CNs // Process group with 8 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -204,8 +194,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 9 CNs // Process group with 9 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -252,8 +241,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 10 CNs // Process group with 10 CNs
M = (4*Z + 31)>>5; M = (4*Z + 31)>>5;
@@ -304,8 +292,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 11 CNs // Process group with 11 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -360,8 +347,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 12 CNs // Process group with 12 CNs
M = (4*Z + 31)>>5; M = (4*Z + 31)>>5;
@@ -420,8 +406,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 13 CNs // Process group with 13 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -484,8 +469,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 14 CNs // Process group with 14 CNs
// Process group with 15 CNs // Process group with 15 CNs
@@ -622,8 +606,7 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 29 CNs // Process group with 29 CNs
// Process group with 30 CNs // Process group with 30 CNs
@@ -755,7 +738,6 @@ static inline void nrLDPC_bnProcPc_BG1_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
} }
@@ -1,29 +1,23 @@
static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {
__m256i ymm0, ymm1, ymmRes0, ymmRes1; __m256i ymm0, ymm1, ymmRes0, ymmRes1;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
__m256i* p_llrProcBuf256;
__m256i* p_llrRes; __m256i* p_llrRes;
uint32_t M ; uint32_t M ;
// Process group with 1 CNs // Process group with 1 CNs
M = (0*Z + 31)>>5; M = (9*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [0]; p_bnProcBuf = (__m128i*) &bnProcBuf [0];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [0];
p_llrProcBuf = (__m128i*) &llrProcBuf [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0];
p_llrProcBuf256 = (__m256i*) &llrProcBuf [0];
p_llrRes = (__m256i*) &llrRes [0]; p_llrRes = (__m256i*) &llrRes [0];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
p_bnProcBufRes[i] = p_llrProcBuf256[i];
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymmRes0 = _mm256_adds_epi16(ymm0, ymm1); ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymm0, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 2 CNs // Process group with 2 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
p_llrRes = (__m256i*) &llrRes [3456]; p_llrRes = (__m256i*) &llrRes [3456];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j]);
ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j +1]);
@@ -42,8 +36,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 3 CNs // Process group with 3 CNs
M = (5*Z + 31)>>5; M = (5*Z + 31)>>5;
@@ -66,8 +59,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 4 CNs // Process group with 4 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -94,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (7*Z + 31)>>5; M = (7*Z + 31)>>5;
@@ -126,8 +117,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
M = (8*Z + 31)>>5; M = (8*Z + 31)>>5;
@@ -162,8 +152,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 7 CNs // Process group with 7 CNs
// Process group with 8 CNs // Process group with 8 CNs
@@ -222,8 +211,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 12 CNs // Process group with 12 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -282,8 +270,7 @@ static inline void nrLDPC_bnProcPc_BG1_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 13 CNs // Process group with 13 CNs
// Process group with 14 CNs // Process group with 14 CNs
@@ -1,29 +1,23 @@
static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {
__m256i ymm0, ymm1, ymmRes0, ymmRes1; __m256i ymm0, ymm1, ymmRes0, ymmRes1;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
__m256i* p_llrProcBuf256;
__m256i* p_llrRes; __m256i* p_llrRes;
uint32_t M ; uint32_t M ;
// Process group with 1 CNs // Process group with 1 CNs
M = (0*Z + 31)>>5; M = (1*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [0]; p_bnProcBuf = (__m128i*) &bnProcBuf [0];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [0];
p_llrProcBuf = (__m128i*) &llrProcBuf [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0];
p_llrProcBuf256 = (__m256i*) &llrProcBuf [0];
p_llrRes = (__m256i*) &llrRes [0]; p_llrRes = (__m256i*) &llrRes [0];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
p_bnProcBufRes[i] = p_llrProcBuf256[i];
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymmRes0 = _mm256_adds_epi16(ymm0, ymm1); ymm0 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymm0, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 2 CNs // Process group with 2 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc
p_llrRes = (__m256i*) &llrRes [384]; p_llrRes = (__m256i*) &llrRes [384];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j]);
ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j +1]);
@@ -42,8 +36,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 3 CNs // Process group with 3 CNs
M = (21*Z + 31)>>5; M = (21*Z + 31)>>5;
@@ -66,8 +59,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 4 CNs // Process group with 4 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -94,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -126,8 +117,7 @@ static inline void nrLDPC_bnProcPc_BG1_R89_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
// Process group with 7 CNs // Process group with 7 CNs
@@ -1,29 +1,23 @@
static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {
__m256i ymm0, ymm1, ymmRes0, ymmRes1; __m256i ymm0, ymm1, ymmRes0, ymmRes1;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
__m256i* p_llrProcBuf256;
__m256i* p_llrRes; __m256i* p_llrRes;
uint32_t M ; uint32_t M ;
// Process group with 1 CNs // Process group with 1 CNs
M = (0*Z + 31)>>5; M = (18*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [0]; p_bnProcBuf = (__m128i*) &bnProcBuf [0];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [0];
p_llrProcBuf = (__m128i*) &llrProcBuf [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0];
p_llrProcBuf256 = (__m256i*) &llrProcBuf [0];
p_llrRes = (__m256i*) &llrRes [0]; p_llrRes = (__m256i*) &llrRes [0];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
p_bnProcBufRes[i] = p_llrProcBuf256[i];
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
ymmRes0 = _mm256_adds_epi16(ymm0, ymm1); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j+1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymm0, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 2 CNs // Process group with 2 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
p_llrRes = (__m256i*) &llrRes [6912]; p_llrRes = (__m256i*) &llrRes [6912];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j]);
ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j +1]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[24 + j +1]);
@@ -42,8 +36,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 3 CNs // Process group with 3 CNs
// Process group with 4 CNs // Process group with 4 CNs
@@ -71,8 +64,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -103,8 +95,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
M = (5*Z + 31)>>5; M = (5*Z + 31)>>5;
@@ -139,8 +130,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 7 CNs // Process group with 7 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -179,8 +169,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 8 CNs // Process group with 8 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -223,8 +212,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 9 CNs // Process group with 9 CNs
// Process group with 10 CNs // Process group with 10 CNs
@@ -291,8 +279,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 14 CNs // Process group with 14 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -359,8 +346,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 15 CNs // Process group with 15 CNs
// Process group with 16 CNs // Process group with 16 CNs
@@ -436,8 +422,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 17 CNs // Process group with 17 CNs
// Process group with 18 CNs // Process group with 18 CNs
@@ -445,7 +430,7 @@ static inline void nrLDPC_bnProcPc_BG2_R13_AVX2(int8_t* bnProcBuf,int8_t* bnProc
// Process group with 20 CNs // Process group with 20 CNs
// Process group with 21 CNs // Process group with 21 CNs
// Process group with 22 CNs // Process group with 22 CNs
// Process group with 23 CNs // Process group with <23 CNs
// Process group with 24 CNs // Process group with 24 CNs
// Process group with 25 CNs // Process group with 25 CNs
// Process group with 26 CNs // Process group with 26 CNs
@@ -1,29 +1,23 @@
static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {
__m256i ymm0, ymm1, ymmRes0, ymmRes1; __m256i ymm0, ymm1, ymmRes0, ymmRes1;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
__m256i* p_llrProcBuf256;
__m256i* p_llrRes; __m256i* p_llrRes;
uint32_t M ; uint32_t M ;
// Process group with 1 CNs // Process group with 1 CNs
M = (0*Z + 31)>>5; M = (38*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [0]; p_bnProcBuf = (__m128i*) &bnProcBuf [0];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [0];
p_llrProcBuf = (__m128i*) &llrProcBuf [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0];
p_llrProcBuf256 = (__m256i*) &llrProcBuf [0];
p_llrRes = (__m256i*) &llrRes [0]; p_llrRes = (__m256i*) &llrRes [0];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
p_bnProcBufRes[i] = p_llrProcBuf256[i];
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
ymmRes0 = _mm256_adds_epi16(ymm0, ymm1); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j+1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymm0, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 2 CNs // Process group with 2 CNs
// Process group with 3 CNs // Process group with 3 CNs
@@ -57,8 +51,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -93,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 7 CNs // Process group with 7 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -133,8 +125,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 8 CNs // Process group with 8 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -177,8 +168,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 9 CNs // Process group with 9 CNs
M = (2*Z + 31)>>5; M = (2*Z + 31)>>5;
@@ -225,8 +215,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 10 CNs // Process group with 10 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -277,8 +266,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 11 CNs // Process group with 11 CNs
// Process group with 12 CNs // Process group with 12 CNs
@@ -338,8 +326,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 13 CNs // Process group with 13 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -402,8 +389,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 14 CNs // Process group with 14 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -470,8 +456,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 15 CNs // Process group with 15 CNs
// Process group with 16 CNs // Process group with 16 CNs
@@ -547,8 +532,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 17 CNs // Process group with 17 CNs
// Process group with 18 CNs // Process group with 18 CNs
@@ -652,10 +636,9 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 23 CNs // Process group with <23 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [66816]; p_bnProcBuf = (__m128i*) &bnProcBuf [66816];
p_llrProcBuf = (__m128i*) &llrProcBuf [19584]; p_llrProcBuf = (__m128i*) &llrProcBuf [19584];
@@ -756,8 +739,7 @@ static inline void nrLDPC_bnProcPc_BG2_R15_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 24 CNs // Process group with 24 CNs
// Process group with 25 CNs // Process group with 25 CNs
@@ -1,29 +1,23 @@
static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) { static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {
__m256i ymm0, ymm1, ymmRes0, ymmRes1; __m256i ymm0, ymm1, ymmRes0, ymmRes1;
__m128i* p_bnProcBuf; __m128i* p_bnProcBuf;
__m256i* p_bnProcBufRes;
__m128i* p_llrProcBuf; __m128i* p_llrProcBuf;
__m256i* p_llrProcBuf256;
__m256i* p_llrRes; __m256i* p_llrRes;
uint32_t M ; uint32_t M ;
// Process group with 1 CNs // Process group with 1 CNs
M = (0*Z + 31)>>5; M = (3*Z + 31)>>5;
p_bnProcBuf = (__m128i*) &bnProcBuf [0]; p_bnProcBuf = (__m128i*) &bnProcBuf [0];
p_bnProcBufRes = (__m256i*) &bnProcBufRes [0];
p_llrProcBuf = (__m128i*) &llrProcBuf [0]; p_llrProcBuf = (__m128i*) &llrProcBuf [0];
p_llrProcBuf256 = (__m256i*) &llrProcBuf [0];
p_llrRes = (__m256i*) &llrRes [0]; p_llrRes = (__m256i*) &llrRes [0];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
p_bnProcBufRes[i] = p_llrProcBuf256[i];
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]);
ymmRes0 = _mm256_adds_epi16(ymm0, ymm1); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[j+1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j+1]); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j+1]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymm0, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 2 CNs // Process group with 2 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -32,7 +26,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
p_llrRes = (__m256i*) &llrRes [1152]; p_llrRes = (__m256i*) &llrRes [1152];
for (int i=0,j=0;i<M;i++,j+=2) { for (int i=0,j=0;i<M;i++,j+=2) {
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf [j]);
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[j + 1]);
ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j]); ymm0 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j]);
ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0); ymmRes0 = _mm256_adds_epi16(ymmRes0, ymm0);
ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j +1]); ymm1 = _mm256_cvtepi8_epi16(p_bnProcBuf[72 + j +1]);
@@ -42,8 +36,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 3 CNs // Process group with 3 CNs
M = (5*Z + 31)>>5; M = (5*Z + 31)>>5;
@@ -66,8 +59,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 4 CNs // Process group with 4 CNs
M = (3*Z + 31)>>5; M = (3*Z + 31)>>5;
@@ -94,8 +86,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 5 CNs // Process group with 5 CNs
M = (2*Z + 31)>>5; M = (2*Z + 31)>>5;
@@ -126,8 +117,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 6 CNs // Process group with 6 CNs
M = (1*Z + 31)>>5; M = (1*Z + 31)>>5;
@@ -162,8 +152,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]); ymm1 = _mm256_cvtepi8_epi16(p_llrProcBuf[j +1 ]);
ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1); ymmRes1 = _mm256_adds_epi16(ymmRes1, ymm1);
ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1); ymm0 = _mm256_packs_epi16(ymmRes0, ymmRes1);
*p_llrRes = _mm256_permute4x64_epi64(ymm0, 0xD8); p_llrRes[i] = _mm256_permute4x64_epi64(ymm0, 0xD8);
p_llrRes++;
} }
// Process group with 7 CNs // Process group with 7 CNs
// Process group with 8 CNs // Process group with 8 CNs
@@ -181,7 +170,7 @@ static inline void nrLDPC_bnProcPc_BG2_R23_AVX2(int8_t* bnProcBuf,int8_t* bnProc
// Process group with 20 CNs // Process group with 20 CNs
// Process group with 21 CNs // Process group with 21 CNs
// Process group with 22 CNs // Process group with 22 CNs
// Process group with 23 CNs // Process group with <23 CNs
// Process group with 24 CNs // Process group with 24 CNs
// Process group with 25 CNs // Process group with 25 CNs
// Process group with 26 CNs // Process group with 26 CNs
@@ -460,7 +460,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -485,7 +485,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -510,7 +510,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -535,7 +535,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -560,7 +560,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2424+i]; ymm0 = ((__m256i*)cnProcBuf)[2424+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -613,7 +613,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2520+i]; ymm0 = ((__m256i*)cnProcBuf)[2520+i];
@@ -638,7 +638,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -211,7 +211,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -236,7 +236,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -261,7 +261,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -286,7 +286,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -311,7 +311,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2424+i]; ymm0 = ((__m256i*)cnProcBuf)[2424+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -364,7 +364,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2520+i]; ymm0 = ((__m256i*)cnProcBuf)[2520+i];
@@ -389,7 +389,7 @@ M = (2*Z + 31)>>5;
ymm0 = ((__m256i*)cnProcBuf)[2448+i]; ymm0 = ((__m256i*)cnProcBuf)[2448+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2464+i]; ymm0 = ((__m256i*)cnProcBuf)[2472+i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0)); min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0); sgn = _mm256_sign_epi8(sgn, ymm0);
ymm0 = ((__m256i*)cnProcBuf)[2496+i]; ymm0 = ((__m256i*)cnProcBuf)[2496+i];
@@ -460,7 +460,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -485,7 +485,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -510,7 +510,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -535,7 +535,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -560,7 +560,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1212+i]; zmm0 = ((__m512i*)cnProcBuf)[1212+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -613,7 +613,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1260+i]; zmm0 = ((__m512i*)cnProcBuf)[1260+i];
@@ -638,7 +638,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -211,7 +211,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -236,7 +236,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -261,7 +261,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -286,7 +286,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -311,7 +311,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1212+i]; zmm0 = ((__m512i*)cnProcBuf)[1212+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -364,7 +364,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1260+i]; zmm0 = ((__m512i*)cnProcBuf)[1260+i];
@@ -389,7 +389,7 @@ M = (2*Z + 63)>>6;
zmm0 = ((__m512i*)cnProcBuf)[1224+i]; zmm0 = ((__m512i*)cnProcBuf)[1224+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1232+i]; zmm0 = ((__m512i*)cnProcBuf)[1236+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1248+i]; zmm0 = ((__m512i*)cnProcBuf)[1248+i];
@@ -1,15 +1,17 @@
#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a) #define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)
static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {
uint32_t M; uint32_t M;
__m512i zmm0, min, sgn,zeros,maxLLR; __m512i zmm0, min, sgn,zeros,ones,maxLLR;
zeros = _mm512_setzero_si512(); zeros = _mm512_setzero_si512();
maxLLR = _mm512_set1_epi8((char)127); maxLLR = _mm512_set1_epi8((char)127);
ones = _mm512_set1_epi8((char)1);
//Process group with 3 BNs //Process group with 3 BNs
//Process group with 4 BNs //Process group with 4 BNs
M = (8*Z + 63)>>6; M = (8*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[348+i]; zmm0 = ((__m512i*)cnProcBuf)[348+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -20,8 +22,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[108+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[108+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[348+i]; zmm0 = ((__m512i*)cnProcBuf)[348+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -32,8 +35,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[228+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[228+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -44,8 +48,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[348+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[348+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -58,8 +63,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 5 BNs //Process group with 5 BNs
M = (7*Z + 63)>>6; M = (7*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[696+i]; zmm0 = ((__m512i*)cnProcBuf)[696+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -73,8 +79,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[588+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[588+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[696+i]; zmm0 = ((__m512i*)cnProcBuf)[696+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -88,8 +95,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[642+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[642+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -103,8 +111,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[696+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[696+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -118,8 +127,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[750+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[750+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -135,8 +145,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 6 BNs //Process group with 6 BNs
M = (3*Z + 63)>>6; M = (3*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[894+i]; zmm0 = ((__m512i*)cnProcBuf)[894+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -153,8 +164,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[858+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[858+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[894+i]; zmm0 = ((__m512i*)cnProcBuf)[894+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -171,8 +183,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[876+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[876+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -189,8 +202,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[894+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[894+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -207,8 +221,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[912+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[912+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -225,8 +240,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[930+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[930+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -245,8 +261,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 8 BNs //Process group with 8 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[990+i]; zmm0 = ((__m512i*)cnProcBuf)[990+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -269,8 +286,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[966+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[966+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[990+i]; zmm0 = ((__m512i*)cnProcBuf)[990+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -293,8 +311,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[978+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[978+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -317,8 +336,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[990+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[990+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -341,8 +361,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1002+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1002+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -365,8 +386,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1014+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1014+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -389,8 +411,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1026+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1026+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -413,8 +436,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1038+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1038+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -439,8 +463,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 10 BNs //Process group with 10 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1086+i]; zmm0 = ((__m512i*)cnProcBuf)[1086+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -469,8 +494,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1062+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1062+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1086+i]; zmm0 = ((__m512i*)cnProcBuf)[1086+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -499,8 +525,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1074+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1074+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -529,8 +556,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1086+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1086+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -559,8 +587,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1098+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1098+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -589,8 +618,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1110+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1110+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -619,8 +649,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1122+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1122+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -649,8 +680,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1134+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1134+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -679,8 +711,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1146+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1146+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -709,8 +742,9 @@ static inline void nrLDPC_cnProc_BG2_R13_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1158+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1158+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -1,64 +1,48 @@
#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a) #define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)
static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {
uint32_t M; uint32_t M;
__m512i zmm0, min, sgn,zeros,maxLLR; __m512i zmm0, min, sgn,zeros,ones,maxLLR;
zeros = _mm512_setzero_si512(); zeros = _mm512_setzero_si512();
maxLLR = _mm512_set1_epi8((char)127); maxLLR = _mm512_set1_epi8((char)127);
ones = _mm512_set1_epi8((char)1);
//Process group with 3 BNs //Process group with 3 BNs
M = (20*Z + 63)>>6; M = (6*Z + 63)>>6;
for (int i=0;i<M;i+=2) { for (int i=0;i<M;i++) {
zmm0 = ((__m512i*)cnProcBuf)[36+i]; zmm0 = ((__m512i*)cnProcBuf)[36+i];
sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0); min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[72+i]; zmm0 = ((__m512i*)cnProcBuf)[72+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
min = _mm512_min_epu8(min, maxLLR); min = _mm512_min_epu8(min, maxLLR);
((__m512i*)cnProcBufRes)[0+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[0+i] = conditional_negate(min, sgn,zeros);
sgn = ((__m512i*)cnProcBuf)[37+i];
min = _mm512_abs_epi8(sgn);
zmm0 = ((__m512i*)cnProcBuf)[73+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0);
min = _mm512_min_epu8(min, maxLLR);
((__m512i*)cnProcBufRes)[1+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i+=2) { for (int i=0;i<M;i++) {
zmm0 = ((__m512i*)cnProcBuf)[0+i]; zmm0 = ((__m512i*)cnProcBuf)[0+i];
sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0); min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[72+i]; zmm0 = ((__m512i*)cnProcBuf)[72+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
min = _mm512_min_epu8(min, maxLLR); min = _mm512_min_epu8(min, maxLLR);
((__m512i*)cnProcBufRes)[36+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[36+i] = conditional_negate(min, sgn,zeros);
sgn = ((__m512i*)cnProcBuf)[1+i];
min = _mm512_abs_epi8(sgn);
zmm0 = ((__m512i*)cnProcBuf)[73+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0);
min = _mm512_min_epu8(min, maxLLR);
((__m512i*)cnProcBufRes)[37+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i+=2) { for (int i=0;i<M;i++) {
zmm0 = ((__m512i*)cnProcBuf)[0+i]; zmm0 = ((__m512i*)cnProcBuf)[0+i];
sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0); min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[36+i]; zmm0 = ((__m512i*)cnProcBuf)[36+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
min = _mm512_min_epu8(min, maxLLR); min = _mm512_min_epu8(min, maxLLR);
((__m512i*)cnProcBufRes)[72+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[72+i] = conditional_negate(min, sgn,zeros);
sgn = ((__m512i*)cnProcBuf)[1+i];
min = _mm512_abs_epi8(sgn);
zmm0 = ((__m512i*)cnProcBuf)[37+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0);
min = _mm512_min_epu8(min, maxLLR);
((__m512i*)cnProcBufRes)[73+i] = conditional_negate(min, sgn,zeros);
} }
//Process group with 4 BNs //Process group with 4 BNs
M = (20*Z + 63)>>6; M = (20*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[348+i]; zmm0 = ((__m512i*)cnProcBuf)[348+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -69,8 +53,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[108+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[108+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[348+i]; zmm0 = ((__m512i*)cnProcBuf)[348+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -81,8 +66,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[228+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[228+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -93,8 +79,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[348+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[348+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -107,8 +94,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 5 BNs //Process group with 5 BNs
M = (9*Z + 63)>>6; M = (9*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[696+i]; zmm0 = ((__m512i*)cnProcBuf)[696+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -122,8 +110,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[588+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[588+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[696+i]; zmm0 = ((__m512i*)cnProcBuf)[696+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -137,8 +126,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[642+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[642+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -152,8 +142,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[696+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[696+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -167,8 +158,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[750+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[750+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[588+i]; zmm0 = ((__m512i*)cnProcBuf)[588+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[642+i]; zmm0 = ((__m512i*)cnProcBuf)[642+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -184,8 +176,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 6 BNs //Process group with 6 BNs
M = (3*Z + 63)>>6; M = (3*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[894+i]; zmm0 = ((__m512i*)cnProcBuf)[894+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -202,8 +195,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[858+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[858+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[894+i]; zmm0 = ((__m512i*)cnProcBuf)[894+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -220,8 +214,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[876+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[876+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -238,8 +233,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[894+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[894+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -256,8 +252,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[912+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[912+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -274,8 +271,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[930+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[930+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -294,8 +292,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 8 BNs //Process group with 8 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[990+i]; zmm0 = ((__m512i*)cnProcBuf)[990+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -318,8 +317,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[966+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[966+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[990+i]; zmm0 = ((__m512i*)cnProcBuf)[990+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -342,8 +342,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[978+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[978+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -366,8 +367,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[990+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[990+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -390,8 +392,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1002+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1002+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -414,8 +417,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1014+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1014+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -438,8 +442,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1026+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1026+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -462,8 +467,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1038+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1038+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -488,8 +494,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 10 BNs //Process group with 10 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1086+i]; zmm0 = ((__m512i*)cnProcBuf)[1086+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -518,8 +525,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1062+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1062+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1086+i]; zmm0 = ((__m512i*)cnProcBuf)[1086+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -548,8 +556,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1074+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1074+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -578,8 +587,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1086+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1086+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -608,8 +618,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1098+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1098+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -638,8 +649,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1110+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1110+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -668,8 +680,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1122+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1122+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -698,8 +711,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1134+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1134+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -728,8 +742,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1146+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1146+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -758,8 +773,9 @@ static inline void nrLDPC_cnProc_BG2_R15_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1158+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1158+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -1,15 +1,17 @@
#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a) #define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)
static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) { static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {
uint32_t M; uint32_t M;
__m512i zmm0, min, sgn,zeros,maxLLR; __m512i zmm0, min, sgn,zeros,ones,maxLLR;
zeros = _mm512_setzero_si512(); zeros = _mm512_setzero_si512();
maxLLR = _mm512_set1_epi8((char)127); maxLLR = _mm512_set1_epi8((char)127);
ones = _mm512_set1_epi8((char)1);
//Process group with 3 BNs //Process group with 3 BNs
//Process group with 4 BNs //Process group with 4 BNs
M = (1*Z + 63)>>6; M = (1*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[348+i]; zmm0 = ((__m512i*)cnProcBuf)[348+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -20,8 +22,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[108+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[108+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[348+i]; zmm0 = ((__m512i*)cnProcBuf)[348+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -32,8 +35,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[228+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[228+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -44,8 +48,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[348+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[348+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[108+i]; zmm0 = ((__m512i*)cnProcBuf)[108+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[228+i]; zmm0 = ((__m512i*)cnProcBuf)[228+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -59,8 +64,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 6 BNs //Process group with 6 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[894+i]; zmm0 = ((__m512i*)cnProcBuf)[894+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -77,8 +83,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[858+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[858+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[894+i]; zmm0 = ((__m512i*)cnProcBuf)[894+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -95,8 +102,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[876+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[876+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -113,8 +121,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[894+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[894+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -131,8 +140,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[912+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[912+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -149,8 +159,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[930+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[930+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[858+i]; zmm0 = ((__m512i*)cnProcBuf)[858+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[876+i]; zmm0 = ((__m512i*)cnProcBuf)[876+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -169,8 +180,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 8 BNs //Process group with 8 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[990+i]; zmm0 = ((__m512i*)cnProcBuf)[990+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -193,8 +205,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[966+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[966+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[990+i]; zmm0 = ((__m512i*)cnProcBuf)[990+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -217,8 +230,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[978+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[978+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -241,8 +255,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[990+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[990+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -265,8 +280,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1002+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1002+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -289,8 +305,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1014+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1014+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -313,8 +330,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1026+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1026+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -337,8 +355,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1038+i] = conditional_negate(min, sgn,zeros); ((__m512i*)cnProcBufRes)[1038+i] = conditional_negate(min, sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[966+i]; zmm0 = ((__m512i*)cnProcBuf)[966+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[978+i]; zmm0 = ((__m512i*)cnProcBuf)[978+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -363,8 +382,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
//Process group with 10 BNs //Process group with 10 BNs
M = (2*Z + 63)>>6; M = (2*Z + 63)>>6;
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1086+i]; zmm0 = ((__m512i*)cnProcBuf)[1086+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -393,8 +413,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1062+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1062+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1086+i]; zmm0 = ((__m512i*)cnProcBuf)[1086+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -423,8 +444,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1074+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1074+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -453,8 +475,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1086+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1086+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -483,8 +506,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1098+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1098+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -513,8 +537,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1110+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1110+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -543,8 +568,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1122+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1122+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -573,8 +599,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1134+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1134+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -603,8 +630,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1146+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1146+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);
@@ -633,8 +661,9 @@ static inline void nrLDPC_cnProc_BG2_R23_AVX512(int8_t* cnProcBuf, int8_t* cnPro
((__m512i*)cnProcBufRes)[1158+i] = conditional_negate(min,sgn,zeros); ((__m512i*)cnProcBufRes)[1158+i] = conditional_negate(min,sgn,zeros);
} }
for (int i=0;i<M;i++) { for (int i=0;i<M;i++) {
sgn = ((__m512i*)cnProcBuf)[1062+i]; zmm0 = ((__m512i*)cnProcBuf)[1062+i];
min = _mm512_abs_epi8(sgn); sgn = _mm512_xor_si512(ones, zmm0);
min = _mm512_abs_epi8(zmm0);
zmm0 = ((__m512i*)cnProcBuf)[1074+i]; zmm0 = ((__m512i*)cnProcBuf)[1074+i];
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = _mm512_xor_si512(sgn, zmm0); sgn = _mm512_xor_si512(sgn, zmm0);