additional SIMD optimizations
This commit is contained in:
@@ -420,7 +420,7 @@ void applyFtoleft(t_nrPolar_params *pp,decoder_node_t *node) {
|
|||||||
#ifdef DEBUG_NEW_IMPL
|
#ifdef DEBUG_NEW_IMPL
|
||||||
printf("betal[0] %d (%p)\n",betal[0],&betal[0]);
|
printf("betal[0] %d (%p)\n",betal[0],&betal[0]);
|
||||||
#endif
|
#endif
|
||||||
pp->nr_polar_u[node->first_leaf_index] = (betal[0]+1)>>1;
|
pp->nr_polar_u[node->first_leaf_index] = (1+betal[0])>>1;
|
||||||
#ifdef DEBUG_NEW_IMPL
|
#ifdef DEBUG_NEW_IMPL
|
||||||
printf("Setting bit %d to %d (LLR %d)\n",node->first_leaf_index,(betal[0]+1)>>1,alpha_l[0]);
|
printf("Setting bit %d to %d (LLR %d)\n",node->first_leaf_index,(betal[0]+1)>>1,alpha_l[0]);
|
||||||
#endif
|
#endif
|
||||||
@@ -466,7 +466,7 @@ void applyGtoright(t_nrPolar_params *pp,decoder_node_t *node) {
|
|||||||
}
|
}
|
||||||
if (node->Nv == 2) { // apply hard decision on right node
|
if (node->Nv == 2) { // apply hard decision on right node
|
||||||
betar[0] = (alpha_r[0]>0) ? -1 : 1;
|
betar[0] = (alpha_r[0]>0) ? -1 : 1;
|
||||||
pp->nr_polar_u[node->first_leaf_index+1] = (betar[0]+1)>>1;
|
pp->nr_polar_u[node->first_leaf_index+1] = (1+betar[0])>>1;
|
||||||
#ifdef DEBUG_NEW_IMPL
|
#ifdef DEBUG_NEW_IMPL
|
||||||
printf("Setting bit %d to %d (LLR %d frozen_mask %d)\n",node->first_leaf_index+1,(betar[0]+1)>>1,alpha_r[0],frozen_mask);
|
printf("Setting bit %d to %d (LLR %d frozen_mask %d)\n",node->first_leaf_index+1,(betar[0]+1)>>1,alpha_r[0],frozen_mask);
|
||||||
#endif
|
#endif
|
||||||
@@ -474,7 +474,6 @@ void applyGtoright(t_nrPolar_params *pp,decoder_node_t *node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
|
void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
|
||||||
|
|
||||||
int16_t *betav = node->beta;
|
int16_t *betav = node->beta;
|
||||||
@@ -484,14 +483,31 @@ void computeBeta(t_nrPolar_params *pp,decoder_node_t *node) {
|
|||||||
printf("Computing beta @ level %d first_leaf_index %d (all_frozen %d)\n",node->level,node->first_leaf_index,node->left->all_frozen);
|
printf("Computing beta @ level %d first_leaf_index %d (all_frozen %d)\n",node->level,node->first_leaf_index,node->left->all_frozen);
|
||||||
#endif
|
#endif
|
||||||
if (node->left->all_frozen==0) { // if left node is not aggregation of frozen bits
|
if (node->left->all_frozen==0) { // if left node is not aggregation of frozen bits
|
||||||
for (int i=0;i<node->Nv/2;i++) {
|
/*#if defined(__AVX2__)
|
||||||
betav[i] = (betal[i] != betar[i]) ? 1 : -1;
|
int avx2mod = (node->Nv/2)&15;
|
||||||
#ifdef DEBUG_NEW_IMPL
|
if (avx2mod == 0) {
|
||||||
printf("COMPUTE betav[%d] %d (%p)\n",i,
|
int avx2len = node->Nv/2/16;
|
||||||
betav[i],
|
|
||||||
&betav[i]);
|
for (int i=0;i<avx2len;i++) {
|
||||||
#endif
|
((__m256i*)betav)[i] = _mm256_sign_epi16(((__m256i*)betar)[i],
|
||||||
|
((__m256i*)betal)[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if (avx2mod == 8) {
|
||||||
|
((__m128i*)betav)[0] = _mm_sign_epi16(((__m128i*)betar)[0],
|
||||||
|
((__m128i*)betal)[0]);
|
||||||
|
}
|
||||||
|
else if (avx2mod == 4) {
|
||||||
|
((__m64*)betav)[0] = _mm_sign_pi16(((__m64*)betar)[0],
|
||||||
|
((__m64*)betal)[0]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif*/
|
||||||
|
{
|
||||||
|
for (int i=0;i<node->Nv/2;i++) {
|
||||||
|
betav[i] = (betal[i] != betar[i]) ? 1 : -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else memcpy((void*)&betav[0],betar,(node->Nv/2)*sizeof(int16_t));
|
else memcpy((void*)&betav[0],betar,(node->Nv/2)*sizeof(int16_t));
|
||||||
memcpy((void*)&betav[node->Nv/2],betar,(node->Nv/2)*sizeof(int16_t));
|
memcpy((void*)&betav[node->Nv/2],betar,(node->Nv/2)*sizeof(int16_t));
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ typedef struct decoder_node_t_s {
|
|||||||
int first_leaf_index;
|
int first_leaf_index;
|
||||||
int all_frozen;
|
int all_frozen;
|
||||||
int16_t *alpha;
|
int16_t *alpha;
|
||||||
int8_t *beta;
|
int16_t *beta;
|
||||||
} decoder_node_t;
|
} decoder_node_t;
|
||||||
|
|
||||||
typedef struct decoder_tree_t_s {
|
typedef struct decoder_tree_t_s {
|
||||||
|
|||||||
Reference in New Issue
Block a user