From b038399c90c7bc9afb7e2234070e944db3016639 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Tue, 5 Mar 2024 09:41:04 +0100 Subject: [PATCH] use the new SIMD sorting wrappers --- polar_helper.hh | 5 +++-- polar_list_decoder.hh | 26 ++++++++------------------ polar_parity_aided.hh | 30 ++++++++++-------------------- 3 files changed, 21 insertions(+), 40 deletions(-) diff --git a/polar_helper.hh b/polar_helper.hh index e05c599..3103469 100644 --- a/polar_helper.hh +++ b/polar_helper.hh @@ -7,6 +7,7 @@ Copyright 2020 Ahmet Inan #pragma once #include "simd.hh" +#include "sort.hh" namespace CODE { @@ -105,7 +106,7 @@ template struct PolarHelper> { typedef SIMD TYPE; - typedef int PATH; + typedef int32_t PATH; typedef SIMD MAP; static TYPE one() { @@ -156,7 +157,7 @@ struct PolarHelper> template <> struct PolarHelper { - typedef int PATH; + typedef int32_t PATH; static int8_t one() { return 1; diff --git a/polar_list_decoder.hh b/polar_list_decoder.hh index 761b645..68b735c 100644 --- a/polar_list_decoder.hh +++ b/polar_list_decoder.hh @@ -6,7 +6,6 @@ Copyright 2020 Ahmet Inan #pragma once -#include #include "polar_helper.hh" namespace CODE { @@ -53,32 +52,23 @@ struct PolarListNode static MAP rate1(PATH *metric, TYPE *message, MAP *maps, int *count, TYPE *hard, TYPE *soft) { TYPE sft = soft[1]; - PATH fork[2*TYPE::SIZE]; + SIMD fork; for (int k = 0; k < TYPE::SIZE; ++k) - fork[2*k] = fork[2*k+1] = metric[k]; + fork.v[2*k] = fork.v[2*k+1] = metric[k]; for (int k = 0; k < TYPE::SIZE; ++k) if (sft.v[k] < 0) - fork[2*k] -= sft.v[k]; + fork.v[2*k] -= sft.v[k]; else - fork[2*k+1] += sft.v[k]; - int perm[2*TYPE::SIZE]; - for (int k = 0; k < 2*TYPE::SIZE; ++k) - perm[k] = k; -#if 1 - std::stable_sort(perm, perm+2*TYPE::SIZE, [fork](int a, int b){ return fork[a] < fork[b]; }); -#else - std::partial_sort(perm, perm+TYPE::SIZE-1, perm+2*TYPE::SIZE, [fork](int a, int b){ - return fork[a] < fork[b] ? true : fork[a] > fork[b] ? false : a < b; - }); -#endif + fork.v[2*k+1] += sft.v[k]; + auto perm = vorder(fork); for (int k = 0; k < TYPE::SIZE; ++k) - metric[k] = fork[perm[k]]; + metric[k] = fork.v[perm.v[k]]; MAP map; for (int k = 0; k < TYPE::SIZE; ++k) - map.v[k] = perm[k] >> 1; + map.v[k] = perm.v[k] >> 1; TYPE hrd; for (int k = 0; k < TYPE::SIZE; ++k) - hrd.v[k] = 1 - 2 * (perm[k] & 1); + hrd.v[k] = 1 - 2 * (perm.v[k] & 1); message[*count] = hrd; maps[*count] = map; ++*count; diff --git a/polar_parity_aided.hh b/polar_parity_aided.hh index 7cce3eb..4988b53 100644 --- a/polar_parity_aided.hh +++ b/polar_parity_aided.hh @@ -6,7 +6,6 @@ Copyright 2023 Ahmet Inan #pragma once -#include #include "polar_helper.hh" namespace CODE { @@ -101,41 +100,32 @@ struct PolarParityNode static MAP rate1(PATH *metric, TYPE *message, MAP *maps, int *index, TYPE *hard, TYPE *soft, TYPE *parity, int *count, int stride) { TYPE sft = soft[1]; - PATH fork[2*TYPE::SIZE]; + SIMD fork; for (int k = 0; k < TYPE::SIZE; ++k) - fork[2*k] = fork[2*k+1] = metric[k]; + fork.v[2*k] = fork.v[2*k+1] = metric[k]; for (int k = 0; k < TYPE::SIZE; ++k) if (sft.v[k] < 0) - fork[2*k] -= sft.v[k]; + fork.v[2*k] -= sft.v[k]; else - fork[2*k+1] += sft.v[k]; + fork.v[2*k+1] += sft.v[k]; if (*count == 0) { TYPE chk = *parity; *parity = PH::one(); for (int k = 0; k < TYPE::SIZE; ++k) if (chk.v[k] < 0) - fork[2*k] = 1000; + fork.v[2*k] = 1000; else - fork[2*k+1] = 1000; + fork.v[2*k+1] = 1000; } - int perm[2*TYPE::SIZE]; - for (int k = 0; k < 2*TYPE::SIZE; ++k) - perm[k] = k; -#if 1 - std::stable_sort(perm, perm+2*TYPE::SIZE, [fork](int a, int b){ return fork[a] < fork[b]; }); -#else - std::partial_sort(perm, perm+TYPE::SIZE-1, perm+2*TYPE::SIZE, [fork](int a, int b){ - return fork[a] < fork[b] ? true : fork[a] > fork[b] ? false : a < b; - }); -#endif + auto perm = vorder(fork); for (int k = 0; k < TYPE::SIZE; ++k) - metric[k] = fork[perm[k]]; + metric[k] = fork.v[perm.v[k]]; MAP map; for (int k = 0; k < TYPE::SIZE; ++k) - map.v[k] = perm[k] >> 1; + map.v[k] = perm.v[k] >> 1; TYPE hrd; for (int k = 0; k < TYPE::SIZE; ++k) - hrd.v[k] = 1 - 2 * (perm[k] & 1); + hrd.v[k] = 1 - 2 * (perm.v[k] & 1); if (*count) { message[*index] = hrd; *parity = PH::qmul(vshuf(*parity, map), hrd);