chages in AVX512 code generator. Yields small improvement compared to AVX2, BLER performance is still degraded.

This commit is contained in:
Raymond Knopp
2020-06-01 14:40:11 +02:00
parent c67550e531
commit 8663ee697e
113 changed files with 76401 additions and 80400 deletions
+2 -2
View File
@@ -138,8 +138,8 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l") else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
if(EXISTS "/proc/cpuinfo") if(EXISTS "/proc/cpuinfo")
file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1) file(STRINGS "/proc/cpuinfo" CPUINFO REGEX flags LIMIT_COUNT 1)
if (CPUINFO MATCHES "avx512f") if (CPUINFO MATCHES "avx512bw")
set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -march=skylake-avx512 -mtune=skylake-avx512") set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx512bw")
set(COMPILATION_AVX2 "True") set(COMPILATION_AVX2 "True")
else() else()
if (CPUINFO MATCHES "avx2") if (CPUINFO MATCHES "avx2")
@@ -333,8 +333,8 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
{ {
case 384: case 384:
{ {
// nrLDPC_cnProc_BG1_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //nrLDPC_cnProc_BG1_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
nrLDPC_cnProc_BG1_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //we test here nrLDPC_cnProc_BG1_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //we test here
break; break;
} }
case 352: case 352:
@@ -1475,7 +1475,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
case 384: case 384:
{ {
nrLDPC_cnProc_BG2_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); nrLDPC_cnProc_BG2_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
// nrLDPC_cnProc_BG2_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //nrLDPC_cnProc_BG2_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
break; break;
} }
case 352: case 352:
@@ -1922,7 +1922,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
{ {
case 384: case 384:
{ {
// nrLDPC_cnProc_BG1_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //nrLDPC_cnProc_BG1_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
nrLDPC_cnProc_BG1_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //we test here nrLDPC_cnProc_BG1_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //we test here
break; break;
} }
@@ -2273,7 +2273,7 @@ static inline uint32_t nrLDPC_decoder_core(int8_t* p_llr, int8_t* p_out, t_nrLDP
case 384: case 384:
{ {
nrLDPC_cnProc_BG2_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); nrLDPC_cnProc_BG2_Z384_13_AVX2(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
// nrLDPC_cnProc_BG2_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes); //nrLDPC_cnProc_BG2_Z384_13_AVX512(p_procBuf->cnProcBuf,p_procBuf->cnProcBufRes);
break; break;
} }
case 352: case 352:
@@ -42,7 +42,7 @@
*/ */
static inline void* malloc32_clear(size_t size) static inline void* malloc32_clear(size_t size)
{ {
void* ptr = (void*) memalign(32, size+32); void* ptr = (void*) memalign(64, size+64);
memset(ptr, 0, size); memset(ptr, 0, size);
return ptr; return ptr;
} }
@@ -8,12 +8,12 @@ OBJ= $(SRC:.c=.o)
all: $(EXEC) all: $(EXEC)
cnProc_gen_avx2: $(OBJ) cnProc_gen_avx2: $(OBJ)
@$(CC) -o $@ $^ $(LDFLAGS) -O2 @$(CC) -o $@ $^ $(LDFLAGS) -O2
#main.o: cnProc_gen_avx2.h #main.o: cnProc_gen_avx2.h
%.o: %.c %.o: %.c
@$(CC) -o $@ -c $< $(CFLAGS) -I ${OPENAIR_HOME}/openair1 -g @$(CC) -o $@ -c $< $(CFLAGS) -I ${OPENAIR_HOME}/openair1 -g -std=c99
.PHONY: clean mrproper .PHONY: clean mrproper
@@ -21,7 +21,6 @@ void nrLDPC_cnProc_BG1_generator_AVX2(uint16_t Z,int R)
fprintf(fd,"#include <stdint.h>\n"); fprintf(fd,"#include <stdint.h>\n");
fprintf(fd,"#include <immintrin.h>\n"); fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd,"#include "\"../include/avx512fintrin.h>\"\n");
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_%s_AVX2(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]); fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_%s_AVX2(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]);
@@ -411,10 +410,10 @@ void nrLDPC_cnProc_BG1_generator_AVX2(uint16_t Z,int R)
// Process group with 8 BNs // Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n"); fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/32 = 24 // Offset is 2*384/32 = 24
const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,120,144,168}, {0,48,72,96,120,144,168}, const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,24,72,96,120,144,168}, {0,24,48,96,120,144,168}, {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,24,48,72,120,144,168}, {0,24,48,72,96,144,168}, {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,24,48,72,96,120,168}, {0,24,48,72,96,120,144}}; {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
Binary file not shown.
@@ -13,7 +13,7 @@ cnProc_gen_avx512: $(OBJ)
#main.o: cnProc_gen_avx512.h #main.o: cnProc_gen_avx512.h
%.o: %.c %.o: %.c
@$(CC) -o $@ -c $< $(CFLAGS) -I ${OPENAIR_HOME}/openair1 -g @$(CC) -o $@ -c $< $(CFLAGS) -I ${OPENAIR_HOME}/openair1 -g -std=c99
.PHONY: clean mrproper .PHONY: clean mrproper
@@ -1,8 +1,6 @@
#include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <immintrin.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h"
#include "../../nrLDPC_bnProc.h"
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R) void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{ {
@@ -22,12 +20,7 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd,"#include <immintrin.h>\n"); fprintf(fd,"#include <immintrin.h>\n");
fprintf(fd, "__m512i _mm512_sign_epi16(__m512i a, __m512i b){ \n"); /* Emulate _mm512_sign_epi16() with instructions that exist in the AVX-512 instruction set */ fprintf(fd, "#define conditional_negate(a,b,z) _mm512_mask_sub_epi8(a,_mm512_movepi8_mask(b),z,a)\n");
fprintf(fd, "b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); \n" );
fprintf(fd, "b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); \n" );
fprintf(fd, " a = _mm512_mullo_epi16(a, b);\n");
fprintf(fd, "return a;\n");
fprintf(fd, "}\n" );
fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]); fprintf(fd,"void nrLDPC_cnProc_BG1_Z%d_%s_AVX512(int8_t* cnProcBuf,int8_t* cnProcBufRes) {\n",Z,ratestr[R]);
@@ -69,21 +62,21 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Offsets are in units of bitOffsetInGroup (1*384/64)=6 // Offsets are in units of bitOffsetInGroup (1*384/64)=6
// Offsets are in units of bitOffsetInGroup (1*384/64)=6 // Offsets are in units of bitOffsetInGroup (1*384/64)=6
const uint8_t lut_idxCnProcG3[3][2] = {{6,12}, {0,12}, {0,6}}; const uint8_t lut_idxCnProcG3[3][2] = {{12,24}, {0,24}, {0,12}};
fprintf(fd," __m512i zmm0, min, sgn,ones,maxLLR;\n"); fprintf(fd," __m512i zmm0, min, sgn,zeros,maxLLR;\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," maxLLR = _mm512_set1_epi8((char)127);\n");
if (lut_numCnInCnGroups[0] > 0) if (lut_numCnInCnGroups[0] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[0]*Z + 63)>>5; M = (lut_numCnInCnGroups[0]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[0]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 3 // Set pointers to start of group 3
@@ -104,53 +97,51 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i+=2) {\n",M); fprintf(fd," for (int i=0;i<%d;i+=2) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+lut_idxCnProcG3[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// 32 CNs of second BN // 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]); 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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup));
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][0]+1); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][0]/2)+1);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// 32 CNs of second BN // 32 CNs of second BN
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][1] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>5)+lut_idxCnProcG3[j][1]+1); fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[0]>>6)+(lut_idxCnProcG3[j][1]/2)+1);
// min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[0]>>5)+(j*bitOffsetInGroup)+1); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[0]>>6)+(j*bitOffsetInGroup)+1);
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
@@ -160,16 +151,16 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 4 BNs // Process group with 4 BNs
fprintf(fd,"//Process group with 4 BNs\n"); fprintf(fd,"//Process group with 4 BNs\n");
// Offset is 5*384/64 = 30 // Offset is 5*384/64 = 30
const uint8_t lut_idxCnProcG4[4][3] = {{30,60,90}, {0,60,90}, {0,30,90}, {0,30,60}}; const uint8_t lut_idxCnProcG4[4][3] = {{60,120,180}, {0,120,180}, {0,60,180}, {0,60,120}};
if (lut_numCnInCnGroups[1] > 0) if (lut_numCnInCnGroups[1] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[1]*Z + 63)>>5; M = (lut_numCnInCnGroups[1]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[1]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 4 // Set pointers to start of group 4
@@ -188,31 +179,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>6)+lut_idxCnProcG4[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<3; k++) for (k=1; k<3; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[1]>>5)+lut_idxCnProcG4[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[1]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[1]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -222,18 +212,18 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 5 BNs // 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/64 = 216 // Offset is 18*384/64 = 216
const uint16_t lut_idxCnProcG5[5][4] = {{108,216,324,432}, {0,216,324,432}, const uint16_t lut_idxCnProcG5[5][4] = {{216,432,648,864}, {0,432,648,864},
{0,108,324,432}, {0,108,216,432}, {0,108,216,324}}; {0,216,648,864}, {0,216,432,864}, {0,216,432,648}};
if (lut_numCnInCnGroups[2] > 0) if (lut_numCnInCnGroups[2] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[2]*Z + 63)>>5; M = (lut_numCnInCnGroups[2]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[2]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 4 // Set pointers to start of group 4
@@ -253,31 +243,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>6)+lut_idxCnProcG5[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<4; k++) for (k=1; k<4; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[2]>>5)+lut_idxCnProcG5[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[2]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[2]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -286,19 +275,19 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 6 BNs // Process group with 6 BNs
fprintf(fd,"//Process group with 6 BNs\n"); fprintf(fd,"//Process group with 6 BNs\n");
// Offset is 8*384/64 = 48 // Offset is 8*384/64 = 48
const uint16_t lut_idxCnProcG6[6][5] = {{48,96,144,192,240}, {0,96,144,192,240}, const uint16_t lut_idxCnProcG6[6][5] = {{96,192,288,384,480}, {0,192,288,384,480},
{0,48,144,192,240}, {0,48,96,192,240}, {0,96,288,384,480}, {0,96,192,384,480},
{0,48,96,144,240}, {0,48,96,144,192}}; {0,96,192,288,480}, {0,96,192,288,384}};
if (lut_numCnInCnGroups[3] > 0) if (lut_numCnInCnGroups[3] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[3]*Z + 63)>>5; M = (lut_numCnInCnGroups[3]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[3]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 4 // Set pointers to start of group 4
@@ -318,31 +307,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>6)+lut_idxCnProcG6[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<5; k++) for (k=1; k<5; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[3]>>5)+lut_idxCnProcG6[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[3]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[3]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -352,20 +340,20 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 7 BNs // Process group with 7 BNs
fprintf(fd,"//Process group with 7 BNs\n"); fprintf(fd,"//Process group with 7 BNs\n");
// Offset is 5*384/64 = 30 // Offset is 5*384/64 = 30
const uint16_t lut_idxCnProcG7[7][6] = {{30,60,90,120,150,180}, {0,60,90,120,150,180}, const uint16_t lut_idxCnProcG7[7][6] = {{60,120,180,240,300,360}, {0,120,180,240,300,360},
{0,30,90,120,150,180}, {0,30,60,120,150,180}, {0,60,180,240,300,360}, {0,60,120,240,300,360},
{0,30,60,90,150,180}, {0,30,60,90,120,180}, {0,60,120,180,300,360}, {0,60,120,180,240,360},
{0,30,60,90,120,150}}; {0,60,120,180,240,300}};
if (lut_numCnInCnGroups[4] > 0) if (lut_numCnInCnGroups[4] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[4]*Z + 63)>>5; M = (lut_numCnInCnGroups[4]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[4]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 4 // Set pointers to start of group 4
@@ -385,31 +373,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][0]); fprintf(fd," sgn= ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>6)+lut_idxCnProcG7[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi816(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<6; k++) for (k=1; k<6; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[4]>>5)+lut_idxCnProcG7[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[4]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[4]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -419,10 +406,10 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 8 BNs // Process group with 8 BNs
fprintf(fd,"//Process group with 8 BNs\n"); fprintf(fd,"//Process group with 8 BNs\n");
// Offset is 2*384/64 = 12 // Offset is 2*384/64 = 12
const uint8_t lut_idxCnProcG8[8][7] = {{12,24,36,48,56,72,84}, {0,24,36,48,56,72,84}, const uint8_t lut_idxCnProcG8[8][7] = {{24,48,72,96,112,144,168}, {0,48,72,96,112,144,168},
{0,12,36,48,56,72,84}, {0,12,24,48,56,72,84}, {0,24,72,96,112,144,168}, {0,24,48,96,112,144,168},
{0,12,24,36,56,72,84}, {0,12,24,36,48,72,84}, {0,24,48,72,112,144,168}, {0,24,48,72,96,144,168},
{0,12,24,36,48,56,84}, {0,12,24,36,48,120,72}}; {0,24,48,72,96,112,168}, {0,24,48,72,96,112,144}};
@@ -430,10 +417,10 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[5]*Z + 63)>>5; M = (lut_numCnInCnGroups[5]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[5]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 4 // Set pointers to start of group 4
@@ -453,31 +440,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>6)+lut_idxCnProcG8[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<7; k++) for (k=1; k<7; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[5]>>5)+lut_idxCnProcG8[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[5]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[5]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -486,11 +472,11 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 9 BNs // Process group with 9 BNs
fprintf(fd,"//Process group with 9 BNs\n"); fprintf(fd,"//Process group with 9 BNs\n");
// Offset is 2*384/64 = 12 // Offset is 2*384/64 = 12
const uint8_t lut_idxCnProcG9[9][8] = {{12,24,36,48,60,72,84,96}, {0,24,36,48,60,72,84,96}, const uint8_t lut_idxCnProcG9[9][8] = {{24,48,72,96,120,144,168,192}, {0,48,72,96,120,144,168,192},
{0,12,36,48,60,72,84,96}, {0,12,24,48,60,72,84,96}, {0,24,72,96,120,144,168,192}, {0,24,48,96,120,144,168,192},
{0,12,24,36,60,72,84,96}, {0,12,24,36,48,72,84,96}, {0,24,48,72,120,144,168,192}, {0,24,48,72,96,144,168,192},
{0,12,24,36,48,60,84,96}, {0,12,24,36,48,60,72,96}, {0,24,48,72,96,120,168,192}, {0,24,48,72,96,120,144,192},
{0,12,24,36,48,60,72,84}}; {0,24,48,72,96,120,144,168}};
@@ -499,10 +485,10 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[6]*Z + 63)>>5; M = (lut_numCnInCnGroups[6]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[6]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 9 // Set pointers to start of group 9
@@ -522,31 +508,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>6)+lut_idxCnProcG9[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<8; k++) for (k=1; k<8; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[6]>>5)+lut_idxCnProcG9[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[6]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn, zeros);\n",(lut_startAddrCnGroups[6]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -555,11 +540,12 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 10 BNs // Process group with 10 BNs
fprintf(fd,"//Process group with 10 BNs\n"); fprintf(fd,"//Process group with 10 BNs\n");
// Offset is 1*384/64 = 6 // Offset is 1*384/64 = 6
const uint8_t lut_idxCnProcG10[10][9] = {{6,12,18,24,30,36,42,48,54}, {0,12,18,24,30,36,42,48,54}, 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,6,18,24,30,36,42,48,54}, {0,6,12,24,30,36,42,48,54}, {0,12,36,48,60,72,84,96,108}, {0,12,24,48,60,72,84,96,108},
{0,6,12,18,30,36,42,48,54}, {0,6,12,18,24,36,42,48,54}, {0,12,24,36,60,72,84,96,108}, {0,12,24,36,48,72,84,96,108},
{0,6,12,18,24,30,42,48,54}, {0,6,12,18,24,30,36,48,54}, {0,12,24,36,48,60,84,96,108}, {0,12,24,36,48,60,72,96,108},
{0,6,12,18,24,30,36,42,54}, {0,6,12,36,24,30,36,42,48}}; {0,12,24,36,48,60,72,84,108}, {0,12,24,36,48,60,72,84,96}};
@@ -569,10 +555,10 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[7]*Z + 63)>>5; M = (lut_numCnInCnGroups[7]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[7]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 10 // Set pointers to start of group 10
@@ -592,31 +578,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>6)+lut_idxCnProcG10[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<9; k++) for (k=1; k<9; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[7]>>5)+lut_idxCnProcG10[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[7]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min,sgn,zeros);\n",(lut_startAddrCnGroups[7]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -626,26 +611,26 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
// Process group with 19 BNs // 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/64 = 24 // Offset is 4*384/64 = 24
const uint16_t lut_idxCnProcG19[19][18] = {{24,48,72,96,120,144,168,192,216,240,264,288,312,336,360,384,408,432}, {0,48,72,96,120,144,168,192,216,240,264,288,312,336,360,384,408,432}, 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,24,72,96,120,144,168,192,216,240,264,288,312,336,360,384,408,432}, {0,24,48,96,120,144,168,192,216,240,264,288,312,336,360,384,408,432}, {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,24,48,72,120,144,168,192,216,240,264,288,312,336,360,384,408,432}, {0,24,48,72,96,144,168,192,216,240,264,288,312,336,360,384,408,432}, {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,24,48,72,96,120,168,192,216,240,264,288,312,336,360,384,408,432}, {0,24,48,72,96,120,144,192,216,240,264,288,312,336,360,384,408,432}, {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,24,48,72,96,120,144,168,216,240,264,288,312,336,360,384,408,432}, {0,24,48,72,96,120,144,168,192,240,264,288,312,336,360,384,408,432}, {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,24,48,72,96,120,144,168,192,216,264,288,312,336,360,384,408,432}, {0,24,48,72,96,120,144,168,192,216,240,288,312,336,360,384,408,432}, {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,24,48,72,96,120,144,168,192,216,240,264,312,336,360,384,408,432}, {0,24,48,72,96,120,144,168,192,216,240,264,288,336,360,384,408,432}, {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,24,48,72,96,120,144,168,192,216,240,264,288,312,360,384,408,432}, {0,24,48,72,96,120,144,168,192,216,240,264,288,312,336,384,408,432}, {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,24,48,72,96,120,144,168,192,216,240,264,288,312,336,360,408,432}, {0,24,48,72,96,120,144,168,192,216,240,264,288,312,336,360,384,432}, {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,24,48,72,96,120,144,168,192,216,240,264,288,312,336,360,384,408}}; {0,48,96,144,192,240,288,336,384,432,480,528,576,624,672,720,768,816}};
if (lut_numCnInCnGroups[8] > 0) if (lut_numCnInCnGroups[8] > 0)
{ {
// Number of groups of 64 CNs for parallel processing // Number of groups of 64 CNs for parallel processing
// Ceil for values not divisible by 64 // Ceil for values not divisible by 64
M = (lut_numCnInCnGroups[8]*Z + 63)>>5; M = (lut_numCnInCnGroups[8]*Z + 63)>>6;
// Set the offset to each bit within a group in terms of 64 Byte // Set the offset to each bit within a group in terms of 64 Byte
bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>5; bitOffsetInGroup = (lut_numCnInCnGroups_BG1_R13[8]*NR_LDPC_ZMAX)>>6;
// Set pointers to start of group 19 // Set pointers to start of group 19
@@ -665,31 +650,30 @@ void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t Z,int R)
fprintf(fd," for (int i=0;i<%d;i++) {\n",M); fprintf(fd," for (int i=0;i<%d;i++) {\n",M);
// Abs and sign of 64 CNs (first BN) // Abs and sign of 64 CNs (first BN)
// zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i]; // zmm0 = p_cnProcBuf[lut_idxCnProcG3[j][0] + i];
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][0]); fprintf(fd," sgn = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>6)+lut_idxCnProcG19[j][0]/2);
// sgn = _mm512_sign_epi16(ones, zmm0); // sgn = _mm512_sign_epi8(ones, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(ones, zmm0);\n");
// min = _mm512_abs_epi8(zmm0); // min = _mm512_abs_epi8(zmm0);
fprintf(fd," min = _mm512_abs_epi8(zmm0);\n"); fprintf(fd," min = _mm512_abs_epi8(sgn);\n");
// Loop over BNs // Loop over BNs
for (k=1; k<18; k++) for (k=1; k<18; k++)
{ {
fprintf(fd," zmm0 = ((__m512i*)cnProcBuf)[%d+i];\n",(lut_startAddrCnGroups[8]>>5)+lut_idxCnProcG19[j][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)); // min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));
fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n"); fprintf(fd," min = _mm512_min_epu8(min, _mm512_abs_epi8(zmm0));\n");
// sgn = _mm512_sign_epi16(sgn, zmm0); // sgn = _mm512_sign_epi8(sgn, zmm0);
fprintf(fd," sgn = _mm512_sign_epi16(sgn, zmm0);\n"); fprintf(fd," sgn = _mm512_xor_si512(sgn, zmm0);\n");
} }
// Store result // Store result
// min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127 // min = _mm512_min_epu8(min, maxLLR); // 128 in epi8 is -127
fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n"); fprintf(fd," min = _mm512_min_epu8(min, maxLLR);\n");
// *p_cnProcBufResBit = _mm512_sign_epi16(min, sgn); // *p_cnProcBufResBit = _mm512_sign_epi8(min, sgn);
// p_cnProcBufResBit++; // p_cnProcBufResBit++;
fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = _mm512_sign_epi16(min, sgn);\n",(lut_startAddrCnGroups[8]>>5)+(j*bitOffsetInGroup)); fprintf(fd," ((__m512i*)cnProcBufRes)[%d+i] = conditional_negate(min, sgn,zeros);\n",(lut_startAddrCnGroups[8]>>6)+(j*bitOffsetInGroup));
fprintf(fd," }\n"); fprintf(fd," }\n");
} }
} }
@@ -1,8 +1,7 @@
#include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <immintrin.h>
#include "../../nrLDPCdecoder_defs.h" #include "../../nrLDPCdecoder_defs.h"
#include "../../nrLDPC_types.h"
#include "../../nrLDPC_bnProc.h"
void nrLDPC_cnProc_BG2_generator_AVX512(uint16_t Z,int R) void nrLDPC_cnProc_BG2_generator_AVX512(uint16_t Z,int R)
{ {
@@ -1,9 +1,6 @@
#include <stdio.h> #include <stdio.h>
#include <immintrin.h> #include <stdint.h>
#include "../../nrLDPC_types.h"
#include "../../nrLDPC_init.h"
#include "../../nrLDPC_bnProc.h"
#define NB_Z 51 #define NB_Z 51
void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t,int); void nrLDPC_cnProc_BG1_generator_AVX512(uint16_t,int);
void nrLDPC_cnProc_BG2_generator_AVX512(uint16_t,int); void nrLDPC_cnProc_BG2_generator_AVX512(uint16_t,int);
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));
@@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <immintrin.h> #include <immintrin.h>
#include "../include/avx512fintrin.h"
__m512i _mm512_sign_epi16(__m512i a, __m512i b){ __m512i _mm512_sign_epi16(__m512i a, __m512i b){
b = _mm512_min_epi16(b, _mm512_set1_epi16(1)); b = _mm512_min_epi16(b, _mm512_set1_epi16(1));
b = _mm512_max_epi16(b, _mm512_set1_epi16(-1)); b = _mm512_max_epi16(b, _mm512_set1_epi16(-1));

Some files were not shown because too many files have changed in this diff Show More