Test for avx512

This commit is contained in:
Sy
2020-05-29 11:58:55 +02:00
parent 3e27bed4f7
commit 5e5e487e4c
72 changed files with 42802 additions and 41352 deletions
@@ -30,7 +30,7 @@
#ifndef __AVX512BW__
#pragma GCC push_options
//#pragma GCC target("avx512bw")
#pragma GCC target("avx512bw")
#define __DISABLE_AVX512BW__
#endif /* __AVX512BW__ */
@@ -30,7 +30,7 @@
#ifndef __AVX512F__
#pragma GCC push_options
//#pragma GCC target("avx512f")
#pragma GCC target("avx512f")
#define __DISABLE_AVX512F__
#endif /* __AVX512F__ */
@@ -23,7 +23,7 @@
* \brief Defines the functions for check node processing
* Version AVX512
*/
#include <immintrin.h>
#ifndef __NR_LDPC_BNPROC__H__
#define __NR_LDPC_BNPROC__H__
@@ -59,7 +59,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
uint32_t cnOffsetInGroup;
uint8_t idxBnGroup = 0;
__m512i zmm0, zmm1, zmmRes0, zmmRes1;
__m512i zmm0, zmm1, zmmRes0, zmmRes1,tmp;
// =====================================================================
// Process group with 1 CN
@@ -96,8 +96,8 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
//-*p_llrRes = _mm512_permute4x64_epi64(zmm0, 0xD8); // revenir ?
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
//-*p_llrRes = _mm512_permutevar_epi32 (tmp, zmm0); // revenir ?
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
}
@@ -148,7 +148,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -201,7 +201,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -254,7 +254,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -307,7 +307,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -360,7 +360,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -413,7 +413,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -466,7 +466,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -519,7 +519,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -572,7 +572,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -625,7 +625,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -678,7 +678,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -731,7 +731,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -784,7 +784,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -837,7 +837,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -890,7 +890,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -943,7 +943,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -996,7 +996,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1049,7 +1049,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1102,7 +1102,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1155,7 +1155,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1208,7 +1208,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1261,7 +1261,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1314,7 +1314,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1367,7 +1367,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1420,7 +1420,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1473,7 +1473,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1526,7 +1526,7 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Pack results back to epi8
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0, 0xD8,zmm1);
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1571,16 +1571,16 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
// Add LLR from receiver input
zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);
zmmRes0 = _mm512_adds_epi16(ymmRes0, ymm0);
zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);
ymm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j+1]);
ymmRes1 = _mm512_adds_epi16(ymmRes1, ymm1);
zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j+1]);
zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);
// Pack results back to epi8
ymm0 = _mm512_packs_epi16(ymmRes0, ymmRes1);
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
*p_llrRes = _mm512_permute4x64_epi64(ymm0, 0xD8);
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
// zmm0 = [zmmRes1[255:128] zmmRes0[255:128] zmmRes1[127:0] zmmRes0[127:0]]
// p_llrRes = [zmmRes1[255:128] zmmRes1[127:0] zmmRes0[255:128] zmmRes0[127:0]]
*p_llrRes= _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -1610,31 +1610,31 @@ static inline void nrLDPC_bnProcPc(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_proc
for (i=0,j=0; i<M; i++,j+=2)
{
// First 16 LLRs of first CN
ymmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j]);
ymmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]);
zmmRes0 = _mm512_cvtepi8_epi16(p_bnProcBuf[j]);
zmmRes1 = _mm512_cvtepi8_epi16(p_bnProcBuf[j+1]);
// Loop over CNs
for (k=1; k<30; k++)
{
ymm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j]);
ymmRes0 = _mm512_adds_epi16(ymmRes0, ymm0);
zmm0 = _mm512_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j]);
zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);
ymm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j+1]);
ymmRes1 = _mm512_adds_epi16(ymmRes1, ymm1);
zmm1 = _mm512_cvtepi8_epi16(p_bnProcBuf[k*cnOffsetInGroup + j+1]);
zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);
}
// Add LLR from receiver input
ymm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);
ymmRes0 = _mm512_adds_epi16(ymmRes0, ymm0);
zmm0 = _mm512_cvtepi8_epi16(p_llrProcBuf[j]);
zmmRes0 = _mm512_adds_epi16(zmmRes0, zmm0);
ymm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j+1]);
ymmRes1 = _mm512_adds_epi16(ymmRes1, ymm1);
zmm1 = _mm512_cvtepi8_epi16(p_llrProcBuf[j+1]);
zmmRes1 = _mm512_adds_epi16(zmmRes1, zmm1);
// Pack results back to epi8
ymm0 = _mm512_packs_epi16(ymmRes0, ymmRes1);
// ymm0 = [ymmRes1[255:128] ymmRes0[255:128] ymmRes1[127:0] ymmRes0[127:0]]
// p_llrRes = [ymmRes1[255:128] ymmRes1[127:0] ymmRes0[255:128] ymmRes0[127:0]]
*p_llrRes = _mm512_permute4x64_epi64(ymm0, 0xD8);
zmm0 = _mm512_packs_epi16(zmmRes0, zmmRes1);
// zmm0 = [zmmRes1[255:128] zmmRes0[255:128] zmmRes1[127:0] zmmRes0[127:0]]
// p_llrRes = [zmmRes1[255:128] zmmRes1[127:0] zmmRes0[255:128] zmmRes0[127:0]]
*p_llrRes = _mm512_permutex2var_epi16(zmm0,tmp,zmm1);
// Next result
p_llrRes++;
@@ -2715,12 +2715,12 @@ static inline void nrLDPC_llr2bit(int8_t* out, int8_t* llrOut, uint16_t numLLR)
uint64_t M = numLLR>>5;
uint64_t Mr = numLLR&63;
const __m512i* p_zeros = (__m512i*) zeros256_epi8;
const __m512i* p_ones = (__m512i*) ones256_epi8;
const __m512i* p_zeros = (__m512i*) zeros512_epi8;
const __m512i* p_ones = (__m512i*) ones512_epi8;
for (i=0; i<M; i++)
{
*p_out++ = _mm512_and_pd(*p_ones, _mm512_cmpgt_epi8_mask(*p_zeros, *p_llrOut));
*p_out++ = _mm512_and_si512(*p_ones, _mm512_or_si512(*p_zeros, *p_llrOut));
p_llrOut++;
}
@@ -2738,6 +2738,7 @@ static inline void nrLDPC_llr2bit(int8_t* out, int8_t* llrOut, uint16_t numLLR)
}
else
{
p_out8[i] = 0;
}
}
@@ -2767,7 +2768,7 @@ static inline void nrLDPC_llr2bitPacked(int8_t* out, int8_t* llrOut, uint16_t nu
uint64_t i;
uint64_t M = numLLR>>5;
uint64_t Mr = numLLR&63;
const __m512i* p_shuffle = (__m512i*) constShuffle_256_epi8;
const __m512i* p_shuffle = (__m512i*) constShuffle_512_epi8;
for (i=0; i<M; i++)
{
@@ -27,7 +27,9 @@
#ifndef __NR_LDPC_CNPROC__H__
#define __NR_LDPC_CNPROC__H__
#include <immintrin.h>
#include "include/avx512fintrin.h"
#include <avx512fintrin.h>
//#include "include/immintrin.h"
/**
\brief Performs CN processing for BG2 on the CN processing buffer and stores the results in the CN processing results buffer.
@@ -110,12 +112,12 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// 64 CNS of second BN
zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
// Store result
@@ -157,13 +159,13 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG4[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<3; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG4[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -206,13 +208,13 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG5[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<4; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG5[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -256,13 +258,13 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG6[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<5; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG6[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -307,13 +309,13 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG8[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<7; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG8[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -359,13 +361,13 @@ static inline void nrLDPC_cnProc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG10[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<9; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG10[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -442,12 +444,12 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
{
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0); revenir
min = _m512_abs_epi8(zmm0);
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _mm512_abs_epi8(zmm0);
// 64 CNS of second BN
zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
// Store result
@@ -489,13 +491,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG4[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<3; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG4[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -539,13 +541,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG5[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<4; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG5[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -590,13 +592,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG6[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<5; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG6[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -642,13 +644,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG7[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<6; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG7[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -694,13 +696,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG8[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<7; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG8[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -747,13 +749,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG9[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<8; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG9[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -800,13 +802,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG10[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<9; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG10[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -857,13 +859,13 @@ static inline void nrLDPC_cnProc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf* p_pr
// Abs and sign of 64 CNS (first BN)
zmm0 = p_cnProcBuf[lut_idxCnProcG19[j][0] + i];
sgn = mm512_sign_epi16(*p_ones, zmm0);
min = _m512_abs_epi8(zmm0);
min = _mm512_abs_epi8(zmm0);
// Loop over BNs
for (k=1; k<18; k++)
{
zmm0 = p_cnProcBuf[lut_idxCnProcG19[j][k] + i];
min = _mm512_min_epu8(min, _m512_abs_epi8(zmm0));
min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
sgn = mm512_sign_epi16(sgn, zmm0);
}
@@ -938,7 +940,7 @@ static inline uint64_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1072,7 +1074,7 @@ static inline uint64_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1226,7 +1228,7 @@ static inline uint64_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1341,7 +1343,7 @@ static inline uint64_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1408,7 +1410,7 @@ static inline uint64_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1422,12 +1424,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG1(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<10; j++)
{
// BN offset is units of 1*384/64 = 6
ymm0 = p_cnProcBuf [j*6 + i];
ymm1 = p_cnProcBufRes[j*6 + i];
zmm0 = p_cnProcBuf [j*6 + i];
zmm1 = p_cnProcBufRes[j*6 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1543,7 +1545,7 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
uint64_t Mrem;
uint64_ ;
__m512i ymm0, ymm1;
__m512i zmm0, zmm1;
// =====================================================================
// Process group with 3 BNs
@@ -1574,12 +1576,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<3; j++)
{
// BN offset is units of (6*384/32) = 72
ymm0 = p_cnProcBuf [j*72 + i];
ymm1 = p_cnProcBufRes[j*72 + i];
zmm0 = p_cnProcBuf [j*72 + i];
zmm1 = p_cnProcBufRes[j*72 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1593,12 +1595,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<3; j++)
{
// BN offset is units of (6*384/32) = 72
ymm0 = p_cnProcBuf [j*72 + i];
ymm1 = p_cnProcBufRes[j*72 + i];
zmm0 = p_cnProcBuf [j*72 + i];
zmm1 = p_cnProcBufRes[j*72 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1641,12 +1643,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<4; j++)
{
// BN offset is units of 20*384/32 = 240
ymm0 = p_cnProcBuf [j*240 + i];
ymm1 = p_cnProcBufRes[j*240 + i];
zmm0 = p_cnProcBuf [j*240 + i];
zmm1 = p_cnProcBufRes[j*240 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1660,12 +1662,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<4; j++)
{
// BN offset is units of 20*384/32 = 240
ymm0 = p_cnProcBuf [j*240 + i];
ymm1 = p_cnProcBufRes[j*240 + i];
zmm0 = p_cnProcBuf [j*240 + i];
zmm1 = p_cnProcBufRes[j*240 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1708,12 +1710,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<5; j++)
{
// BN offset is units of 9*384/32 = 108
ymm0 = p_cnProcBuf [j*108 + i];
ymm1 = p_cnProcBufRes[j*108 + i];
zmm0 = p_cnProcBuf [j*108 + i];
zmm1 = p_cnProcBufRes[j*108 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1727,12 +1729,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<5; j++)
{
// BN offset is units of 9*384/32 = 108
ymm0 = p_cnProcBuf [j*108 + i];
ymm1 = p_cnProcBufRes[j*108 + i];
zmm0 = p_cnProcBuf [j*108 + i];
zmm1 = p_cnProcBufRes[j*108 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1775,12 +1777,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<6; j++)
{
// BN offset is units of 3*384/32 = 36
ymm0 = p_cnProcBuf [j*36 + i];
ymm1 = p_cnProcBufRes[j*36 + i];
zmm0 = p_cnProcBuf [j*36 + i];
zmm1 = p_cnProcBufRes[j*36 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1794,12 +1796,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<6; j++)
{
// BN offset is units of 3*384/32 = 36
ymm0 = p_cnProcBuf [j*36 + i];
ymm1 = p_cnProcBufRes[j*36 + i];
zmm0 = p_cnProcBuf [j*36 + i];
zmm1 = p_cnProcBufRes[j*36 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1842,12 +1844,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<8; j++)
{
// BN offset is units of 2*384/32 = 24
ymm0 = p_cnProcBuf [j*24 + i];
ymm1 = p_cnProcBufRes[j*24 + i];
zmm0 = p_cnProcBuf [j*24 + i];
zmm1 = p_cnProcBufRes[j*24 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1861,12 +1863,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<8; j++)
{
// BN offset is units of 2*384/32 = 24
ymm0 = p_cnProcBuf [j*24 + i];
ymm1 = p_cnProcBufRes[j*24 + i];
zmm0 = p_cnProcBuf [j*24 + i];
zmm1 = p_cnProcBufRes[j*24 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1909,12 +1911,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<10; j++)
{
// BN offset is units of 2*384/32 = 24
ymm0 = p_cnProcBuf [j*24 + i];
ymm1 = p_cnProcBufRes[j*24 + i];
zmm0 = p_cnProcBuf [j*24 + i];
zmm1 = p_cnProcBufRes[j*24 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -1928,12 +1930,12 @@ static inline uint64_t nrLDPC_cnProcPc_BG2(t_nrLDPC_lut* p_lut, t_nrLDPC_procBuf
for (j=0; j<10; j++)
{
// BN offset is units of 2*384/32 = 24
ymm0 = p_cnProcBuf [j*24 + i];
ymm1 = p_cnProcBufRes[j*24 + i];
zmm0 = p_cnProcBuf [j*24 + i];
zmm1 = p_cnProcBufRes[j*24 + i];
// Add BN and input LLR, extract the sign bit
// and add in GF(2) (xor)
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(ymm0,ymm1));
pcRes ^= _mm512_movemask_epi8(_mm512_adds_epi8(zmm0,zmm1));
}
// If no error pcRes should be 0
@@ -29,17 +29,15 @@
*/
#include <stdint.h>
//#include <immintrin.h>
#include <immintrin.h>
#include "nrLDPCdecoder_defs.h"
#include "nrLDPC_types.h"
#include "nrLDPC_init.h"
#include "nrLDPC_mPass.h"
#include "nrLDPC_cnProc.h"
#include "nrLDPC_bnProc.h"
#include <avx512fintrin.h>
//#include "include/immintrin.h"
#include "include/avx512fintrin.h"
#include "include/avx2intrin.h"
#define NR_LDPC_ENABLE_PARITY_CHECK
#define NR_LDPC_PROFILER_DETAIL