Add Intrinsics usage by SIMDE

This commit is contained in:
Bruno Mongazon-Cazavet
2022-09-28 18:21:19 +02:00
committed by Robert Schmidt
parent a1de5e3d11
commit fe1dc24e28
114 changed files with 7900 additions and 11031 deletions
File diff suppressed because it is too large Load Diff
+125 -125
View File
@@ -32,6 +32,8 @@
#ifndef __NR_LDPC_DECODER_CNPROC__H__
#define __NR_LDPC_DECODER_CNPROC__H__
#include "PHY/sse_intrin.h"
/**
\brief Performs CN processing for BG2 on the CN processing buffer and stores the results in the CN processing results buffer.
\param p_lut Pointer to decoder LUTs
@@ -39,12 +41,9 @@
\param Z Lifting size
*/
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
#include "nrLDPC_cnProc_avx512.h"
#else
static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z)
{
const uint8_t* lut_numCnInCnGroups = p_lut->numCnInCnGroups;
@@ -102,20 +101,20 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
ymm0 = pj0[i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// 32 CNs of second BN
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
ymm0 = pj1[i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
//*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
//*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
//p_cnProcBufResBit++;
p_cnProcBufResBit[i]=_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit[i]=simde_mm256_sign_epi8(min, sgn);
}
}
}
@@ -149,20 +148,20 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG4[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<3; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG4[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -198,20 +197,20 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG5[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<4; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG5[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -248,20 +247,20 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG6[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<5; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG6[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -299,20 +298,20 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG8[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<7; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG8[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -351,20 +350,20 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG10[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<9; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG10[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -440,18 +439,18 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// 32 CNs of second BN
ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -487,20 +486,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG4[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<3; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG4[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -537,20 +536,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG5[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<4; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG5[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -588,20 +587,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG6[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<5; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG6[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -640,20 +639,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG7[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<6; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG7[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -692,20 +691,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG8[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<7; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG8[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -745,20 +744,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG9[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<8; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG9[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -798,20 +797,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG10[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<9; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG10[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -856,20 +855,20 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
{
// Abs and sign of 32 CNs (first BN)
ymm0 = p_cnProcBuf[lut_idxCnProcG19[j][0] + i];
sgn = _mm256_sign_epi8(*p_ones, ymm0);
min = _mm256_abs_epi8(ymm0);
sgn = simde_mm256_sign_epi8(*p_ones, ymm0);
min = simde_mm256_abs_epi8(ymm0);
// Loop over BNs
for (k=1; k<18; k++)
{
ymm0 = p_cnProcBuf[lut_idxCnProcG19[j][k] + i];
min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
sgn = _mm256_sign_epi8(sgn, ymm0);
min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
sgn = simde_mm256_sign_epi8(sgn, ymm0);
}
// Store result
min = _mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
min = simde_mm256_min_epu8(min, *p_maxLLR); // 128 in epi8 is -127
*p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
p_cnProcBufResBit++;
}
}
@@ -878,6 +877,7 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBuf, int
}
#endif
/**
\brief Performs parity check for BG1 on the CN processing buffer. Stops as soon as error is detected.
\param p_lut Pointer to decoder LUTs
@@ -937,7 +937,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -956,7 +956,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1005,7 +1005,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1024,7 +1024,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1073,7 +1073,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1093,7 +1093,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1142,7 +1142,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1161,7 +1161,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1210,7 +1210,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1229,7 +1229,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1278,7 +1278,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1297,7 +1297,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1346,7 +1346,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1365,7 +1365,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1414,7 +1414,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1433,7 +1433,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1482,7 +1482,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1501,7 +1501,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1578,7 +1578,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1597,7 +1597,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1646,7 +1646,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1665,7 +1665,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1714,7 +1714,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1733,7 +1733,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1782,7 +1782,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1801,7 +1801,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1850,7 +1850,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1869,7 +1869,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1918,7 +1918,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -1937,7 +1937,7 @@ static inline uint32_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, int8_t* cnProcBu
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm256_movemask_epi8(_mm256_adds_epi8(ymm0,ymm1));
pcRes ^= simde_mm256_movemask_epi8(simde_mm256_adds_epi8(ymm0,ymm1));
}
// If no error pcRes should be 0
@@ -26,7 +26,7 @@
*/
#include <stdint.h>
#include <immintrin.h>
#include "PHY/sse_intrin.h"
#include "nrLDPCdecoder_defs.h"
#include "nrLDPC_types.h"
#include "nrLDPC_init.h"
@@ -42,7 +42,7 @@
/----------------------------------------------------------------------*/
//BG1-------------------------------------------------------------------
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
#include "cnProc_avx512/nrLDPC_cnProc_BG1_R13_AVX512.h"
#include "cnProc_avx512/nrLDPC_cnProc_BG1_R23_AVX512.h"
@@ -85,7 +85,7 @@
//bnProc----------------------------------------------------------------
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
//BG1-------------------------------------------------------------------
#include "bnProc_avx512/nrLDPC_bnProc_BG1_R13_AVX512.h"
#include "bnProc_avx512/nrLDPC_bnProc_BG1_R23_AVX512.h"
@@ -224,7 +224,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
{
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG1_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG1_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -234,7 +234,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG1_R23_AVX512(cnProcBuf,cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG1_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -244,7 +244,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
case 89:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG1_R89_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG1_R89_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -261,7 +261,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
switch (R) {
case 15:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG2_R15_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG2_R15_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -270,7 +270,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG2_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG2_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -279,7 +279,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG2_R23_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG2_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -382,7 +382,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
switch (R) {
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG1_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG1_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -391,7 +391,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG1_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG1_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -400,7 +400,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 89:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG1_R89_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG1_R89_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -416,7 +416,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
switch (R) {
case 15:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG2_R15_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG2_R15_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -425,7 +425,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG2_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG2_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -435,7 +435,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG2_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG2_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -490,7 +490,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
switch (R) {
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG1_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG1_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -499,7 +499,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG1_R23_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG1_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -508,7 +508,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 89:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG1_R89_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG1_R89_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -524,7 +524,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
switch (R) {
case 15:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG2_R15_AVX512(cnProcBuf,cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG2_R15_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -533,7 +533,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG2_R13_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG2_R13_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -542,7 +542,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_cnProc_BG2_R23_AVX512(cnProcBuf, cnProcBufRes, Z);
#else
nrLDPC_cnProc_BG2_R23_AVX2(cnProcBuf, cnProcBufRes, Z);
@@ -639,7 +639,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
switch (R) {
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG1_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG1_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -648,7 +648,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG1_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG1_R23_AVX2(bnProcBuf,bnProcBufRes,llrRes, Z);
@@ -657,7 +657,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 89:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG1_R89_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG1_R89_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -670,7 +670,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
{
case 15:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG2_R15_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG2_R15_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -679,7 +679,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 13:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG2_R13_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG2_R13_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
@@ -688,7 +688,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, uint32_
}
case 23:
{
#ifdef __AVX512BW__
#if defined(__AVX512BW__)
nrLDPC_bnProc_BG2_R23_AVX512(bnProcBuf, bnProcBufRes,llrRes, Z);
#else
nrLDPC_bnProc_BG2_R23_AVX2(bnProcBuf, bnProcBufRes,llrRes, Z);
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -22,7 +22,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <immintrin.h>
#include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h"
@@ -22,7 +22,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <immintrin.h>
#include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h"
@@ -44,8 +44,8 @@ void nrLDPC_bnProcPc_BG2_generator_AVX512(const char *dir, int R)
abort();
}
// fprintf(fd,"#include <stdint.h>\n");
//fprintf(fd,"#include <immintrin.h>\n");
// fprintf(fd,"#include <stdint.h>\n");
// fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"static inline void nrLDPC_bnProcPc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* llrRes , int8_t* llrProcBuf, uint16_t Z ) {\n",ratestr[R]);
const uint8_t* lut_numBnInBnGroups;
@@ -22,7 +22,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <immintrin.h>
#include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h"
@@ -45,7 +45,7 @@ void nrLDPC_bnProc_BG1_generator_AVX512(const char *dir, int R)
}
//fprintf(fd,"#include <stdint.h>\n");
//fprintf(fd,"#include <immintrin.h>\n");
//fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"static inline void nrLDPC_bnProc_BG1_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n", ratestr[R]);
@@ -22,7 +22,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <immintrin.h>
#include "PHY/sse_intrin.h"
#include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h"
@@ -45,7 +45,7 @@ void nrLDPC_bnProc_BG2_generator_AVX512(const char *dir, int R)
}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"void nrLDPC_bnProc_BG2_R%s_AVX512(int8_t* bnProcBuf,int8_t* bnProcBufRes, int8_t* llrRes, uint16_t Z ) {\n",ratestr[R]);
const uint8_t* lut_numBnInBnGroups;
@@ -42,7 +42,7 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"static inline void nrLDPC_cnProc_BG1_R%s_AVX2(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
@@ -87,8 +87,8 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," __m256i ymm0, min, sgn,ones,maxLLR;\n");
fprintf(fd," ones = _mm256_set1_epi8((char)1);\n");
fprintf(fd," maxLLR = _mm256_set1_epi8((char)127);\n");
fprintf(fd," ones = simde_mm256_set1_epi8((char)1);\n");
fprintf(fd," maxLLR = simde_mm256_set1_epi8((char)127);\n");
fprintf(fd," uint32_t M;\n");
@@ -121,27 +121,27 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// 32 CNs of second BN
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -180,10 +180,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -191,19 +191,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -245,10 +245,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -256,19 +256,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -310,10 +310,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -321,19 +321,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -378,10 +378,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -389,19 +389,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -447,10 +447,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -458,19 +458,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -516,10 +516,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -527,19 +527,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[6]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[6]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -586,10 +586,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -597,19 +597,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[7]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[7]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -659,10 +659,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -670,19 +670,19 @@ void nrLDPC_cnProc_BG1_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[8]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[8]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -45,7 +45,7 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
}
fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
fprintf(fd,"static inline void nrLDPC_cnProc_BG2_R%s_AVX2(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n",ratestr[R]);
const uint8_t* lut_numCnInCnGroups;
@@ -77,8 +77,8 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
fprintf(fd," __m256i ymm0, min, sgn,ones,maxLLR;\n");
fprintf(fd," ones = _mm256_set1_epi8((char)1);\n");
fprintf(fd," maxLLR = _mm256_set1_epi8((char)127);\n");
fprintf(fd," ones = simde_mm256_set1_epi8((char)1);\n");
fprintf(fd," maxLLR = simde_mm256_set1_epi8((char)127);\n");
fprintf(fd," uint32_t M;\n");
@@ -100,35 +100,35 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// 32 CNs of second BN
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup));
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]+1);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
fprintf(fd," }\n");
}
@@ -161,10 +161,10 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -172,19 +172,19 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -218,10 +218,10 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -229,18 +229,18 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup));
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -275,10 +275,10 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -286,19 +286,19 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -338,30 +338,30 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG8[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG8[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -401,10 +401,10 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
// Abs and sign of 32 CNs (first BN)
// ymm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG10[j][0]);
// sgn = _mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(ones, ymm0);\n");
// min = _mm256_abs_epi8(ymm0);
fprintf(fd," min = _mm256_abs_epi8(ymm0);\n");
// sgn = simde_mm256_sign_epi8(ones, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(ones, ymm0);\n");
// min = simde_mm256_abs_epi8(ymm0);
fprintf(fd," min = simde_mm256_abs_epi8(ymm0);\n");
// Loop over BNs
@@ -412,19 +412,19 @@ void nrLDPC_cnProc_BG2_generator_AVX2(const char* dir, int R)
{
fprintf(fd," ymm0 = ((__m256i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG10[j][k]);
// min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));
fprintf(fd," min = _mm256_min_epu8(min, _mm256_abs_epi8(ymm0));\n");
// min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));
fprintf(fd," min = simde_mm256_min_epu8(min, simde_mm256_abs_epi8(ymm0));\n");
// sgn = _mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = _mm256_sign_epi8(sgn, ymm0);\n");
// sgn = simde_mm256_sign_epi8(sgn, ymm0);
fprintf(fd," sgn = simde_mm256_sign_epi8(sgn, ymm0);\n");
}
// Store result
// min = _mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm256_sign_epi8(min, sgn);
// min = simde_mm256_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = simde_mm256_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = simde_mm256_sign_epi8(min, sgn);
// p_cnProcBufResBit++;
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = _mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup));
fprintf(fd," ((__m256i*)cnProcBufRes)[%d+i] = simde_mm256_sign_epi8(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
}
@@ -26,572 +26,535 @@
void nrLDPC_cnProc_BG1_generator_AVX512(const char *dir, int R)
{
const char *ratestr[3]={"13","23","89"};
const char *ratestr[3] = {"13", "23", "89"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
if (R < 0 || R > 2) {
printf("Illegal R %d\n", R);
abort();
}
// system("mkdir -p ../ldpc_gen_files");
// system("mkdir -p ../ldpc_gen_files");
char fname[FILENAME_MAX+1];
char fname[FILENAME_MAX + 1];
snprintf(fname, sizeof(fname), "%s/cnProc_avx512/nrLDPC_cnProc_BG1_R%s_AVX512.h", dir, ratestr[R]);
FILE *fd=fopen(fname,"w");
FILE *fd = fopen(fname, "w");
if (fd == NULL) {
printf("Cannot create file %s\n", fname);
abort();
}
// fprintf(fd,"#include <stdint.h>\n");
// fprintf(fd,"#include <immintrin.h>\n");
// fprintf(fd,"#include <stdint.h>\n");
// fprintf(fd,"#include \"PHY/sse_intrin.h\"\n");
// fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,simde_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_BG1_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, 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();}
fprintf(fd, "static inline void nrLDPC_cnProc_BG1_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, 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 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, " __m512i zmm0, min, sgn,zeros,maxLLR, ones;\n");
fprintf(fd," uint32_t M, i;\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");
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");
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
// Offsets are in units of bitOffsetInGroup (1*384/32)12
const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,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;
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] );
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_BG1_R13[0]*NR_LDPC_ZMAX)>>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
// Loop over every BN
for (j=0; j<3; j++)
{
for (j = 0; j < 3; j++) {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[0] >> 6) + lut_idxCnProcG3[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+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 = ((__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");
// for (k=1; k<2; k++)
//{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][1]/2);
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd, " sgn = _mm512_xor_si512(sgn, zmm0);\n");
// }
// 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[0]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\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[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}};
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_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
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_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 (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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
for (j = 0; j < 4; j++) {
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[1] >> 6) + 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[1] >> 6) + lut_idxCnProcG4[j][k] / 2);
// 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");
// 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");
}
// 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");
}
// 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");
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}};
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]);
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_BG1_R13[2] * NR_LDPC_ZMAX) >> 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
// Loop over every BN
for (j = 0; j < 5; j++) {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[2] >> 6) + lut_idxCnProcG5[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
for (j=0; j<5; j++)
{
// 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);
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 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");
}
// 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);
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd, " min = _mm512_min_epu8(min, maxLLR);\n");
// 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");
}
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}};
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;
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]);
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_BG1_R13[3] * NR_LDPC_ZMAX) >> 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
// Loop over every BN
for (j = 0; j < 6; j++) {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[3] >> 6) + lut_idxCnProcG6[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
for (j=0; j<6; j++)
{
// 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);
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
// 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");
}
// 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);
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd, " min = _mm512_min_epu8(min, maxLLR);\n");
// 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");
}
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}};
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]);
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_BG1_R13[4] * NR_LDPC_ZMAX) >> 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
// Loop over every BN
for (j = 0; j < 7; j++) {
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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= ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[4] >> 6) + lut_idxCnProcG7[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
for (j=0; j<7; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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= ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+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 = ((__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");
// 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);
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd, " sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd, " min = _mm512_min_epu8(min, maxLLR);\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");
}
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 = 24
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,120,144,168}, {0,24,48,96,120,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}};
fprintf(fd, "//Process group with 8 BNs\n");
// Offset is 2*384/32 = 24
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, 120, 144, 168},
{0, 24, 48, 96, 120, 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}};
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] );
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_BG1_R13[5]*NR_LDPC_ZMAX)>>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
// Loop over every BN
for (j=0; j<8; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n");
for (j = 0; j < 8; j++) {
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[5] >> 6) + 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[5] >> 6) + lut_idxCnProcG8[j][k] / 2);
// 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");
// 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");
}
// 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");
// 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");
}
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}};
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]);
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_BG1_R13[6] * NR_LDPC_ZMAX) >> 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;
// Loop over every BN
// Loop over every BN
for (j = 0; j < 9; j++) {
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[6] >> 6) + lut_idxCnProcG9[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
for (j=0; j<9; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+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 = ((__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");
// 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);
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd, " sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd, " min = _mm512_min_epu8(min, maxLLR);\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");
}
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}};
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] );
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_BG1_R13[7]*NR_LDPC_ZMAX)>>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
// Loop over every BN
for (j = 0; j < 10; j++) {
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[7] >> 6) + lut_idxCnProcG10[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
for (j=0; j<10; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+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 = ((__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");
// 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);
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd, " sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd, " min = _mm512_min_epu8(min, maxLLR);\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");
}
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");
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}};
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]);
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_BG1_R13[8] * NR_LDPC_ZMAX) >> 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
// Loop over every BN
for (j = 0; j < 19; j++) {
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[8] >> 6) + lut_idxCnProcG19[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
for (j=0; j<19; j++)
{
// Loop over CNs
// for (i=0; i<M; i++,iprime++)
// {
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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+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 = ((__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");
// 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);
// sgn = _mm512_sign_epi8(*p_ones, zmm0);
fprintf(fd, " sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd, " min = _mm512_min_epu8(min, maxLLR);\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, " ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n", (lut_startAddrCnGroups[8] >> 6) + (j * bitOffsetInGroup));
fprintf(fd, " }\n");
}
}
fprintf(fd,"}\n");
fprintf(fd, "}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG1
} // end of the function nrLDPC_cnProc_BG1
@@ -26,389 +26,336 @@
void nrLDPC_cnProc_BG2_generator_AVX512(const char *dir, int R)
{
const char *ratestr[3]={"15","13","23"};
const char *ratestr[3] = {"15", "13", "23"};
if (R<0 || R>2) {printf("Illegal R %d\n",R); abort();}
if (R < 0 || R > 2) {
printf("Illegal R %d\n", R);
abort();
}
// system("mkdir -p ../ldpc_gen_files");
// system("mkdir -p ../ldpc_gen_files");
char fname[FILENAME_MAX+1];
char fname[FILENAME_MAX + 1];
snprintf(fname, sizeof(fname), "%s/cnProc_avx512/nrLDPC_cnProc_BG2_R%s_AVX512.h", dir, ratestr[R]);
FILE *fd=fopen(fname,"w");
FILE *fd = fopen(fname, "w");
if (fd == NULL) {
printf("Cannot create file %s\n", fname);
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_BG2_R%s_AVX512(int8_t* cnProcBuf, int8_t* cnProcBufRes, uint16_t Z) {\n", ratestr[R]);
const uint8_t *lut_numCnInCnGroups;
const uint32_t *lut_startAddrCnGroups = lut_startAddrCnGroups_BG2;
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]);
const uint8_t* lut_numCnInCnGroups;
const uint32_t* lut_startAddrCnGroups = lut_startAddrCnGroups_BG2;
if (R==0) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R15;
else if (R==1) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R13;
else if (R==2) lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R23;
else { printf("aborting, illegal R %d\n",R); fclose(fd);abort();}
if (R == 0)
lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R15;
else if (R == 1)
lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R13;
else if (R == 2)
lut_numCnInCnGroups = lut_numCnInCnGroups_BG2_R23;
else {
printf("aborting, illegal R %d\n", R);
fclose(fd);
abort();
}
// Number of CNs in Groups
//uint32_t M;
// uint32_t M;
uint32_t j;
uint32_t k;
// Offset to each bit within a group in terms of 64 Byte
uint32_t bitOffsetInGroup;
fprintf(fd," uint32_t M;\n");
fprintf(fd," __m512i zmm0, min, sgn,zeros,ones,maxLLR;\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");
fprintf(fd, " uint32_t M;\n");
fprintf(fd, " __m512i zmm0, min, sgn,zeros,ones,maxLLR;\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");
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
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}};
if (lut_numCnInCnGroups[0] > 0) {
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
fprintf(fd, " M = (%d*Z + 63)>>6;\n", lut_numCnInCnGroups[0]);
if (lut_numCnInCnGroups[0] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
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_BG2_R15[0] * NR_LDPC_ZMAX) >> 6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[0]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j = 0; j < 3; j++) {
fprintf(fd, " for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[0] >> 6) + lut_idxCnProcG3[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
// for (k=1; k<2; k++)
//{
fprintf(fd, " zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[0] >> 6) + lut_idxCnProcG3[j][1] / 2);
for (j=0; j<3; j++)
{
// 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");
// }
fprintf(fd," for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+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 = ((__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");
// *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," }\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[0] >> 6) + (j * bitOffsetInGroup));
fprintf(fd, " }\n");
}
}
// =====================================================================
// Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 20*384/32 = 240
const uint16_t lut_idxCnProcG4[4][3] = {{240,480,720}, {0,480,720}, {0,240,720}, {0,240,480}};
fprintf(fd, "//Process group with 4 BNs\n");
// Offset is 20*384/32 = 240
const uint16_t lut_idxCnProcG4[4][3] = {{240, 480, 720}, {0, 480, 720}, {0, 240, 720}, {0, 240, 480}};
if (lut_numCnInCnGroups[1] > 0) {
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
fprintf(fd, " M = (%d*Z + 63)>>6;\n", lut_numCnInCnGroups[1]);
if (lut_numCnInCnGroups[1] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
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_BG2_R15[1] * NR_LDPC_ZMAX) >> 6;
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[1]*NR_LDPC_ZMAX)>>6;
// Loop over every BN
for (j = 0; j < 4; j++) {
fprintf(fd, " for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[1] >> 6) + lut_idxCnProcG4[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
for (j=0; j<4; j++)
{
fprintf(fd," for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+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 = ((__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");
// 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);
// sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd, " sgn = _mm512_xor_si512(sgn, zmm0);\n");
}
// 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");
}
// 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 9*384/32 = 108
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}};
fprintf(fd, "//Process group with 5 BNs\n");
// Offset is 9*384/32 = 108
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}};
if (lut_numCnInCnGroups[2] > 0) {
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
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_BG2_R15[2] * NR_LDPC_ZMAX) >> 6;
if (lut_numCnInCnGroups[2] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[2] );
// Loop over every BN
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[2]*NR_LDPC_ZMAX)>>6;
for (j = 0; j < 5; j++) {
fprintf(fd, " for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[2] >> 6) + lut_idxCnProcG5[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
// 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);
for (j=0; j<5; j++)
{
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd, " min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
fprintf(fd," for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," 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");
// 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");
}
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 3*384/32 = 36
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,72,108,180}, {0,36,72,108,144}};
fprintf(fd, "//Process group with 6 BNs\n");
// Offset is 3*384/32 = 36
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, 72, 108, 180}, {0, 36, 72, 108, 144}};
if (lut_numCnInCnGroups[3] > 0) {
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
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_BG2_R15[3] * NR_LDPC_ZMAX) >> 6;
if (lut_numCnInCnGroups[3] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[3] );
// Loop over every BN
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[3]*NR_LDPC_ZMAX)>>6;
for (j = 0; j < 6; j++) {
fprintf(fd, " for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[3] >> 6) + lut_idxCnProcG6[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
// 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);
for (j=0; j<6; j++)
{
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd, " min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
fprintf(fd," for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," 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");
// 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");
}
fprintf(fd, " ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n", (lut_startAddrCnGroups[3] >> 6) + (j * bitOffsetInGroup));
fprintf(fd, " }\n");
}
}
// =====================================================================
// Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 24
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,120,144,168}, {0,24,48,96,120,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}};
fprintf(fd, "//Process group with 8 BNs\n");
// Offset is 2*384/32 = 24
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, 120, 144, 168},
{0, 24, 48, 96, 120, 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}};
if (lut_numCnInCnGroups[4] > 0) {
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
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_BG2_R15[4] * NR_LDPC_ZMAX) >> 6;
if (lut_numCnInCnGroups[4] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[4] );
// Loop over every BN
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[4]*NR_LDPC_ZMAX)>>6;
for (j = 0; j < 8; j++) {
fprintf(fd, " for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[4] >> 6) + lut_idxCnProcG8[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
// Loop over BNs
for (k = 1; k < 7; k++) {
fprintf(fd, " zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[4] >> 6) + lut_idxCnProcG8[j][k] / 2);
for (j=0; j<8; j++)
{
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd, " min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
fprintf(fd," for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG8[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," 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");
// Loop over BNs
for (k=1; k<7; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>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[4]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\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 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},
{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,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}};
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, 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, 144, 168, 216},
{0, 24, 48, 72, 96, 120, 144, 168, 192}};
if (lut_numCnInCnGroups[5] > 0) {
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
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_BG2_R15[5] * NR_LDPC_ZMAX) >> 6;
if (lut_numCnInCnGroups[5] > 0)
{
// Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64
fprintf(fd," M = (%d*Z + 63)>>6;\n",lut_numCnInCnGroups[5] );
// Loop over every BN
// Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG2_R15[5]*NR_LDPC_ZMAX)>>6;
for (j = 0; j < 10; j++) {
fprintf(fd, " for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[5] >> 6) + lut_idxCnProcG10[j][0] / 2);
fprintf(fd, " sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd, " min = _mm512_abs_epi8(zmm0);\n");
// Loop over every BN
// Loop over BNs
for (k = 1; k < 9; k++) {
fprintf(fd, " zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n", (lut_startAddrCnGroups[5] >> 6) + lut_idxCnProcG10[j][k] / 2);
for (j=0; j<10; j++)
{
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd, " min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
fprintf(fd," for (int 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 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG10[j][0]/2);
fprintf(fd," sgn = _mm512_xor_si512(ones, zmm0);\n");
fprintf(fd," 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");
// Loop over BNs
for (k=1; k<9; k++)
{
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>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[5]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n");
}
fprintf(fd, " ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n", (lut_startAddrCnGroups[5] >> 6) + (j * bitOffsetInGroup));
fprintf(fd, " }\n");
}
}
fprintf(fd,"}\n");
fprintf(fd, "}\n");
fclose(fd);
}//end of the function nrLDPC_cnProc_BG2
} // end of the function nrLDPC_cnProc_BG2