Fix fused MoE backward stability and padding skips (#1398)

## Summary

- Add exact valid-row metadata and skip fully padded MLP3/MLP4 K blocks.
This is the only intentional new runtime feature.
- Fix SM100 fused-backward hangs and non-finite gradients by replacing
invalid partial-CTA synchronization with pair-scoped DSMEM barriers,
separating X/dY TMA mbarriers, and draining overlapped TMA pipelines
before shared-memory phase reuse.
- Fix SM90 TM64 subtile semaphore scheduling, cross-configuration buffer
sizing, and per-forward routing-count lifetime.
- Retain only validated SM100 backward templates and regenerate
single-/multi-GPU tuning tables.
- Add exhaustive dispatch and PyTorch-autograd comparisons for every
unique tuned template.

## Details

Same-host communication remains TMA-based; NVSHMEM getmem is used only
for cross-host/IB traffic. SM100 communication remains M128/NC4; the
rejected M256 experiments are not enabled.

Backward performance versus mainline (which is not a multi-GPU
correctness oracle because its backward produces non-finite gradients):

| Architecture | 1K | 4K |
|---|---:|---:|
| SM90 | 3.849 ms (+0.7%) | 6.222 ms (-4.2%) |
| SM100 | 2.092 ms (+5.4%) | 3.249 ms (+9.0%) |

## Testing Done

- Hardware Type: H100 (SM90) and B200 (SM100)
- [ ] run `make test` to ensure correctness (replaced by the targeted
distributed GPU suites below)
- [x] run `make checkstyle` to ensure code style
- [ ] run `make test-convergence` to ensure convergence (not applicable
to the fused C++ MoE path)
- Full distributed MoE integration suite: 8/8 passed on both SM90 and
SM100.
- Every unique tuned template compared with a PyTorch autograd
reference:
  - SM90: 9 forward / 23 backward templates.
  - SM100: 8 forward / 3 backward templates.
- C++ dispatch-table coverage passed on both architectures.
- SM100 repeated-cycle stress: 100 single-GPU cycles and 30 eight-GPU
cycles.
- Full SM100 tuning completed without non-finite/CUDA failures:
  - single-GPU: 346 rows.
  - multi-GPU: 437 rows.

Co-authored-by: jkolehma <[email protected]>
Co-authored-by: Copilot <[email protected]>
This commit is contained in:
Jari Kolehmainen
2026-08-21 16:42:12 +00:00
committed by GitHub
co-authored by jkolehma Copilot
parent 500866071d
commit e804c0d238
33 changed files with 2853 additions and 1390 deletions
@@ -91,9 +91,9 @@ struct CtaCounterBarrier {
__threadfence();
cutlass::arch::NamedBarrier::sync(NumThreads, BarrierId);
if (threadIdx.x == 0) {
atomicAdd(counter, 1);
cuda::atomic_ref<int, cuda::thread_scope_device> r(*counter);
while (r.load(cuda::memory_order_relaxed) < target) {}
r.fetch_add(1, cuda::memory_order_release);
while (r.load(cuda::memory_order_acquire) < target) {}
}
cutlass::arch::NamedBarrier::sync(NumThreads, BarrierId);
}
@@ -124,9 +124,9 @@ struct SyncThreadsCtaCounterBarrier {
__threadfence();
__syncthreads();
if (threadIdx.x == 0) {
atomicAdd(counter, 1);
cuda::atomic_ref<int, cuda::thread_scope_device> r(*counter);
while (r.load(cuda::memory_order_relaxed) < target) {}
r.fetch_add(1, cuda::memory_order_release);
while (r.load(cuda::memory_order_acquire) < target) {}
}
__syncthreads();
}
+101 -45
View File
@@ -81,11 +81,11 @@ struct MlpDims {
template <typename Traits1, typename Traits2,
int ZBufferSlots = 2,
// SubTiles = CommTileM/GemmTileM ∈ {1,2}. When 2, each 128-wide comm
// tile (one acquire_src/release_src/acquire_dst/release_dst) is
// consumed as 2 GemmTileM(=64)-row sub-tiles: mlp1 runs both sub-tiles
// (into 2 Z regions), then mlp2 runs both. The comm semaphores stay
// 128-wide; only the TMA + wgmma granularity is finer. 1 → unchanged.
// SubTiles = CommTileM/GemmTileM. Each communication tile (one
// acquire_src/release_src/acquire_dst/release_dst) is consumed as
// SubTiles GemmTileM-row regions: mlp1 produces all Z regions, then
// mlp2 drains them. The communication tile remains intact; only the
// TMA + wgmma granularity is finer. 1 → unchanged.
int SubTiles = 1,
int Compute = 90,
typename TileIter,
@@ -191,8 +191,8 @@ __device__ __forceinline__ void mlp_fused_fwd(
// Z buffer: [grid_x, ZBufferSlots, SubTiles, GemmTileM, intermediate_dim].
// Indexed in GemmTileM-row tiles: SubTiles Z regions per comm-tile slot so
// mlp1 can stage both sub-tiles before mlp2 drains them. z_rows is unchanged
// (grid_x·ZBuf·128 == grid_x·ZBuf·SubTiles·GemmTileM), only the indexing splits.
// mlp1 can stage all sub-tiles before mlp2 drains them. z_rows is unchanged
// (CommTileM == SubTiles·GemmTileM); only the indexing splits.
int z_col = (col >= 0) ? col : (int)blockIdx.x;
int z_grid_x = (grid_x >= 0) ? grid_x : (int)gridDim.x;
int num_z_m_tiles = z_grid_x * ZBufferSlots * SubTiles;
@@ -228,27 +228,45 @@ __device__ __forceinline__ void mlp_fused_fwd(
auto tile = iter.next();
int expert = tile.expert - local_expert_start;
int first_sub = 0;
int last_sub = SubTiles;
if constexpr (SubTiles > 1) {
first_sub = tile.m_subtile;
last_sub = first_sub + 1;
}
// Base Z region for this comm tile. SubTiles GemmTileM-row regions per
// slot, indexed z_m_base + sub. tile.y_m is the comm slot index in
// CommTileM(=GemmTileM·SubTiles) units; the GemmTileM-unit row coordinate
// of sub-tile `sub` into the 128-wide slot is tile.y_m·SubTiles + sub.
// of sub-tile `sub` in that slot is tile.y_m·SubTiles + sub.
int z_m_base = z_base + (tile_iter % ZBufferSlots) * SubTiles;
// Phase 1: for each GemmTileM sub-tile, Z[z_m_base+sub] = SiLU(B@X)·(C@X).
// One comm semaphore (acquire_src above) covers all SubTiles; the GEMM
// just steps finer. SubTiles==1 collapses to the original single tile.
for (int sub = 0; sub < SubTiles; ++sub) {
for (int sub = first_sub; sub < last_sub; ++sub) {
int x_mt = tile.y_m * SubTiles + sub;
int z_m = z_m_base + sub;
if constexpr (Compute == 100) smem.mlp1.tmem_base = smem.tmem_base;
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits1::WarpSize == 0)
smem.mlp1.tmem_base = smem.tmem_base;
if (warp_id == 0) {
mlp1_fused_producer<Traits1, Compute == 90>(
p1_pipe, p1_state,
smem.mlp1, tma_load_x, tma_load_b, tma_load_c,
x_mt, (Compute == 90) ? expert : expert * dims.expert_n_stride_1,
num_tokens, dims.hidden_dim, dims.intermediate_dim,
dims.num_experts, dims.total_n_rows_1,
dims.num_n_tiles_1, dims.num_k_tiles_1, n_split, n_count);
if constexpr (Compute == 100) {
mlp1_fused_producer<Traits1>(
p1_pipe, p1_state,
smem.mlp1, tma_load_x, tma_load_b, tma_load_c,
x_mt, expert * dims.expert_n_stride_1,
num_tokens, dims.hidden_dim, dims.intermediate_dim,
dims.num_experts, dims.total_n_rows_1,
dims.num_n_tiles_1, dims.num_k_tiles_1, n_split, n_count);
} else {
mlp1_fused_producer<Traits1, true>(
p1_pipe, p1_state,
smem.mlp1, tma_load_x, tma_load_b, tma_load_c,
x_mt, expert,
num_tokens, dims.hidden_dim, dims.intermediate_dim,
dims.num_experts, dims.total_n_rows_1,
dims.num_n_tiles_1, dims.num_k_tiles_1, n_split, n_count);
}
}
// Fused MoE CTA warp map: warp 0 = TMA, warps 1..3 = NVSHMEM comm
@@ -263,19 +281,30 @@ __device__ __forceinline__ void mlp_fused_fwd(
// §5) — intentionally out of scope.
if (warp_id >= 3 && warp_id <= 11) {
mlp1_fused_consumer<Traits1, Compute>(
p1_pipe, p1_cons_state,
smem.mlp1, tma_store_z, z_m, dims.intermediate_dim,
num_z_m_tiles, dims.num_n_tiles_1, dims.num_k_tiles_1, n_split, n_count);
if constexpr (Compute == 100) {
mlp1_fused_consumer<Traits1, 100>(
p1_pipe, p1_cons_state,
smem.mlp1, tma_store_z, z_m, dims.intermediate_dim,
num_z_m_tiles, dims.num_n_tiles_1, dims.num_k_tiles_1,
n_split, n_count);
} else {
mlp1_fused_consumer<Traits1, 90>(
p1_pipe, p1_cons_state,
smem.mlp1, tma_store_z, z_m, dims.intermediate_dim,
num_z_m_tiles, dims.num_n_tiles_1, dims.num_k_tiles_1,
n_split, n_count);
}
}
// Barrier between sub-tiles so the smem mlp1 union is free to reuse.
// The final sub-tile reuses the shared phase-1-done barrier below.
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(kMlpBarrierThreads, kMlpBarrierId);
if constexpr (Compute == 90) {
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(
kMlpBarrierThreads, kMlpBarrierId);
}
}
// Intra-CTA sync: all MLP warps done with phase 1 (all sub-tiles).
// One phase barrier covers the full communication tile. The persistent
// TMA/UMMA pipeline states sequence its GEMM sub-tiles internally.
cutlass::arch::NamedBarrier::sync(kMlpBarrierThreads, kMlpBarrierId);
// Release src staging (remote: free slot; local: no-op).
@@ -303,33 +332,59 @@ __device__ __forceinline__ void mlp_fused_fwd(
int y_ntiles = (y_direct ? dims.y_buf_m_tiles : num_m_tiles) * SubTiles;
// Phase 2: for each sub-tile, Y[y_base·SubTiles+sub] = Z[z_m_base+sub] @ A^T.
// Cooperative-M-split: both consumer WGs cooperate on the same (m,n) tile.
// Cooperative-M-split: both consumer WGs cooperate on the same (m,n) tile.
for (int sub = 0; sub < SubTiles; ++sub) {
for (int sub = first_sub; sub < last_sub; ++sub) {
int z_m = z_m_base + sub;
int y_coord = y_base * SubTiles + sub;
if constexpr (Compute == 100) smem.mlp2.tmem_base = smem.tmem_base;
constexpr int kM64PerGemmTile = Traits2::TileM / 64;
int valid_m64_subtiles = max(
0, min(kM64PerGemmTile,
tile.valid_m64_subtiles - sub * kM64PerGemmTile));
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits2::WarpSize == 0)
smem.mlp2.tmem_base = smem.tmem_base;
if (warp_id == 0) {
mlp2_fused_producer<Traits2, Compute == 90>(
p2_pipe, p2_state,
smem.mlp2, tma_load_z, tma_load_a,
z_m, (Compute == 90) ? expert : expert * dims.num_n_tiles_2,
num_z_m_tiles * Traits1::TileM, dims.hidden_dim,
dims.intermediate_dim, dims.num_experts, dims.total_n_rows_2,
dims.num_n_tiles_2, dims.num_k_tiles_2, n_split, n_count);
if constexpr (Compute == 100) {
mlp2_fused_producer<Traits2>(
p2_pipe, p2_state,
smem.mlp2, tma_load_z, tma_load_a,
z_m, expert * dims.num_n_tiles_2,
num_z_m_tiles * Traits1::TileM, dims.hidden_dim,
dims.intermediate_dim, dims.num_experts, dims.total_n_rows_2,
dims.num_n_tiles_2, dims.num_k_tiles_2, n_split, n_count);
} else {
mlp2_fused_producer<Traits2, true>(
p2_pipe, p2_state,
smem.mlp2, tma_load_z, tma_load_a,
z_m, expert,
num_z_m_tiles * Traits1::TileM, dims.hidden_dim,
dims.intermediate_dim, dims.num_experts, dims.total_n_rows_2,
dims.num_n_tiles_2, dims.num_k_tiles_2, n_split, n_count);
}
}
if (warp_id >= 3 && warp_id <= 11) {
mlp2_fused_consumer<Traits2, Compute>(
p2_pipe, p2_cons_state,
smem.mlp2, y_desc,
y_coord, dims.hidden_dim,
y_ntiles, dims.num_n_tiles_2, dims.num_k_tiles_2, n_split, n_count);
if constexpr (Compute == 100) {
mlp2_fused_consumer<Traits2, 100>(
p2_pipe, p2_cons_state,
smem.mlp2, y_desc,
y_coord, dims.hidden_dim,
y_ntiles, dims.num_n_tiles_2, dims.num_k_tiles_2,
n_split, n_count, valid_m64_subtiles);
} else {
mlp2_fused_consumer<Traits2, 90>(
p2_pipe, p2_cons_state,
smem.mlp2, y_desc,
y_coord, dims.hidden_dim,
y_ntiles, dims.num_n_tiles_2, dims.num_k_tiles_2,
n_split, n_count);
}
}
// Barrier between sub-tiles so the smem mlp2 union is free to reuse.
// The final sub-tile reuses the shared post-phase-2 barrier below.
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(kMlpBarrierThreads, kMlpBarrierId);
if constexpr (Compute == 90) {
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(
kMlpBarrierThreads, kMlpBarrierId);
}
}
// Release dst staging (remote: cross-CTA barrier + signal; local: no-op).
@@ -339,6 +394,7 @@ __device__ __forceinline__ void mlp_fused_fwd(
// done by RemoteIter::release_dst below (all threads). This is just the
// intra-CTA ordering before the MLP-warp barrier.
__threadfence();
// As in phase 1, synchronize once after all GEMM sub-tiles.
cutlass::arch::NamedBarrier::sync(kMlpBarrierThreads, kMlpBarrierId);
iter.release_dst(threadIdx.x);
@@ -72,7 +72,8 @@ template <
int TileN_ = 128,
int TileK_ = 64,
int Stages_ = 4,
int EpiChunkN_ = 32
int EpiChunkN_ = 32,
int ActStoreTileM_ = 64
>
struct Mlp1Traits {
using Element = Element_;
@@ -83,6 +84,7 @@ struct Mlp1Traits {
static constexpr int TileK = TileK_;
static constexpr int Stages = Stages_;
static constexpr int EpiChunkN = EpiChunkN_;
static constexpr int ActStoreTileM = ActStoreTileM_;
static_assert(TileM == 64 || TileM == 128, "TileM must be 64 or 128");
@@ -96,6 +98,10 @@ struct Mlp1Traits {
static_assert(TileN <= 256, "TileN must fit TMA box limit");
static_assert(WgTileN % EpiChunkN == 0, "EpiChunkN must divide WgTileN");
static_assert(ActStoreTileM == 32 || ActStoreTileM == 64,
"activation TMA stores support M32 or M64");
static_assert(TileM % ActStoreTileM == 0,
"activation store TileM must divide the GEMM TileM");
static_assert(kMSplit || (TileN % 2 == 0),
"TileN must be even when TileM=64 (cooperative N-split halves)");
static constexpr int NumEpiRounds = WgTileN / EpiChunkN;
@@ -127,6 +133,9 @@ struct Mlp1Traits {
Shape<Int<AtomTileM>, Int<EpiChunkN>>,
Stride<Int<EpiChunkN>, _1>>;
using SmemLayoutStore_1 = SmemLayoutStoreSlot;
using SmemLayoutActStoreSlot = Layout<
Shape<Int<ActStoreTileM>, Int<EpiChunkN>>,
Stride<Int<EpiChunkN>, _1>>;
using MainloopPipeline = cutlass::PipelineTmaAsync<Stages>;
using PipelineState = cutlass::PipelineState<Stages>;
@@ -283,7 +292,8 @@ __device__ __forceinline__ auto mlp1_make_pipe_umma(
// Single fused X + W1 + W2 TMA pipe per k-step.
// ═══════════════════════════════════════════════════════════════════
template <typename Traits, bool Expert3D = false, typename Pipeline,
template <typename Traits, bool Expert3D = false, int MSubTiles = 1,
typename Pipeline,
typename TmaLoadX, typename TmaLoadW>
__device__ __forceinline__ void mlp1_fused_producer(
Pipeline& pipe,
@@ -349,11 +359,6 @@ __device__ __forceinline__ void mlp1_fused_producer(
auto tW1sW1 = cta_tma_b.partition_D(sW1);
auto tW2sW2 = cta_tma_c.partition_D(sW2);
auto gX = local_tile(mX,
make_tile(Int<Traits::TileM>{}, Int<Traits::TileK>{}),
make_coord(m, _));
auto tXgX = cta_tma_x.partition_S(gX);
int n_start = (split_idx >= 0) ? split_idx : (int)blockIdx.y;
int n_stride = (num_splits >= 0) ? num_splits : (int)gridDim.y;
@@ -383,6 +388,13 @@ __device__ __forceinline__ void mlp1_fused_producer(
auto tBgB = cta_tma_b.partition_S(gB);
auto tCgC = cta_tma_c.partition_S(gC);
CUTE_UNROLL
for (int m_sub = 0; m_sub < MSubTiles; ++m_sub) {
auto gX = local_tile(mX,
make_tile(Int<Traits::TileM>{}, Int<Traits::TileK>{}),
make_coord(m + m_sub, _));
auto tXgX = cta_tma_x.partition_S(gX);
for (int k = 0; k < num_k_tiles; ++k) {
pipe.producer_acquire(state);
if (threadIdx.x == 0) {
@@ -396,6 +408,7 @@ __device__ __forceinline__ void mlp1_fused_producer(
}
++state;
}
}
}
}
@@ -425,7 +438,7 @@ struct Mlp1FusedConsumerImpl;
template <>
struct Mlp1FusedConsumerImpl<90> {
template <typename Traits, typename Pipeline, typename TmaStoreZ>
template <typename Traits, int MSubTiles, typename Pipeline, typename TmaStoreZ>
static __device__ __forceinline__ void run(
Pipeline& pipe,
typename Traits::PipelineState& state,
@@ -440,6 +453,8 @@ static __device__ __forceinline__ void run(
int split_idx,
int num_splits) {
static_assert(MSubTiles == 1,
"Hopper MLP1 consumer processes one GEMM M-tile per invocation");
using Element = typename Traits::Element;
typename Traits::TiledMma tiled_mma;
int tid_in_mma = threadIdx.x - Traits::WarpGroupSize; // 0..255
@@ -628,7 +643,7 @@ static __device__ __forceinline__ void run(
template <>
struct Mlp1FusedConsumerImpl<100> {
template <typename Traits, typename Pipeline, typename TmaStoreZ>
template <typename Traits, int MSubTiles, typename Pipeline, typename TmaStoreZ>
static __device__ __forceinline__ void run(
Pipeline& pipe,
typename Traits::PipelineState& state,
@@ -764,6 +779,8 @@ static __device__ __forceinline__ void run(
bool store_in_flight = false;
for (int n = n_start; n < num_n_tiles; n += n_stride) {
CUTE_UNROLL
for (int m_sub = 0; m_sub < MSubTiles; ++m_sub) {
// ── Mainloop (MMA warp = warp 3 only): bracket the k-loop with the
// accumulator pipeline. producer_acquire selects the free TMEM stage
@@ -823,6 +840,7 @@ static __device__ __forceinline__ void run(
// TMEM → registers (this chunk, full TileM rows).
copy(t2r, tTR_tAccU(_, _, _, _0{}, chunk), tTR_rU);
copy(t2r, tTR_tAccV(_, _, _, _0{}, chunk), tTR_rV);
cutlass::arch::fence_view_async_tmem_load();
// SiLU(U)·V fused in place (overwrites the U regs) so it overlaps
// the prior in-flight store. The cast to Element happens at the
@@ -850,7 +868,7 @@ static __device__ __forceinline__ void run(
if (is_wg_leader) {
cute::tma_store_fence();
int m_tile_idx = MSub * z_m + ms;
int m_tile_idx = MSub * (z_m + m_sub) + ms;
int n_tile_idx = n * (TileN / EpiChunkN) + chunk;
auto gZ = local_tile(mZ,
make_tile(Int<AtomTileM>{}, Int<EpiChunkN>{}),
@@ -871,6 +889,7 @@ static __device__ __forceinline__ void run(
acc_pipe.consumer_release(acc_cons_state);
++acc_cons_state;
}
}
}
if (is_epilogue && store_in_flight)
cute::tma_store_wait<0>();
@@ -892,7 +911,7 @@ static __device__ __forceinline__ void run(
// pass mlp1_fused_consumer<Traits, 100>(...) to select the Blackwell path.
// ───────────────────────────────────────────────────────────────────
template <typename Traits, int Compute = 90,
template <typename Traits, int Compute = 90, int MSubTiles = 1,
typename Pipeline, typename TmaStoreZ>
__device__ __forceinline__ void mlp1_fused_consumer(
Pipeline& pipe,
@@ -906,7 +925,8 @@ __device__ __forceinline__ void mlp1_fused_consumer(
int num_k_tiles,
int split_idx = -1,
int num_splits = -1) {
Mlp1FusedConsumerImpl<Compute>::template run<Traits, Pipeline, TmaStoreZ>(
Mlp1FusedConsumerImpl<Compute>::template run<
Traits, MSubTiles, Pipeline, TmaStoreZ>(
pipe, state, smem, tma_store_z, z_m, intermediate_dim,
num_z_m_tiles, num_n_tiles, num_k_tiles, split_idx, num_splits);
}
@@ -44,7 +44,8 @@ struct Mlp1FusedActSmem {
static constexpr int smem_X_size = cosize_v<typename Traits::SmemLayoutX>;
static constexpr int smem_W_size = cosize_v<typename Traits::SmemLayoutW>;
static constexpr int smem_store_size = cosize_v<typename Traits::SmemLayoutStoreSlot>;
static constexpr int smem_store_size =
cosize_v<typename Traits::SmemLayoutActStoreSlot>;
alignas(128) Element smem_X[smem_X_size];
alignas(128) Element smem_W1[smem_W_size];
@@ -242,16 +243,23 @@ static __device__ __forceinline__ void run(
const int my_barrier_id = 1 + my_wg; // 1 or 2
const bool is_my_wg_leader = (tid_in_wg == 0);
constexpr int store_slot_elems = Traits::AtomTileM * Traits::EpiChunkN;
static_assert(Traits::AtomTileM % Traits::ActStoreTileM == 0,
"activation store TileM must divide the Hopper warpgroup strip");
constexpr int StoreSlicesPerWg =
Traits::AtomTileM / Traits::ActStoreTileM;
constexpr int StoreTilesPerM =
Traits::TileM / Traits::ActStoreTileM;
constexpr int store_slot_elems =
Traits::ActStoreTileM * Traits::EpiChunkN;
Element* my_store_u = smem.store_buf_u + my_wg * store_slot_elems;
Element* my_store_v = smem.store_buf_v + my_wg * store_slot_elems;
Element* my_store_z = smem.store_buf_z + my_wg * store_slot_elems;
auto sStoreU = make_tensor(make_smem_ptr(my_store_u),
typename Traits::SmemLayoutStoreSlot{});
typename Traits::SmemLayoutActStoreSlot{});
auto sStoreV = make_tensor(make_smem_ptr(my_store_v),
typename Traits::SmemLayoutStoreSlot{});
typename Traits::SmemLayoutActStoreSlot{});
auto sStoreZ = make_tensor(make_smem_ptr(my_store_z),
typename Traits::SmemLayoutStoreSlot{});
typename Traits::SmemLayoutActStoreSlot{});
// int64_t cast: num_z_m_tiles · TileM · intermediate_dim can exceed INT_MAX.
auto out_shape = make_shape(
@@ -327,77 +335,84 @@ static __device__ __forceinline__ void run(
// col_tile = n * (TileN/EpiChunkN) + my_wg*NER + r.
CUTE_UNROLL
for (int r = 0; r < Traits::NumEpiRounds; ++r) {
if (store_in_flight)
cute::tma_store_wait<0>();
cutlass::arch::NamedBarrier::sync(Traits::WarpGroupSize, my_barrier_id);
int chunk_start = r * Traits::EpiChunkN;
CUTE_UNROLL
for (int i = 0; i < size(acc_B); ++i) {
auto coord = tCcC(i);
int m_loc = get<0>(coord);
int n_loc = get<1>(coord);
int m_local, n_local;
if constexpr (Traits::kMSplit) {
m_local = m_loc - my_wg * Traits::AtomTileM;
n_local = n_loc;
} else {
m_local = m_loc;
n_local = n_loc - my_wg * Traits::WgTileN;
}
if (n_local >= chunk_start &&
n_local < chunk_start + Traits::EpiChunkN) {
int chunk_n = n_local - chunk_start;
float u = acc_B(i);
float v = acc_C(i);
float sig = fast_sigmoid(u);
float vprime = u * sig; // silu(U)
float sil_d = sig + vprime * (1.0f - sig); // silu'(U)
float uprime = v * sil_d; // V · silu'(U)
float z = vprime * v; // Z = V' * V
sStoreU(m_local, chunk_n) = static_cast<Element>(uprime);
sStoreV(m_local, chunk_n) = static_cast<Element>(vprime);
sStoreZ(m_local, chunk_n) = static_cast<Element>(z);
}
}
for (int ms = 0; ms < StoreSlicesPerWg; ++ms) {
if (store_in_flight)
cute::tma_store_wait<0>();
cutlass::arch::NamedBarrier::sync(Traits::WarpGroupSize, my_barrier_id);
cutlass::arch::NamedBarrier::sync(
Traits::WarpGroupSize, my_barrier_id);
if (is_my_wg_leader) {
cute::tma_store_fence();
int row_tile, col_tile;
if constexpr (Traits::kMSplit) {
// TileM=128: 2 row tiles per logical M tile.
row_tile = 2 * z_m + my_wg;
col_tile = n * Traits::NumEpiRounds + r;
} else {
// TileM=64: 1 row tile per logical M tile; WG_w handles
// its N-half.
row_tile = z_m;
col_tile = n * (Traits::TileN / Traits::EpiChunkN)
+ my_wg * Traits::NumEpiRounds + r;
int chunk_start = r * Traits::EpiChunkN;
CUTE_UNROLL
for (int i = 0; i < size(acc_B); ++i) {
auto coord = tCcC(i);
int m_loc = get<0>(coord);
int n_loc = get<1>(coord);
int m_local, n_local;
if constexpr (Traits::kMSplit) {
m_local = m_loc - my_wg * Traits::AtomTileM;
n_local = n_loc;
} else {
m_local = m_loc;
n_local = n_loc - my_wg * Traits::WgTileN;
}
if (m_local >= ms * Traits::ActStoreTileM
&& m_local < (ms + 1) * Traits::ActStoreTileM
&& n_local >= chunk_start
&& n_local < chunk_start + Traits::EpiChunkN) {
int store_m = m_local - ms * Traits::ActStoreTileM;
int chunk_n = n_local - chunk_start;
float u = acc_B(i);
float v = acc_C(i);
float sig = fast_sigmoid(u);
float vprime = u * sig;
float sil_d = sig + vprime * (1.0f - sig);
sStoreU(store_m, chunk_n) =
static_cast<Element>(v * sil_d);
sStoreV(store_m, chunk_n) =
static_cast<Element>(vprime);
sStoreZ(store_m, chunk_n) =
static_cast<Element>(vprime * v);
}
}
auto gU = local_tile(mU,
make_tile(Int<Traits::AtomTileM>{}, Int<Traits::EpiChunkN>{}),
make_coord(row_tile, col_tile));
auto gV = local_tile(mV,
make_tile(Int<Traits::AtomTileM>{}, Int<Traits::EpiChunkN>{}),
make_coord(row_tile, col_tile));
auto gZ = local_tile(mZ,
make_tile(Int<Traits::AtomTileM>{}, Int<Traits::EpiChunkN>{}),
make_coord(row_tile, col_tile));
copy(tma_store_du_coef, cta_tma_u.partition_S(sStoreU),
cta_tma_u.partition_D(gU));
cute::tma_store_arrive();
copy(tma_store_dv_coef, cta_tma_v.partition_S(sStoreV),
cta_tma_v.partition_D(gV));
cute::tma_store_arrive();
copy(tma_store_z, cta_tma_z.partition_S(sStoreZ),
cta_tma_z.partition_D(gZ));
cute::tma_store_arrive();
cutlass::arch::NamedBarrier::sync(
Traits::WarpGroupSize, my_barrier_id);
if (is_my_wg_leader) {
cute::tma_store_fence();
int row_tile, col_tile;
if constexpr (Traits::kMSplit) {
row_tile = StoreTilesPerM * z_m
+ my_wg * StoreSlicesPerWg + ms;
col_tile = n * Traits::NumEpiRounds + r;
} else {
row_tile = StoreTilesPerM * z_m + ms;
col_tile = n * (Traits::TileN / Traits::EpiChunkN)
+ my_wg * Traits::NumEpiRounds + r;
}
auto tile = make_tile(
Int<Traits::ActStoreTileM>{},
Int<Traits::EpiChunkN>{});
auto gU = local_tile(
mU, tile, make_coord(row_tile, col_tile));
auto gV = local_tile(
mV, tile, make_coord(row_tile, col_tile));
auto gZ = local_tile(
mZ, tile, make_coord(row_tile, col_tile));
copy(tma_store_du_coef, cta_tma_u.partition_S(sStoreU),
cta_tma_u.partition_D(gU));
cute::tma_store_arrive();
copy(tma_store_dv_coef, cta_tma_v.partition_S(sStoreV),
cta_tma_v.partition_D(gV));
cute::tma_store_arrive();
copy(tma_store_z, cta_tma_z.partition_S(sStoreZ),
cta_tma_z.partition_D(gZ));
cute::tma_store_arrive();
}
store_in_flight = true;
}
store_in_flight = true;
}
}
if (store_in_flight)
@@ -434,13 +449,13 @@ static __device__ __forceinline__ void run(
constexpr int TileM = Traits::TileM;
constexpr int TileN = Traits::TileN;
constexpr int EpiChunkN = Traits::EpiChunkN;
constexpr int AtomTileM = Traits::AtomTileM;
constexpr int StoreTileM = Traits::ActStoreTileM;
static_assert(TileN % 2 == 0,
"Blackwell consumer splits TileN across the two consumer warpgroups");
constexpr int WgN = TileN / 2;
static_assert(WgN % EpiChunkN == 0, "EpiChunkN must divide TileN/2");
constexpr int NChunksHalf = WgN / EpiChunkN;
constexpr int MSub = TileM / AtomTileM;
constexpr int MSub = TileM / StoreTileM;
const int warp_id = threadIdx.x / Traits::WarpSize;
const bool is_mma_warp = (warp_id == 3);
@@ -494,13 +509,13 @@ static __device__ __forceinline__ void run(
tCtAccV.data() = tmem_base + uint32_t(TileN);
// Three per-WG store slots (U', V', Z) — same smem as Hopper.
constexpr int store_slot_elems = AtomTileM * EpiChunkN;
constexpr int store_slot_elems = StoreTileM * EpiChunkN;
auto sStoreU = make_tensor(make_smem_ptr(smem.store_buf_u + wg * store_slot_elems),
typename Traits::SmemLayoutStoreSlot{});
typename Traits::SmemLayoutActStoreSlot{});
auto sStoreV = make_tensor(make_smem_ptr(smem.store_buf_v + wg * store_slot_elems),
typename Traits::SmemLayoutStoreSlot{});
typename Traits::SmemLayoutActStoreSlot{});
auto sStoreZ = make_tensor(make_smem_ptr(smem.store_buf_z + wg * store_slot_elems),
typename Traits::SmemLayoutStoreSlot{});
typename Traits::SmemLayoutActStoreSlot{});
auto out_shape = make_shape(
static_cast<int64_t>(num_z_m_tiles) * TileM,
@@ -587,6 +602,7 @@ static __device__ __forceinline__ void run(
// one MSub slice, so this evaluates each element once.
copy(t2r, tTR_tAccU_stage(_, _, _, _0{}, chunk), tTR_rU);
copy(t2r, tTR_tAccV_stage(_, _, _, _0{}, chunk), tTR_rV);
cutlass::arch::fence_view_async_tmem_load();
CUTE_UNROLL
for (int ms = 0; ms < MSub; ++ms) {
@@ -598,16 +614,20 @@ static __device__ __forceinline__ void run(
for (int i = 0; i < size(tTR_rU); ++i) {
int m_row = get<0>(tTR_cChunk(i));
int n_col = get<1>(tTR_cChunk(i));
if (m_row >= ms * AtomTileM && m_row < (ms + 1) * AtomTileM) {
int m_loc = m_row - ms * AtomTileM;
if (m_row >= ms * StoreTileM && m_row < (ms + 1) * StoreTileM) {
int m_loc = m_row - ms * StoreTileM;
float u = tTR_rU(i);
float v = tTR_rV(i);
float sig = fast_sigmoid(u);
float vprime = u * sig; // silu(U)
float sil_d = sig + vprime * (1.0f - sig); // silu'(U)
sStoreU(m_loc, n_col) = static_cast<Element>(v * sil_d); // V·silu'(U)
sStoreV(m_loc, n_col) = static_cast<Element>(vprime); // silu(U)
sStoreZ(m_loc, n_col) = static_cast<Element>(vprime * v); // V'·V
float uprime = v * sil_d;
Element uprime_e = static_cast<Element>(uprime);
Element vprime_e = static_cast<Element>(vprime);
Element z_e = static_cast<Element>(vprime * v);
sStoreU(m_loc, n_col) = uprime_e; // V·silu'(U)
sStoreV(m_loc, n_col) = vprime_e; // silu(U)
sStoreZ(m_loc, n_col) = z_e; // V'·V
}
}
cutlass::arch::NamedBarrier::sync(Traits::WarpGroupSize, wg_barrier_id);
@@ -617,13 +637,13 @@ static __device__ __forceinline__ void run(
int row_tile = MSub * z_m + ms;
int col_tile = n * (TileN / EpiChunkN) + chunk;
auto gU = local_tile(mU,
make_tile(Int<AtomTileM>{}, Int<EpiChunkN>{}),
make_tile(Int<StoreTileM>{}, Int<EpiChunkN>{}),
make_coord(row_tile, col_tile));
auto gV = local_tile(mV,
make_tile(Int<AtomTileM>{}, Int<EpiChunkN>{}),
make_tile(Int<StoreTileM>{}, Int<EpiChunkN>{}),
make_coord(row_tile, col_tile));
auto gZ = local_tile(mZ,
make_tile(Int<AtomTileM>{}, Int<EpiChunkN>{}),
make_tile(Int<StoreTileM>{}, Int<EpiChunkN>{}),
make_coord(row_tile, col_tile));
copy(tma_store_du_coef, cta_tma_u.partition_S(sStoreU),
cta_tma_u.partition_D(gU));
@@ -268,7 +268,8 @@ __device__ __forceinline__ auto mlp2_make_pipe_umma(
// Single fused Z + W TMA pipe per k-step.
// ═══════════════════════════════════════════════════════════════════
template <typename Traits, bool Expert3D = false, typename Pipeline,
template <typename Traits, bool Expert3D = false, int MSubTiles = 1,
typename Pipeline,
typename TmaLoadZ, typename TmaLoadW>
__device__ __forceinline__ void mlp2_fused_producer(
Pipeline& pipe,
@@ -317,11 +318,6 @@ __device__ __forceinline__ void mlp2_fused_producer(
auto tZsZ = cta_tma_z.partition_D(sZ);
auto tWsW = cta_tma_a.partition_D(sW);
auto gZ = local_tile(mZ,
make_tile(Int<Traits::TileM>{}, Int<Traits::TileK>{}),
make_coord(m, _));
auto tZgZ = cta_tma_z.partition_S(gZ);
int n_start = (split_idx >= 0) ? split_idx : (int)blockIdx.y;
int n_stride = (num_splits >= 0) ? num_splits : (int)gridDim.y;
@@ -339,6 +335,13 @@ __device__ __forceinline__ void mlp2_fused_producer(
}();
auto tWgW = cta_tma_a.partition_S(gW);
CUTE_UNROLL
for (int m_sub = 0; m_sub < MSubTiles; ++m_sub) {
auto gZ = local_tile(mZ,
make_tile(Int<Traits::TileM>{}, Int<Traits::TileK>{}),
make_coord(m + m_sub, _));
auto tZgZ = cta_tma_z.partition_S(gZ);
for (int k = 0; k < num_k_tiles; ++k) {
pipe.producer_acquire(state);
if (threadIdx.x == 0) {
@@ -350,6 +353,7 @@ __device__ __forceinline__ void mlp2_fused_producer(
}
++state;
}
}
}
}
@@ -379,7 +383,7 @@ struct Mlp2FusedConsumerImpl;
template <>
struct Mlp2FusedConsumerImpl<90> {
template <typename Traits, typename Pipeline, typename TmaStoreY>
template <typename Traits, int MSubTiles, typename Pipeline, typename TmaStoreY>
static __device__ __forceinline__ void run(
Pipeline& pipe,
typename Traits::PipelineState& state,
@@ -392,9 +396,15 @@ static __device__ __forceinline__ void run(
int num_k_tiles,
// N-split identity (flat-grid launch); -1 → blockIdx.y / gridDim.y.
int split_idx,
int num_splits) {
int num_splits,
int valid_m64_subtiles) {
static_assert(MSubTiles == 1,
"Hopper MLP2 consumer processes one GEMM M-tile per invocation");
using Element = typename Traits::Element;
constexpr int kM64Subtiles = Traits::TileM / 64;
int valid_store_subtiles = valid_m64_subtiles < 0
? kM64Subtiles : min(kM64Subtiles, valid_m64_subtiles);
typename Traits::TiledMma tiled_mma;
int tid_in_mma = threadIdx.x - Traits::WarpGroupSize;
int tid_in_wg = tid_in_mma % Traits::WarpGroupSize;
@@ -477,6 +487,10 @@ static __device__ __forceinline__ void run(
// ── Epilogue ──────────────────────────────────────
// TileM=128 (M-split): WG_w owns rows [w*64, (w+1)*64), full N.
// TileM=64 (N-split): WG_w owns full M, cols [w*WgTileN, ...).
bool store_output = Traits::kMSplit
? (my_wg < valid_store_subtiles)
: (valid_store_subtiles > 0);
if (store_output) {
CUTE_UNROLL
for (int r = 0; r < Traits::NumEpiRounds; ++r) {
if (store_in_flight)
@@ -530,6 +544,7 @@ static __device__ __forceinline__ void run(
}
store_in_flight = true;
}
}
}
if (store_in_flight)
cute::tma_store_wait<0>();
@@ -555,7 +570,7 @@ static __device__ __forceinline__ void run(
template <>
struct Mlp2FusedConsumerImpl<100> {
template <typename Traits, typename Pipeline, typename TmaStoreY>
template <typename Traits, int MSubTiles, typename Pipeline, typename TmaStoreY>
static __device__ __forceinline__ void run(
Pipeline& pipe,
typename Traits::PipelineState& state,
@@ -567,7 +582,8 @@ static __device__ __forceinline__ void run(
int num_n_tiles,
int num_k_tiles,
int split_idx,
int num_splits) {
int num_splits,
int valid_m64_subtiles) {
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 1000)
using Element = typename Traits::Element;
constexpr int TileM = Traits::TileM;
@@ -580,6 +596,8 @@ static __device__ __forceinline__ void run(
static_assert(WgN % EpiChunkN == 0, "EpiChunkN must divide TileN/2");
constexpr int NChunksHalf = WgN / EpiChunkN; // n-chunks per warpgroup
constexpr int MSub = TileM / AtomTileM; // 1 (TileM=64) or 2 (TileM=128)
int valid_store_subtiles = valid_m64_subtiles < 0
? MSub : min(MSub, valid_m64_subtiles);
// ── Thread identity ─────────────────────────────────────
// Warp 3 is the dedicated, epilogue-free UMMA producer. Warps 4..11 are
@@ -676,6 +694,8 @@ static __device__ __forceinline__ void run(
bool store_in_flight = false;
for (int n = n_start; n < num_n_tiles; n += n_stride) {
CUTE_UNROLL
for (int m_sub = 0; m_sub < MSubTiles; ++m_sub) {
// ── Mainloop (warp 3 only): bracket the k-loop with the accumulator
// pipeline. Each k-stage waits/releases the TMA→UMMA mainloop
@@ -721,10 +741,13 @@ static __device__ __forceinline__ void run(
// TMEM → registers (this chunk, full TileM rows).
copy(t2r, tTR_tAcc_stage(_, _, _, _0{}, chunk), tTR_rAcc);
cutlass::arch::fence_view_async_tmem_load();
// Store as MSub × (AtomTileM=64)-row TMA tiles (1 for TileM=64, 2 for 128).
CUTE_UNROLL
for (int ms = 0; ms < MSub; ++ms) {
if (ms >= valid_store_subtiles)
continue;
if (store_in_flight)
cute::tma_store_wait<0>();
@@ -741,7 +764,7 @@ static __device__ __forceinline__ void run(
if (is_wg_leader) {
cute::tma_store_fence();
int m_tile_idx = MSub * y_m + ms;
int m_tile_idx = MSub * (y_m + m_sub) + ms;
int n_tile_idx = n * (TileN / EpiChunkN) + chunk;
auto gY = local_tile(mY,
make_tile(Int<AtomTileM>{}, Int<EpiChunkN>{}),
@@ -761,6 +784,7 @@ static __device__ __forceinline__ void run(
acc_pipe.consumer_release(acc_cons_state);
++acc_cons_state;
}
}
}
if (is_epilogue && store_in_flight)
cute::tma_store_wait<0>();
@@ -782,7 +806,8 @@ static __device__ __forceinline__ void run(
// pass mlp2_fused_consumer<Traits, 100>(...) to select the Blackwell path.
// ───────────────────────────────────────────────────────────────────
template <typename Traits, int Compute = 90, typename Pipeline, typename TmaStoreY>
template <typename Traits, int Compute = 90, int MSubTiles = 1,
typename Pipeline, typename TmaStoreY>
__device__ __forceinline__ void mlp2_fused_consumer(
Pipeline& pipe,
typename Traits::PipelineState& state,
@@ -794,10 +819,12 @@ __device__ __forceinline__ void mlp2_fused_consumer(
int num_n_tiles,
int num_k_tiles,
int split_idx = -1,
int num_splits = -1) {
Mlp2FusedConsumerImpl<Compute>::template run<Traits>(
int num_splits = -1,
int valid_m64_subtiles = -1) {
Mlp2FusedConsumerImpl<Compute>::template run<Traits, MSubTiles>(
pipe, state, smem, tma_store_y, y_m, hidden_dim,
num_y_m_tiles, num_n_tiles, num_k_tiles, split_idx, num_splits);
num_y_m_tiles, num_n_tiles, num_k_tiles, split_idx, num_splits,
valid_m64_subtiles);
}
} // namespace liger
@@ -130,7 +130,8 @@ __device__ __forceinline__ auto mlp2_t_make_pipe_umma(
// with N along intermediate_dim and K along E·hidden_dim.
// ═══════════════════════════════════════════════════════════════════
template <typename Traits, bool Expert3D = false, typename Pipeline,
template <typename Traits, bool Expert3D = false, bool ThrottleTma = false,
typename Pipeline,
typename TmaLoadZ, typename TmaLoadW>
__device__ __forceinline__ void mlp2_t_fused_producer(
Pipeline& pipe,
@@ -202,6 +203,17 @@ __device__ __forceinline__ void mlp2_t_fused_producer(
auto tAgA = cta_tma_a.partition_S(gA);
for (int k = 0; k < num_k_tiles; ++k) {
if constexpr (ThrottleTma) {
if (state.count() >= 1) {
using FullBarrier = typename Pipeline::FullBarrier;
auto completed =
cutlass::make_producer_start_state<Pipeline>();
completed.advance(state.count() - 1);
FullBarrier::wait(
pipe.producer_get_barrier(completed),
completed.phase() ^ 1);
}
}
pipe.producer_acquire(state);
if (threadIdx.x == 0) {
auto* bar = pipe.producer_get_barrier(state);
@@ -215,6 +227,10 @@ __device__ __forceinline__ void mlp2_t_fused_producer(
tAgA(_, _, _, expert_or_k_offset + k),
tWsW(_, _, _, state.index()));
}
if constexpr (ThrottleTma) {
using FullBarrier = typename Pipeline::FullBarrier;
FullBarrier::wait(bar, state.phase() ^ 1);
}
}
++state;
}
@@ -580,6 +596,7 @@ static __device__ __forceinline__ void run(
// TMEM → registers (this chunk, full TileM rows).
copy(t2r, tTR_tAcc_stage(_, _, _, _0{}, chunk), tTR_rAcc);
cutlass::arch::fence_view_async_tmem_load();
// Store as MSub × (AtomTileM=64)-row TMA tiles (1 for TileM=64, 2 for 128).
CUTE_UNROLL
+58 -10
View File
@@ -819,14 +819,27 @@ __device__ __forceinline__ void mlp3_consumer(
int cell_stride,
int batch_kb_start,
int batch_kb_end,
int k_split) {
Mlp3ConsumerImpl<Compute>::template run<Traits, Expert3D>(
pipe, state, smem, tma_reduce_da,
expert_k_starts, expert_k_ends, num_experts,
hidden_dim, intermediate_dim, total_n_rows,
num_m_tiles, num_n_tiles, outer_split,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split);
int k_split,
const cutlass::arch::ClusterBarrier* pair_init_barrier = nullptr,
uint32_t* pair_init_phase = nullptr) {
if constexpr (Compute == 100) {
Mlp3ConsumerImpl<Compute>::template run<Traits, Expert3D>(
pipe, state, smem, tma_reduce_da,
expert_k_starts, expert_k_ends, num_experts,
hidden_dim, intermediate_dim, total_n_rows,
num_m_tiles, num_n_tiles, outer_split,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split,
pair_init_barrier, pair_init_phase);
} else {
Mlp3ConsumerImpl<Compute>::template run<Traits, Expert3D>(
pipe, state, smem, tma_reduce_da,
expert_k_starts, expert_k_ends, num_experts,
hidden_dim, intermediate_dim, total_n_rows,
num_m_tiles, num_n_tiles, outer_split,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split);
}
}
// ═══════════════════════════════════════════════════════════════════
@@ -1278,7 +1291,9 @@ static __device__ __forceinline__ void run(
int cell_stride,
int batch_kb_start,
int batch_kb_end,
int k_split) {
int k_split,
const cutlass::arch::ClusterBarrier* pair_init_barrier,
uint32_t* pair_init_phase) {
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 1000)
(void)hidden_dim;
using Element = typename Traits::Element;
@@ -1316,6 +1331,23 @@ static __device__ __forceinline__ void run(
auto tCgC = cta_mma.partition_C(cAccFull);
auto tCtAcc = cta_mma.make_fragment_C(tCgC);
if (pair_init_barrier != nullptr) {
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
if (warp_id == 3) {
if (cute::elect_one_sync()) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
pair_init_barrier->arrive(peer, !leader);
pair_init_barrier->wait(*pair_init_phase);
pair_init_barrier->arrive(peer, leader);
*pair_init_phase ^= 1;
}
__syncwarp();
}
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
}
using AccPipe = typename Traits::AccumulatorPipeline2Sm;
typename AccPipe::Params acc_params;
acc_params.role = is_mma_warp && is_leader_cta
@@ -1331,6 +1363,20 @@ static __device__ __forceinline__ void run(
typename AccPipe::PipelineState acc_cons_state;
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
if (pair_init_barrier != nullptr && warp_id == 3) {
if (cute::elect_one_sync()) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
pair_init_barrier->arrive(peer, !leader);
pair_init_barrier->wait(*pair_init_phase);
pair_init_barrier->arrive(peer, leader);
*pair_init_phase ^= 1;
}
__syncwarp();
}
if (pair_init_barrier != nullptr)
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
uint32_t tmem_base = smem.tmem_base;
tCtAcc.data() = tmem_base;
@@ -1450,8 +1496,10 @@ static __device__ __forceinline__ void run(
issue_tmem_load =
tid_in_wg / Traits::WarpSize == subpart;
}
if (issue_tmem_load)
if (issue_tmem_load) {
copy(t2r, tAccChunk, tTR_rAcc);
cutlass::arch::fence_view_async_tmem_load();
}
int da_m = e * num_m_tiles + m_tile;
int n_chunk =
+56 -9
View File
@@ -849,13 +849,25 @@ __device__ __forceinline__ void mlp4_consumer(
int cell_stride,
int batch_kb_start,
int batch_kb_end,
int k_split) {
Mlp4ConsumerImpl<Compute>::template run<Traits, Expert3D>(
pipe, state, smem, tma_reduce_db, tma_reduce_dc,
expert_k_starts, expert_k_ends, num_experts,
intermediate_dim, hidden_dim, total_m_rows,
num_m_tiles, num_n_tiles, outer_split,
cell_start, cell_stride, batch_kb_start, batch_kb_end, k_split);
int k_split,
const cutlass::arch::ClusterBarrier* pair_init_barrier = nullptr,
uint32_t* pair_init_phase = nullptr) {
if constexpr (Compute == 100) {
Mlp4ConsumerImpl<Compute>::template run<Traits, Expert3D>(
pipe, state, smem, tma_reduce_db, tma_reduce_dc,
expert_k_starts, expert_k_ends, num_experts,
intermediate_dim, hidden_dim, total_m_rows,
num_m_tiles, num_n_tiles, outer_split,
cell_start, cell_stride, batch_kb_start, batch_kb_end, k_split,
pair_init_barrier, pair_init_phase);
} else {
Mlp4ConsumerImpl<Compute>::template run<Traits, Expert3D>(
pipe, state, smem, tma_reduce_db, tma_reduce_dc,
expert_k_starts, expert_k_ends, num_experts,
intermediate_dim, hidden_dim, total_m_rows,
num_m_tiles, num_n_tiles, outer_split,
cell_start, cell_stride, batch_kb_start, batch_kb_end, k_split);
}
}
// ═══════════════════════════════════════════════════════════════════
@@ -1261,7 +1273,9 @@ static __device__ __forceinline__ void run(
int cell_stride,
int batch_kb_start,
int batch_kb_end,
int k_split) {
int k_split,
const cutlass::arch::ClusterBarrier* pair_init_barrier,
uint32_t* pair_init_phase) {
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 1000)
(void)intermediate_dim;
using Element = typename Traits::Element;
@@ -1301,6 +1315,23 @@ static __device__ __forceinline__ void run(
auto tCgC = cta_mma.partition_C(cAccFull);
auto tCtAcc = cta_mma.make_fragment_C(tCgC);
if (pair_init_barrier != nullptr) {
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
if (warp_id == 3) {
if (cute::elect_one_sync()) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
pair_init_barrier->arrive(peer, !leader);
pair_init_barrier->wait(*pair_init_phase);
pair_init_barrier->arrive(peer, leader);
*pair_init_phase ^= 1;
}
__syncwarp();
}
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
}
using AccPipe = typename Traits::AccumulatorPipeline2Sm;
typename AccPipe::Params acc_params;
acc_params.role = is_mma_warp && is_leader_cta
@@ -1316,6 +1347,20 @@ static __device__ __forceinline__ void run(
typename AccPipe::PipelineState acc_cons_state;
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
if (pair_init_barrier != nullptr && warp_id == 3) {
if (cute::elect_one_sync()) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
pair_init_barrier->arrive(peer, !leader);
pair_init_barrier->wait(*pair_init_phase);
pair_init_barrier->arrive(peer, leader);
*pair_init_phase ^= 1;
}
__syncwarp();
}
if (pair_init_barrier != nullptr)
cutlass::arch::NamedBarrier::sync(kMmaEpiThreads, 3);
uint32_t tmem_base = smem.tmem_base;
tCtAcc.data() = tmem_base;
@@ -1447,8 +1492,10 @@ static __device__ __forceinline__ void run(
tid_in_wg / Traits::WarpSize ==
subpart;
}
if (issue_tmem_load)
if (issue_tmem_load) {
copy(t2r, tAccChunk, tTR_rAcc);
cutlass::arch::fence_view_async_tmem_load();
}
if (store_in_flight)
cute::tma_store_wait<0>();
@@ -542,6 +542,7 @@ static __device__ __forceinline__ void run(
// TMEM → registers (this chunk, full TileM rows).
copy(t2r, tTR_tAcc_stage(_, _, _, _0{}, chunk), tTR_rAcc);
cutlass::arch::fence_view_async_tmem_load();
// Store as MSub × (AtomTileM=64)-row TMA tiles (1 for TileM=64, 2 for 128).
CUTE_UNROLL
+179 -111
View File
@@ -157,8 +157,32 @@ struct MlpFusedBwdSmem {
Compute == 100,
cutlass::arch::ClusterBarrier,
uint32_t> tmem_pair_barrier;
alignas(16) cute::conditional_t<
Compute == 100,
cutlass::arch::ClusterBarrier,
uint32_t> tmem_init_barrier;
alignas(16) cute::conditional_t<
Compute == 100,
cutlass::arch::ClusterBarrier,
uint32_t> acc_pair_barrier;
};
__device__ __forceinline__ void mlp_bwd_pair_barrier_sync(
const cutlass::arch::ClusterBarrier& barrier,
int warp_id) {
if (warp_id == 3) {
if (cute::elect_one_sync()) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
barrier.arrive(peer, !leader);
barrier.wait(0);
barrier.arrive(peer, leader);
}
__syncwarp();
}
}
template <typename Traits1, typename Traits2T, typename Traits3,
typename Traits4, typename Traits5>
struct MlpBwdTmemColumns {
@@ -244,6 +268,7 @@ struct MlpBwdDims {
// clamped to bk_tiles=0.
int num_batches;
int local_expert_start;
int num_pes;
int experts_per_pe; // Phase 3/4 use this to skip k-blocks whose expert
// falls outside [local_expert_start,
// local_expert_start + experts_per_pe). Required
@@ -318,6 +343,7 @@ struct MlpBwdBufs {
// sufficient.
const int* expert_for_k_block_mlp4;
const int* expert_for_k_block_mlp3;
const int* valid_rows_mlp4;
// Per-pass per-expert K-range scratch for Phase 2. Filled once at
// the start of each pass (in the bwd preamble) and consumed by both
@@ -411,7 +437,7 @@ __device__ __forceinline__ void mlp_bwd_run_phase_1a(
int nc = (num_splits >= 0) ? num_splits : (int)gridDim.y;
auto s = mlp_bwd_resume_state<Mlp1MainloopPipelineFor<Traits1, Compute>>(
pa_count, warp_id == 0);
if (warp_id == 0)
if (warp_id == 0) {
mlp1_fused_act_producer<Traits1, Compute == 90>(pa_pipe, s,
smem_mlp1, tma_load_x, tma_load_b_fwd, tma_load_c_fwd,
m, (Compute == 90) ? expert : expert * dims.num_n_tiles_1,
@@ -419,7 +445,12 @@ __device__ __forceinline__ void mlp_bwd_run_phase_1a(
dims.experts_per_pe, dims.total_n_rows_1,
dims.num_n_tiles_1, dims.num_k_tiles_1,
ns, nc);
if constexpr (Compute == 100) smem_mlp1.tmem_base = tmem_base;
if constexpr (Compute == 100)
pa_pipe.producer_tail(s);
}
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits1::WarpSize == 0)
smem_mlp1.tmem_base = tmem_base;
constexpr int kFirstMlp12ConsumerWarp = (Compute == 100) ? 3 : 4;
if (warp_id >= kFirstMlp12ConsumerWarp)
mlp1_fused_act_consumer<Traits1, Compute>(pa_pipe, s,
@@ -447,15 +478,21 @@ __device__ __forceinline__ void mlp_bwd_run_phase_1b(
int nc = (num_splits >= 0) ? num_splits : (int)gridDim.y;
auto s = mlp_bwd_resume_state<Mlp2TMainloopPipelineFor<Traits2T, Compute>>(
pb_count, warp_id == 0);
if (warp_id == 0)
mlp2_t_fused_producer<Traits2T, Compute == 90>(pb_pipe, s,
if (warp_id == 0) {
mlp2_t_fused_producer<Traits2T, /*Expert3D=*/true,
/*ThrottleTma=*/false>(pb_pipe, s,
smem_mlp2t, tma_load_dy, tma_load_a_col,
m, (Compute == 90) ? expert : expert * dims.num_k_tiles_2t,
m, expert,
dims.num_tokens, dims.hidden_dim, dims.intermediate_dim,
dims.experts_per_pe, dims.total_k_cols_2t,
dims.num_n_tiles_2t, dims.num_k_tiles_2t,
ns, nc);
if constexpr (Compute == 100) smem_mlp2t.tmem_base = tmem_base;
if constexpr (Compute == 100)
pb_pipe.producer_tail(s);
}
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits2T::WarpSize == 0)
smem_mlp2t.tmem_base = tmem_base;
constexpr int kFirstMlp12ConsumerWarp = (Compute == 100) ? 3 : 4;
if (warp_id >= kFirstMlp12ConsumerWarp)
mlp2_t_fused_consumer<Traits2T, Compute>(pb_pipe, s,
@@ -485,7 +522,7 @@ __device__ __forceinline__ void mlp_bwd_run_phase_1d(
int nc = (num_splits >= 0) ? num_splits : (int)gridDim.y;
auto s = mlp_bwd_resume_state<Mlp5MainloopPipelineFor<Traits5, Compute>>(
pd_count, warp_id == 0);
if (warp_id == 0)
if (warp_id == 0) {
mlp5_fused_producer<Traits5, Compute == 90>(pd_pipe, s,
smem_mlp5,
tma_load_du, tma_load_dv, tma_load_b_col, tma_load_c_col,
@@ -494,7 +531,12 @@ __device__ __forceinline__ void mlp_bwd_run_phase_1d(
dims.experts_per_pe, dims.total_k_cols_5,
dims.num_n_tiles_5, dims.num_k_tiles_5,
ns, nc);
if constexpr (Compute == 100) smem_mlp5.tmem_base = tmem_base;
if constexpr (Compute == 100)
pd_pipe.producer_tail(s);
}
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits5::WarpSize == 0)
smem_mlp5.tmem_base = tmem_base;
constexpr int kFirstMlp5ConsumerWarp = (Compute == 100) ? 3 : 4;
if (warp_id >= kFirstMlp5ConsumerWarp)
mlp5_fused_consumer<Traits5, Compute>(pd_pipe, s,
@@ -509,10 +551,11 @@ __device__ __forceinline__ void mlp_bwd_run_phase_1d(
// Phase 2 per-batch build-ranges scan
// ═══════════════════════════════════════════════════════════════════
//
// Warp 0 fills (k_start, k_end) per local expert for the current batch.
// CTA 0 warp 0 fills (k_start, k_end) per local expert for the current batch.
// Empty experts stay at (INT_MAX, 0); the chunk loop skips them via
// `k_end <= k_start`. Ends with a NamedBarrier::sync so the caller can
// proceed straight into the producer/consumer without extra plumbing.
// `k_end <= k_start`. The caller follows this with a grid-wide barrier before
// any CTA consumes the ranges. Restricting reset+scan to one warp avoids a
// race where a late CTA reset erased ranges another CTA had already updated.
//
// Called once per (batch, phase). mlp3 and mlp4 use different
// expert_for_k_block arrays and strides, so each phase scans its own.
@@ -528,15 +571,17 @@ __device__ __forceinline__ void mlp_bwd_phase_2_build_ranges(
int* k_starts,
int* k_ends,
const int* expert_for_k_block,
const int* valid_rows_for_tile,
int k_offset,
int num_k_in_batch,
int experts_per_pe,
int local_expert_start,
int efkb_stride,
int tile_k,
int warp_id,
int ring_kb = 0) {
constexpr int kMlpBwdBarrierThreads = kMlpBwdBarrierThreadsFor<Compute>;
if (warp_id == 0) {
if (blockIdx.x == 0 && blockIdx.y == 0 && warp_id == 0) {
int lane = threadIdx.x;
for (int e = lane; e < experts_per_pe; e += 32) {
k_starts[e] = INT_MAX;
@@ -546,7 +591,13 @@ __device__ __forceinline__ void mlp_bwd_phase_2_build_ranges(
for (int kb = lane; kb < num_k_in_batch; kb += 32) {
int kb_abs = k_offset + kb; // unwrapped
int kb_phys = (ring_kb > 0) ? (kb_abs % ring_kb) : kb_abs; // ring slot
int eg = expert_for_k_block[kb_phys / efkb_stride];
int tile = kb_phys / efkb_stride;
if (valid_rows_for_tile != nullptr) {
int row_in_tile = (kb_phys - tile * efkb_stride) * tile_k;
if (row_in_tile >= valid_rows_for_tile[tile])
continue;
}
int eg = expert_for_k_block[tile];
int el = eg - local_expert_start;
if (el >= 0 && el < experts_per_pe) {
atomicMin(&k_starts[el], kb_abs);
@@ -587,7 +638,9 @@ __device__ __forceinline__ void mlp_bwd_run_phase_2_mlp4(
int phase2_div, int phase2_mod,
const MlpBwdDims& dims,
uint32_t tmem_base,
int ring_kb = 0) {
int ring_kb = 0,
const cutlass::arch::ClusterBarrier* pair_init_barrier = nullptr,
uint32_t* pair_init_phase = nullptr) {
static_assert(Compute == 90 || Compute == 100,
"mlp_bwd_run_phase_2_mlp4: Compute must be 90 (Hopper 1SM) or "
"100 (Blackwell ClusterM=2 paired-CTA) — only Compute == 100 "
@@ -710,7 +763,9 @@ __device__ __forceinline__ void mlp_bwd_run_phase_2_mlp4(
dims.num_m_tiles_4, dims.num_n_tiles_4, outer_split_4,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split_4, ring_kb);
if constexpr (Compute == 100) smem_mlp4.tmem_base = tmem_base;
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits4::WarpSize == 0)
smem_mlp4.tmem_base = tmem_base;
constexpr int kFirstMlp4ConsumerWarp = (Compute == 100) ? 3 : 4;
if (warp_id >= kFirstMlp4ConsumerWarp)
mlp4_consumer<Traits4, Compute, Compute == 90>(
@@ -720,7 +775,8 @@ __device__ __forceinline__ void mlp_bwd_run_phase_2_mlp4(
dims.intermediate_dim, dims.hidden_dim, dims.total_m_rows_4,
dims.num_m_tiles_4, dims.num_n_tiles_4, outer_split_4,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split_4);
batch_kb_start, batch_kb_end, k_split_4,
pair_init_barrier, pair_init_phase);
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
p4_count = s.count();
@@ -753,7 +809,9 @@ __device__ __forceinline__ void mlp_bwd_run_phase_2_mlp3(
int phase2_div, int phase2_mod,
const MlpBwdDims& dims,
uint32_t tmem_base,
int ring_kb = 0) {
int ring_kb = 0,
const cutlass::arch::ClusterBarrier* pair_init_barrier = nullptr,
uint32_t* pair_init_phase = nullptr) {
static_assert(Compute == 90 || Compute == 100,
"mlp_bwd_run_phase_2_mlp3: Compute must be 90 (Hopper 1SM) or "
"100 (Blackwell ClusterM=2 paired-CTA) — only Compute == 100 "
@@ -866,7 +924,9 @@ __device__ __forceinline__ void mlp_bwd_run_phase_2_mlp3(
dims.num_m_tiles_3, dims.num_n_tiles_3, outer_split_3,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split_3, ring_kb);
if constexpr (Compute == 100) smem_mlp3.tmem_base = tmem_base;
if constexpr (Compute == 100)
if (warp_id == 3 && threadIdx.x % Traits3::WarpSize == 0)
smem_mlp3.tmem_base = tmem_base;
constexpr int kFirstMlp3ConsumerWarp = (Compute == 100) ? 3 : 4;
if (warp_id >= kFirstMlp3ConsumerWarp)
mlp3_consumer<Traits3, Compute, Compute == 90>(
@@ -876,7 +936,8 @@ __device__ __forceinline__ void mlp_bwd_run_phase_2_mlp3(
dims.hidden_dim, dims.intermediate_dim, dims.total_n_rows_3,
dims.num_m_tiles_3, dims.num_n_tiles_3, outer_split_3,
cell_start, cell_stride,
batch_kb_start, batch_kb_end, k_split_3);
batch_kb_start, batch_kb_end, k_split_3,
pair_init_barrier, pair_init_phase);
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
p3_count = s.count();
@@ -1065,16 +1126,15 @@ __device__ __forceinline__ void mlp_fused_bwd_run_batches(
int batch_kb_cnt = (bk_tiles * Traits1::TileM) / Traits4::TileK;
mlp_bwd_phase_2_build_ranges<Compute>(
bufs.expert_k_starts, bufs.expert_k_ends,
bufs.expert_for_k_block_mlp4,
bufs.expert_for_k_block_mlp4, bufs.valid_rows_mlp4,
batch_kb_off, batch_kb_cnt,
dims.experts_per_pe, dims.local_expert_start,
efkb_stride_4, warp_id);
efkb_stride_4, Traits4::TileK, warp_id);
}
// Cross-CTA barrier after the per-batch scan: k_starts/k_ends is shared
// by all CTAs (each runs build_ranges = reset + atomicMin/Max over the
// same window), so mlp4 must not read it until every CTA's scan is done,
// else producer/consumer tile-count desync → pipeline deadlock.
// Cross-CTA barrier after CTA 0 builds the shared ranges. MLP4 must not
// read them before the scan completes, or producer/consumer tile counts
// can diverge and deadlock the pipeline.
if (bk_tiles > 0)
global_barrier.wait();
@@ -1280,13 +1340,18 @@ __device__ __forceinline__ void mlp_fused_bwd(
if (warp_id == 3) {
tmem_alloc.allocate(kTmemColumns, &smem.tmem_base);
if constexpr (Compute == 100) {
if (cute::elect_one_sync())
smem.tmem_pair_barrier.init(
Traits1::WarpSize);
if (cute::elect_one_sync()) {
smem.tmem_pair_barrier.init(1);
smem.tmem_init_barrier.init(1);
smem.acc_pair_barrier.init(1);
}
cutlass::arch::fence_barrier_init();
}
__syncwarp();
}
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
mlp_bwd_pair_barrier_sync(smem.tmem_init_barrier, warp_id);
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
}
// Keep phase-role tests at their call sites. Hoisting producer/MMA/epilogue
@@ -1337,14 +1402,7 @@ __device__ __forceinline__ void mlp_fused_bwd(
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
if (warp_id == 3) {
tmem_alloc.release_allocation_lock();
if constexpr (Compute == 100) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
smem.tmem_pair_barrier.arrive(peer, !leader);
smem.tmem_pair_barrier.wait(0);
smem.tmem_pair_barrier.arrive(peer, leader);
}
mlp_bwd_pair_barrier_sync(smem.tmem_pair_barrier, warp_id);
tmem_alloc.free(smem.tmem_base, kTmemColumns);
}
}
@@ -1371,8 +1429,8 @@ __device__ __forceinline__ void mlp_fused_bwd(
template <typename Traits1, typename Traits2T, typename Traits3,
typename Traits4, typename Traits5,
int NSplit2, int SubBatch,
// SubTiles = CommTileM / GemmTileM ∈ {1,2}. >1 → Phase-1 (mlp1a/mlp2t/
// silu/mlp5) steps SubTiles GemmTileM-row sub-tiles per 128 comm slot;
// SubTiles = CommTileM / GemmTileM. >1 → Phase-1 (mlp1a/mlp2t/
// silu/mlp5) steps SubTiles GemmTileM-row sub-tiles per comm slot;
// Phase-2 sees num_m_tiles·SubTiles GemmTileM token-tiles with
// tile_expert_ids replicated SubTiles× (the K-block count is invariant).
// 1 → unchanged single-tile path.
@@ -1526,13 +1584,18 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
if (warp_id == 3) {
tmem_alloc.allocate(kTmemColumns, &smem.tmem_base);
if constexpr (Compute == 100) {
if (cute::elect_one_sync())
smem.tmem_pair_barrier.init(
Traits1::WarpSize);
if (cute::elect_one_sync()) {
smem.tmem_pair_barrier.init(1);
smem.tmem_init_barrier.init(1);
smem.acc_pair_barrier.init(1);
}
cutlass::arch::fence_barrier_init();
}
__syncwarp();
}
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
mlp_bwd_pair_barrier_sync(smem.tmem_init_barrier, warp_id);
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
}
// Counts persist across both passes — smem barriers continue advancing
@@ -1543,6 +1606,7 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
uint32_t pd_count = 0;
uint32_t p3_count = 0;
uint32_t p4_count = 0;
uint32_t acc_pair_phase = 0;
using Element = typename Traits1::Element;
@@ -1557,23 +1621,15 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
// Nothing to do if this PE has no tiles (remote_active is grid-uniform, so
// every CTA agrees and the early-out keeps the barriers below well-defined).
if (!remote_active) {
global_barrier.wait();
if constexpr (Compute == 100) {
constexpr int kTmemColumns =
MlpBwdTmemColumns<Traits1, Traits2T, Traits3, Traits4, Traits5>::value;
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
if (warp_id == 3) {
tmem_alloc.release_allocation_lock();
if constexpr (Compute == 100) {
uint32_t rank =
cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
smem.tmem_pair_barrier.arrive(
peer, !leader);
smem.tmem_pair_barrier.wait(0);
smem.tmem_pair_barrier.arrive(
peer, leader);
}
mlp_bwd_pair_barrier_sync(
smem.tmem_pair_barrier, warp_id);
tmem_alloc.free(smem.tmem_base, kTmemColumns);
}
}
@@ -1613,11 +1669,16 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
// (=Traits1::TileM) tiles: num_m_tiles (Phase-1 buffer height) and num_tokens
// (M extent) scale by SubTiles = CommTileM/GemmTileM. The comm loop control
// (eff_subbatch, group_start, bk_tiles clamp, slot releases) stays in
// 128-comm-slot units via remote_dims. At SubTiles=1 the two are identical.
// communication-slot units via remote_dims. At SubTiles=1 the two are identical.
// (Other dims fields — N/K extents, expert counts — are M-axis-independent.)
MlpBwdDims gemm_dims = remote_dims;
gemm_dims.num_m_tiles *= SubTiles;
gemm_dims.num_tokens *= SubTiles;
int first_sub = 0;
int last_sub = SubTiles;
int gemm_split = split;
int gemm_splits = num_splits;
constexpr int kM64PerGemmTile = Traits1::TileM / 64;
for (int g0 = 0; g0 < remote_batches; g0 += eff_subbatch) {
const int gcount = min(eff_subbatch, remote_batches - g0);
@@ -1631,59 +1692,68 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
// ── Phase 1: gcount sub-batches (mlp1a / mlp2t / silu_bwd / mlp5) ──
for (int s = 0; s < gcount; ++s) {
int saved_m = -1, saved_expert = -1;
int saved_valid_m64_subtiles = 0;
bool has_tile = false;
bool compute_tile = false;
// Gated by gemm_active — gap CTAs (flat_id ≥ n_gemm) skip Phase 1 and
// the per-column x_barrier, but still hit every global barrier below.
if (gemm_active && iter.has_next()) {
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
iter.acquire_src();
iter.acquire_src();
cutlass::arch::NamedBarrier::sync(
kMlpBwdBarrierThreads, kMlpBarrierId);
auto tile = iter.next();
int expert = tile.expert - remote_dims.local_expert_start;
int m = tile.y_m;
saved_m = m;
saved_expert = expert;
saved_valid_m64_subtiles = tile.valid_m64_subtiles;
has_tile = true;
compute_tile =
first_sub * kM64PerGemmTile <
saved_valid_m64_subtiles;
// One 128-row comm slot feeds SubTiles GemmTileM-row sub-tiles.
// One CommTileM-row slot feeds SubTiles GemmTileM-row sub-tiles.
// gemm coordinate of sub-tile `sub` = m·SubTiles + sub (the
// Phase-1 kernels multiply by Traits1::TileM=GemmTileM → rows
// m·128 + sub·64). gemm_dims carries the SubTiles-scaled
// m·CommTileM + sub·GemmTileM). gemm_dims carries the SubTiles-scaled
// num_m_tiles / num_tokens so the buffer tensor shapes match.
// Acquire/release of the comm slot stays once per 128 tile.
for (int sub = 0; sub < SubTiles; ++sub) {
mlp_bwd_run_phase_1a<Traits1, Compute>(
pa_pipe, pa_count, smem.mlp1,
tma_load_x_remote, tma_load_b_fwd, tma_load_c_fwd,
tma_store_du, tma_store_dv, tma_store_z,
warp_id, m * SubTiles + sub, expert, gemm_dims, smem.tmem_base, split, num_splits);
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
// Acquire/release stays once per communication tile.
if (compute_tile) {
for (int sub = first_sub; sub < last_sub; ++sub) {
mlp_bwd_run_phase_1a<Traits1, Compute>(
pa_pipe, pa_count, smem.mlp1,
tma_load_x_remote, tma_load_b_fwd, tma_load_c_fwd,
tma_store_du, tma_store_dv, tma_store_z,
warp_id, m * SubTiles + sub, expert, gemm_dims,
smem.tmem_base, gemm_split, gemm_splits);
}
}
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
x_barrier.wait();
iter.acquire_dy();
for (int sub = 0; sub < SubTiles; ++sub) {
mlp_bwd_run_phase_1b<Traits2T, Compute>(
pb_pipe, pb_count, smem.mlp2t,
tma_load_dy_remote, tma_load_a_col, tma_store_dz,
warp_id, m * SubTiles + sub, expert, gemm_dims, smem.tmem_base, split, num_splits);
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
if (compute_tile) {
for (int sub = first_sub; sub < last_sub; ++sub) {
mlp_bwd_run_phase_1b<Traits2T, Compute>(
pb_pipe, pb_count, smem.mlp2t,
tma_load_dy_remote, tma_load_a_col, tma_store_dz,
warp_id, m * SubTiles + sub, expert, gemm_dims,
smem.tmem_base, gemm_split, gemm_splits);
}
}
x_barrier.wait();
for (int sub = 0; sub < SubTiles; ++sub) {
silu_bwd_pair_tile<Element>(
remote_bufs.dz_buf, remote_bufs.du_buf, remote_bufs.dv_buf,
remote_bufs.du_buf, remote_bufs.dv_buf,
m * SubTiles + sub, Traits1::TileM, Traits2T::TileN,
remote_dims.intermediate_dim, split, num_splits);
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
if (compute_tile) {
for (int sub = first_sub; sub < last_sub; ++sub) {
silu_bwd_pair_tile<Element>(
remote_bufs.dz_buf, remote_bufs.du_buf, remote_bufs.dv_buf,
remote_bufs.du_buf, remote_bufs.dv_buf,
m * SubTiles + sub, Traits1::TileM, Traits2T::TileN,
remote_dims.intermediate_dim, gemm_split, gemm_splits);
}
}
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
}
@@ -1701,15 +1771,15 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
// so it is emitted and its dst slot released immediately).
if (has_tile) {
iter.acquire_dst();
for (int sub = 0; sub < SubTiles; ++sub) {
mlp_bwd_run_phase_1d<Traits5, Compute>(
pd_pipe, pd_count, smem.mlp5,
tma_load_du, tma_load_dv, tma_load_b_col, tma_load_c_col,
tma_store_dx_remote,
warp_id, saved_m * SubTiles + sub, saved_expert, gemm_dims,
smem.tmem_base, split, num_splits);
if (sub + 1 < SubTiles)
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
if (compute_tile) {
for (int sub = first_sub; sub < last_sub; ++sub) {
mlp_bwd_run_phase_1d<Traits5, Compute>(
pd_pipe, pd_count, smem.mlp5,
tma_load_du, tma_load_dv, tma_load_b_col, tma_load_c_col,
tma_store_dx_remote,
warp_id, saved_m * SubTiles + sub, saved_expert, gemm_dims,
smem.tmem_base, gemm_split, gemm_splits);
}
}
__threadfence(); // dX flush for the NIC put (release_dst signals)
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
@@ -1725,17 +1795,19 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
// and the producers wrap the physical slot by % ring_kb internally
// (ring_kb > 0 enables it). The group's gcount·grid_x live slots are
// guaranteed distinct (host check: ring > SubBatch·grid_x).
// group_start / bk_tiles_comm are in 128-comm-slot units (the iterator's
// tile granularity). Phase-2 works in GemmTileM tiles, so scale by
// SubTiles: the K-window ratio (× Traits1::TileM/TileK) then yields the
// same K-block count as the old CommTileM×comm-slot product. ring_kb uses
// gemm_dims.num_m_tiles (already ×SubTiles). SubTiles=1 → unchanged.
// group_start / bk_tiles_comm are in communication-slot units. Phase 2
// works in GemmTileM units, so scale the contiguous parent window by
// SubTiles; range construction skips padded K-blocks inside it.
int group_start = g0 * grid_x;
int bk_tiles_comm = min(gcount * grid_x,
remote_dims.total_m_tiles_in_pass - group_start);
int bk_start = group_start * SubTiles;
int bk_tiles_comm = min(
gcount * grid_x,
remote_dims.total_m_tiles_in_pass - group_start);
int bk_start = group_start * SubTiles;
int bk_tiles = bk_tiles_comm * SubTiles;
int ring_kb = (gemm_dims.num_m_tiles * Traits1::TileM) / Traits4::TileK;
const cutlass::arch::ClusterBarrier* acc_pair_barrier = nullptr;
if constexpr (Compute == 100)
acc_pair_barrier = &smem.acc_pair_barrier;
// Per-group per-expert K-range scan over the group's window. Reads the
// LIVE X-pipe expert ids — none of the group's slots have been released
@@ -1746,11 +1818,12 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
mlp_bwd_phase_2_build_ranges<Compute>(
remote_bufs.expert_k_starts, remote_bufs.expert_k_ends,
remote_bufs.expert_for_k_block_mlp4,
remote_bufs.valid_rows_mlp4,
batch_kb_off, batch_kb_cnt,
remote_dims.experts_per_pe, remote_dims.local_expert_start,
efkb_stride_4_remote, warp_id, ring_kb);
// Cross-CTA barrier: k_starts/k_ends is shared by all CTAs (each
// resets + atomicMin/Max), so no producer may read it mid-reset.
efkb_stride_4_remote, Traits4::TileK, warp_id, ring_kb);
// Cross-CTA barrier: CTA 0 owns reset+scan, so no producer may read
// the shared ranges until that work completes.
global_barrier.wait();
}
@@ -1763,7 +1836,8 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
tma_reduce_db, tma_reduce_dc,
warp_id, bk_start, bk_tiles,
phase2_div, phase2_mod,
gemm_dims, smem.tmem_base, ring_kb);
gemm_dims, smem.tmem_base, ring_kb,
acc_pair_barrier, &acc_pair_phase);
}
global_barrier.wait();
@@ -1782,7 +1856,8 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
tma_load_dyt3_remote, tma_load_zt3, tma_reduce_da,
warp_id, bk_start, bk_tiles,
phase2_div, phase2_mod,
gemm_dims, smem.tmem_base, ring_kb);
gemm_dims, smem.tmem_base, ring_kb,
acc_pair_barrier, &acc_pair_phase);
}
global_barrier.wait();
@@ -1800,14 +1875,7 @@ __device__ __forceinline__ void mlp_fused_bwd_dual(
cutlass::arch::NamedBarrier::sync(kMlpBwdBarrierThreads, kMlpBarrierId);
if (warp_id == 3) {
tmem_alloc.release_allocation_lock();
if constexpr (Compute == 100) {
uint32_t rank = cute::block_rank_in_cluster();
uint32_t peer = rank ^ 1;
bool leader = (rank % 2) == 0;
smem.tmem_pair_barrier.arrive(peer, !leader);
smem.tmem_pair_barrier.wait(0);
smem.tmem_pair_barrier.arrive(peer, leader);
}
mlp_bwd_pair_barrier_sync(smem.tmem_pair_barrier, warp_id);
tmem_alloc.free(smem.tmem_base, kTmemColumns);
}
}
@@ -218,22 +218,25 @@ struct CommSmem {
// mlp_global_barrier requires every CTA to make the same enter/skip
// decision, so per-CTA per_cta_tiles can't be the gate.
int global_total;
int runtime_nsplit;
int runtime_nsplit; // N-split CTAs per GEMM M-row
int runtime_n_gemm;
int runtime_grid_x;
// Pre-fetched remote expert offsets, assigned to dynamic smem at runtime.
// Layout: [num_pes][experts_per_pe + 1]
int* remote_offsets;
// Exact routed-row counts matching remote_offsets.
// Layout: [num_pes][experts_per_pe]
int* remote_counts;
};
__device__ __forceinline__ int select_runtime_nsplit_from_tiles(
int total_tiles, int num_n_tiles_1, int num_n_tiles_2,
int num_k_tiles_1, int num_k_tiles_2,
int num_blocks, int static_nsplit) {
if (total_tiles <= 0) return 2;
constexpr int candidates[5] = {2, 4, 6, 8, 16};
int best_ns = static_nsplit;
int num_blocks, int static_nsplit, int m_subtiles = 1) {
if (total_tiles <= 0) return 2 * m_subtiles;
constexpr int base_candidates[5] = {2, 4, 6, 8, 16};
int best_base_ns = static_nsplit;
long long best_cost = -1;
long long best_waste = -1;
int best_n_gemm = -1;
@@ -241,23 +244,23 @@ __device__ __forceinline__ int select_runtime_nsplit_from_tiles(
long long phase2_weight = (long long)num_k_tiles_2;
#pragma unroll
for (int i = 0; i < 5; ++i) {
int ns = candidates[i];
if (ns > num_blocks) continue;
int n_gemm = (num_blocks / ns) * ns;
int ms = n_gemm / ns;
int base_ns = base_candidates[i];
if (base_ns * m_subtiles > num_blocks) continue;
int n_gemm = (num_blocks / base_ns) * base_ns;
int ms = n_gemm / base_ns;
if (ms <= 0) continue;
int m_waves = (total_tiles + ms - 1) / ms;
int n1_waves = (num_n_tiles_1 + ns - 1) / ns;
int n2_waves = (num_n_tiles_2 + ns - 1) / ns;
int n1_waves = (num_n_tiles_1 + base_ns - 1) / base_ns;
int n2_waves = (num_n_tiles_2 + base_ns - 1) / base_ns;
long long phase_cost = phase1_weight * n1_waves
+ phase2_weight * n2_waves;
long long cost = (long long)m_waves * phase_cost;
long long phase1_waste =
(long long)m_waves * ms * n1_waves * ns
(long long)m_waves * ms * n1_waves * base_ns
- (long long)total_tiles * num_n_tiles_1;
long long phase2_waste =
(long long)m_waves * ms * n2_waves * ns
(long long)m_waves * ms * n2_waves * base_ns
- (long long)total_tiles * num_n_tiles_2;
long long waste = phase1_weight * phase1_waste
+ phase2_weight * phase2_waste;
@@ -268,10 +271,10 @@ __device__ __forceinline__ int select_runtime_nsplit_from_tiles(
best_cost = cost;
best_waste = waste;
best_n_gemm = n_gemm;
best_ns = ns;
best_base_ns = base_ns;
}
}
return best_ns;
return best_base_ns * m_subtiles;
}
// ═══════════════════════════════════════════════════════════════════
@@ -325,6 +328,7 @@ struct CommBuffers {
int* dst_consumed; // nvshmem → consumer: put completed, slot free
const int* expert_offsets; // [E + 1] local (from radix sort, TileM-aligned, symmetric)
const int* expert_counts; // [E] exact routed rows per expert
const int* sorted_token_ids; // [total_slots] local sorted token IDs
void* local_tokens; // [T, hidden_dim] local input (symmetric)
@@ -337,6 +341,8 @@ struct CommBuffers {
// All PEs' expert offsets, gathered into local symmetric memory.
// Layout: [num_pes][num_experts + 1] — symmetric.
int* all_expert_offsets;
// All PEs' exact expert counts. Layout: [num_pes][num_experts].
int* all_expert_counts;
// Cross-PE synchronization for offset broadcast/consume.
PeSync pe_sync;
@@ -366,6 +372,9 @@ struct TileInfo {
int pe; // remote PE
int token_offset; // offset into remote PE's token buffer (in tokens)
int expert; // local expert index (for weight selection)
int valid_rows; // valid prefix rows in this communication tile
int m_subtile; // GemmTileM row within this communication tile
int parent_tile; // flat communication-tile index
};
// ═══════════════════════════════════════════════════════════════════
@@ -381,6 +390,8 @@ struct TileIterator {
const int* remote_offsets; // smem: [num_pes][experts_per_pe + 1]
int offsets_stride; // experts_per_pe + 1
const int* remote_counts; // smem: [num_pes][experts_per_pe] (nullable)
int counts_stride; // experts_per_pe
int experts_per_pe;
int num_pes;
int my_pe;
@@ -393,6 +404,7 @@ struct TileIterator {
int tile; // tile within current (expert, pe) pair
int remote_tiles; // total tiles for current (expert, pe) pair
int remote_start; // start offset for current (expert, pe)
int remote_count; // exact valid rows for current (expert, pe)
int total_tiles; // this iterator's tile count
@@ -443,6 +455,9 @@ struct TileIterator {
tile = skip;
remote_start = rs;
remote_tiles = ntiles;
remote_count = remote_counts != nullptr
? remote_counts[pe * counts_stride + e]
: ntiles * TileM;
return;
}
skip -= ntiles;
@@ -462,6 +477,9 @@ struct TileIterator {
info.pe = pe;
info.token_offset = remote_start + tile * TileM;
info.expert = le;
info.valid_rows = max(0, min(TileM, remote_count - tile * TileM));
info.m_subtile = 0;
info.parent_tile = -1;
// Advance by stride in the flat tile space.
// Carry the remainder across (expert, pe) boundaries.
@@ -478,6 +496,140 @@ struct TileIterator {
remote_start = remote_offsets[next_pe * offsets_stride + le];
int remote_end = remote_offsets[next_pe * offsets_stride + le + 1];
remote_tiles = (remote_end - remote_start) / TileM;
remote_count = remote_counts != nullptr
? remote_counts[next_pe * counts_stride + le]
: remote_tiles * TileM;
tile = remaining;
}
return info;
}
};
template <int TileM_, int MSubTiles_>
struct GemmTileIterator {
static constexpr int TileM = TileM_;
static constexpr int MSubTiles = MSubTiles_;
static constexpr int GemmTileM = TileM / MSubTiles;
const int* remote_offsets;
int offsets_stride;
const int* remote_counts;
int counts_stride;
int experts_per_pe;
int num_pes;
int my_pe;
int stride;
int le;
int pe_idx;
int tile;
int remote_tiles;
int remote_parent_tiles;
int remote_start;
int remote_count;
int parent_prefix;
int total_tiles;
__device__ void init(int start, int str) {
stride = str;
le = 0;
pe_idx = 0;
total_tiles = 0;
int lane = threadIdx.x & 31;
int local_total = 0;
int n_experts = experts_per_pe * num_pes;
for (int idx = lane; idx < n_experts; idx += 32) {
int e = idx / num_pes;
int p = idx - e * num_pes;
int pe = liger::g_dest_table[
(liger::comm_slot_of(my_pe) + p) % num_pes];
int count = remote_counts[pe * counts_stride + e];
local_total += (count + GemmTileM - 1) / GemmTileM;
}
#pragma unroll
for (int delta = 16; delta > 0; delta >>= 1)
local_total += __shfl_down_sync(0xffffffff, local_total, delta);
int global_total = __shfl_sync(0xffffffff, local_total, 0);
if (start < global_total)
total_tiles = (global_total - 1 - start) / stride + 1;
int skip = start;
parent_prefix = 0;
for (int e = 0; e < experts_per_pe; ++e) {
for (int p = 0; p < num_pes; ++p) {
int pe = liger::g_dest_table[
(liger::comm_slot_of(my_pe) + p) % num_pes];
int rs = remote_offsets[pe * offsets_stride + e];
int re = remote_offsets[pe * offsets_stride + e + 1];
int count = remote_counts[pe * counts_stride + e];
int ntiles = (count + GemmTileM - 1) / GemmTileM;
int nparents = (re - rs) / TileM;
if (skip < ntiles) {
le = e;
pe_idx = p;
tile = skip;
remote_tiles = ntiles;
remote_parent_tiles = nparents;
remote_start = rs;
remote_count = count;
return;
}
skip -= ntiles;
parent_prefix += nparents;
}
}
le = experts_per_pe;
}
__device__ bool has_next() const {
return le < experts_per_pe;
}
__device__ int current_parent_tile() const {
return parent_prefix + tile / MSubTiles;
}
__device__ int current_m_subtile() const {
return tile % MSubTiles;
}
__device__ TileInfo next() {
int pe = liger::g_dest_table[
(liger::comm_slot_of(my_pe) + pe_idx) % num_pes];
int parent_in_expert = tile / MSubTiles;
TileInfo info;
info.pe = pe;
info.token_offset = remote_start + parent_in_expert * TileM;
info.expert = le;
info.valid_rows = max(
0, min(TileM, remote_count - parent_in_expert * TileM));
info.m_subtile = tile % MSubTiles;
info.parent_tile = parent_prefix + parent_in_expert;
tile += stride;
while (tile >= remote_tiles && le < experts_per_pe) {
int remaining = tile - remote_tiles;
parent_prefix += remote_parent_tiles;
pe_idx++;
if (pe_idx >= num_pes) {
pe_idx = 0;
le++;
}
if (le >= experts_per_pe)
break;
int next_pe = liger::g_dest_table[
(liger::comm_slot_of(my_pe) + pe_idx) % num_pes];
remote_start =
remote_offsets[next_pe * offsets_stride + le];
int remote_end =
remote_offsets[next_pe * offsets_stride + le + 1];
remote_count =
remote_counts[next_pe * counts_stride + le];
remote_tiles =
(remote_count + GemmTileM - 1) / GemmTileM;
remote_parent_tiles =
(remote_end - remote_start) / TileM;
tile = remaining;
}
return info;
@@ -623,9 +775,9 @@ struct GetBounce {
static constexpr int kTotalBytes = kPerWarpStride * kNumGetWarpsFwd;
};
template <typename Element, int TileM, int K, int NC>
template <typename Element, int TileM, int K, int NC, int MSubTiles>
__device__ __forceinline__ void do_get(
StagePipe<K, kNumGetWarpsFwd * NC, 1>& src_pipe,
StagePipe<K, kNumGetWarpsFwd * (NC / MSubTiles), 1>& src_pipe,
const CommBuffers& bufs,
const TileInfo& info,
Element* src_staging, // base of flat staging buffer
@@ -633,6 +785,9 @@ __device__ __forceinline__ void do_get(
int xc, // start slot in flat list
int MC, // stride between consecutive comm stages
int chunk_idx, // 0..kNumGetWarpsPerCta * NC - 1
int m_subtile,
int row_chunk_idx,
bool row_empty,
int& ib_seq, // IB-tile counter (round-robin turn; advanced here)
int lane,
const GetTmaDescs* descs, // per-peer src + local dst TMA descriptors (nullptr → getmem)
@@ -648,6 +803,10 @@ __device__ __forceinline__ void do_get(
// all dispatch writes on all PEs are complete.
int slot = xc + src_pipe.producer_stage() * MC;
if (row_empty) {
src_pipe.producer_release(lane);
return;
}
// Locality of this tile's source PE (same-host NVLink vs cross-host IB).
// Pure arithmetic; gates the TMA get path below. The MLP's release_dst
@@ -734,10 +893,18 @@ __device__ __forceinline__ void do_get(
int global_pe = nvshmem_team_translate_pe(bufs.team(), info.pe, NVSHMEM_TEAM_WORLD);
bool is_ib = descs != nullptr && !is_local;
if (is_ib) {
int turn = ib_seq % kWarpsPerTile;
if (chunk_idx == turn) {
nvshmemx_getmem_warp(local_base, remote_base,
(size_t)src_tile_elems * sizeof(Element), global_pe);
constexpr int kRowNC = NC / MSubTiles;
constexpr int kRowsPerSubtile = TileM / MSubTiles;
int turn = ib_seq % kRowNC;
if (row_chunk_idx == turn) {
int row_start = m_subtile * kRowsPerSubtile;
int valid_rows = max(
0, min(kRowsPerSubtile, info.valid_rows - row_start));
int row_offset = row_start * bufs.hidden_dim;
nvshmemx_getmem_warp(
local_base + row_offset, remote_base + row_offset,
(size_t)valid_rows * bufs.hidden_dim * sizeof(Element),
global_pe);
}
ib_seq++;
} else {
@@ -750,9 +917,9 @@ __device__ __forceinline__ void do_get(
src_pipe.producer_release(lane);
}
template <typename Element, int TileM, int K, int NC>
template <typename Element, int TileM, int K, int NC, int MSubTiles>
__device__ __forceinline__ void do_put(
StagePipe<K, 1, kNumPutWarpsFwd * NC>& dst_pipe,
StagePipe<K, 1, kNumPutWarpsFwd * (NC / MSubTiles)>& dst_pipe,
const CommBuffers& bufs,
const TileInfo& info,
Element* dst_staging,
@@ -760,6 +927,9 @@ __device__ __forceinline__ void do_put(
int xc, // start slot in flat list
int MC, // stride between consecutive comm stages
int yc, // 0..NC-1 — CTA's chunk index within the tile
int m_subtile,
int row_chunk_idx,
bool row_empty,
int& ib_seq, // IB-tile counter (round-robin turn; advanced here)
int lane,
int put_local_idx, // 0..kNumPutWarpsFwd-1 — put warp within the CTA
@@ -773,6 +943,10 @@ __device__ __forceinline__ void do_put(
int my_bytes = chunk * sizeof(Element);
dst_pipe.consumer_acquire();
if (row_empty) {
dst_pipe.consumer_release(lane);
return;
}
// Direct-store: for same-host (NVLink) tiles the GEMM has already TMA-stored
// Y straight into the peer's symmetric local_output, so this put warp must
@@ -790,11 +964,20 @@ __device__ __forceinline__ void do_put(
int global_pe = nvshmem_team_translate_pe(bufs.team(), info.pe, NVSHMEM_TEAM_WORLD);
bool is_ib = descs != nullptr;
if (is_ib) {
int turn = ib_seq % kWarpsPerTile;
int warp_idx = yc * kNumPutWarpsFwd + put_local_idx;
if (warp_idx == turn) {
nvshmemx_putmem_warp(remote_base, local_base,
(size_t)dst_tile_elems * sizeof(Element), global_pe);
constexpr int kRowNC = NC / MSubTiles;
constexpr int kRowsPerSubtile = TileM / MSubTiles;
int turn = ib_seq % (kNumPutWarpsFwd * kRowNC);
int row_warp_idx =
row_chunk_idx * kNumPutWarpsFwd + put_local_idx;
if (row_warp_idx == turn) {
int row_start = m_subtile * kRowsPerSubtile;
int valid_rows = max(
0, min(kRowsPerSubtile, info.valid_rows - row_start));
int row_offset = row_start * bufs.hidden_dim;
nvshmemx_putmem_warp(
remote_base + row_offset, local_base + row_offset,
(size_t)valid_rows * bufs.hidden_dim * sizeof(Element),
global_pe);
}
ib_seq++;
} else {
@@ -852,6 +1035,10 @@ __device__ __forceinline__ void broadcast_expert_offsets(
int* local_dst = bufs.all_expert_offsets + my_pe * offsets_stride;
for (int i = 0; i <= num_experts; ++i)
local_dst[i] = my_offsets[i];
int* local_counts_dst =
bufs.all_expert_counts + my_pe * num_experts;
for (int i = 0; i < num_experts; ++i)
local_counts_dst[i] = bufs.expert_counts[i];
}
// CTA i puts offsets to PE i (if valid remote PE).
@@ -866,6 +1053,12 @@ __device__ __forceinline__ void broadcast_expert_offsets(
remote_dst, my_offsets,
offsets_stride,
global_target);
int* remote_counts_dst =
bufs.all_expert_counts + my_pe * num_experts;
nvshmemx_int_put_nbi_block(
remote_counts_dst, bufs.expert_counts,
num_experts,
global_target);
}
// ═══════════════════════════════════════════════════════════════════
@@ -926,6 +1119,10 @@ __device__ __forceinline__ void nvshmem_comm_prologue(
for (int i = tid; i <= experts_per_pe; i += (kCommWarpsPerCta * 32))
smem.remote_offsets[pe * dst_stride + i] =
bufs.all_expert_offsets[pe * src_stride + local_e_start + i];
for (int i = tid; i < experts_per_pe; i += (kCommWarpsPerCta * 32))
smem.remote_counts[pe * experts_per_pe + i] =
bufs.all_expert_counts[
pe * bufs.num_experts + local_e_start + i];
}
}
__syncwarp();
@@ -952,6 +1149,8 @@ __device__ __forceinline__ void nvshmem_comm_prologue(
TileIterator<TileM> iter;
iter.remote_offsets = smem.remote_offsets;
iter.offsets_stride = dst_stride;
iter.remote_counts = smem.remote_counts;
iter.counts_stride = experts_per_pe;
iter.experts_per_pe = experts_per_pe;
iter.num_pes = num_pes;
iter.my_pe = my_pe;
@@ -1011,7 +1210,7 @@ __device__ __forceinline__ void nvshmem_comm_prologue(
// getter blocks in producer_acquire once its NumStages-slot subset is
// pending MLP consumption, and the putter blocks in consumer_acquire
// until MLP releases a dst slot.
template <typename Element, int TileM, int NumStages, int NC>
template <typename Element, int TileM, int NumStages, int NC, int MSubTiles = 1>
__device__ __forceinline__ void nvshmem_comm_main(
CommSmem& smem,
const CommBuffers& bufs,
@@ -1039,6 +1238,11 @@ __device__ __forceinline__ void nvshmem_comm_main(
int xc = cta_id / NC;
int yc = cta_id % NC;
int MC = n_comm / NC;
static_assert(NC % MSubTiles == 0,
"communication CTAs must divide evenly across GEMM M-subtiles");
constexpr int kRowNC = NC / MSubTiles;
int m_subtile = yc / kRowNC;
int row_yc = yc % kRowNC;
if (cta_id >= n_comm) return;
// Per-warp leader: each comm warp must independently spin in
@@ -1055,6 +1259,8 @@ __device__ __forceinline__ void nvshmem_comm_main(
TileIterator<TileM> iter;
iter.remote_offsets = smem.remote_offsets;
iter.offsets_stride = bufs.experts_per_pe + 1;
iter.remote_counts = smem.remote_counts;
iter.counts_stride = bufs.experts_per_pe;
iter.experts_per_pe = bufs.experts_per_pe;
iter.num_pes = bufs.num_pes();
iter.my_pe = bufs.my_pe();
@@ -1075,16 +1281,29 @@ __device__ __forceinline__ void nvshmem_comm_main(
// NumProducers = N_SPLIT (GEMM CTAs produce Y), NumConsumers =
// kNumPutWarpsFwd·NC.
const int put_local_idx = 0;
StagePipe<K, 1, kNumPutWarpsFwd * NC> dst_pipe;
dst_pipe.init(bufs.dst_ready + xc, bufs.dst_consumed + xc, is_leader, MC,
runtime_nsplit, kNumPutWarpsFwd * NC);
StagePipe<K, 1, kNumPutWarpsFwd * kRowNC> dst_pipe;
dst_pipe.init(
bufs.dst_ready + xc * MSubTiles + m_subtile,
bufs.dst_consumed + xc * MSubTiles + m_subtile,
is_leader, MC * MSubTiles,
runtime_nsplit, kNumPutWarpsFwd * kRowNC);
int ib_seq = 0; // advances only on IB tiles (inside do_put)
for (int i = 0; i < my_total; ++i) {
TileInfo info = iter.next();
do_put<Element, TileM, K, NC>(
constexpr int kRowsPerSubtile = TileM / MSubTiles;
bool row_empty =
info.valid_rows <= m_subtile * kRowsPerSubtile;
if (row_empty && row_yc == 0 && lane == 0) {
int s = dst_pipe.consumer_stage();
atomicAdd(
&dst_pipe.ready[s * dst_pipe.stride],
runtime_nsplit);
}
do_put<Element, TileM, K, NC, MSubTiles>(
dst_pipe, bufs, info,
dst_staging_base, tile_elems, xc, MC, yc, ib_seq, lane,
dst_staging_base, tile_elems, xc, MC, yc,
m_subtile, row_yc, row_empty, ib_seq, lane,
put_local_idx, get_descs);
}
} else if (warp_id == kCommGetWarp) { // single TMA get warp
@@ -1092,18 +1311,31 @@ __device__ __forceinline__ void nvshmem_comm_main(
// NumProducers = kNumGetWarpsFwd·NC (= NC: one get warp × NC CTAs),
// NumConsumers = N_SPLIT (all GEMM CTAs consume cooperatively).
StagePipe<K, kNumGetWarpsFwd * NC, 1> src_pipe;
src_pipe.init(bufs.src_ready + xc, bufs.src_consumed + xc, is_leader, MC,
kNumGetWarpsFwd * NC, runtime_nsplit);
StagePipe<K, kNumGetWarpsFwd * kRowNC, 1> src_pipe;
src_pipe.init(
bufs.src_ready + xc * MSubTiles + m_subtile,
bufs.src_consumed + xc * MSubTiles + m_subtile,
is_leader, MC * MSubTiles,
kNumGetWarpsFwd * kRowNC, runtime_nsplit);
char* bounce_warp = get_bounce; // single warp → slice 0
int ib_seq = 0; // advances only on IB tiles (inside do_get)
for (int i = 0; i < my_total; ++i) {
TileInfo info = iter.next();
do_get<Element, TileM, K, NC>(
constexpr int kRowsPerSubtile = TileM / MSubTiles;
bool row_empty =
info.valid_rows <= m_subtile * kRowsPerSubtile;
int s = src_pipe.producer_stage();
do_get<Element, TileM, K, NC, MSubTiles>(
src_pipe, bufs, info,
src_staging_base, tile_elems, xc, MC, chunk_idx, ib_seq, lane,
src_staging_base, tile_elems, xc, MC, chunk_idx,
m_subtile, row_yc, row_empty, ib_seq, lane,
get_descs, bounce_warp);
if (row_empty && row_yc == 0 && lane == 0) {
atomicAdd(
&src_pipe.consumed[s * src_pipe.stride],
runtime_nsplit);
}
}
}
}
@@ -86,24 +86,23 @@ __host__ __device__ __forceinline__ bool get_pe_is_local_bwd(
return (pe / descs->gpus_per_node) == (descs->my_pe / descs->gpus_per_node);
}
// Box height (rows) of a single bwd TMA transfer. The bwd smem union sits
// near the 228 KiB cap (mlp1_act ≈ 216 KiB), so unlike the fwd's 32 KiB
// [64×256] box, the bwd uses a small [kGetBoxRowsBwd × kGetKChunk] box and
// the get warp loops over row-bands. kGetBoxRowsBwd must divide the warp's
// row band (TileM / NC). 16 divides 64/32/16 for NC ∈ {2,4,8} at TileM=128.
// Box = 16·256·2 = 8 KiB, which fits the ~12 KiB headroom of the default
// config (216 KiB union); tighter tuned configs fall back to getmem.
static constexpr int kGetBoxRowsBwd = 16;
// Box height (rows) of a single backward TMA transfer. SM100 mirrors
// forward's full [32×256] row-band box; SM90 uses a smaller 8-row box.
static constexpr int kGetBoxRowsBwdSm90 = 8;
static constexpr int kGetBoxRowsBwdSm100 = 32;
// Smem bounce: one [kGetBoxRowsBwd × kGetKChunk] box + its mbarrier, both
// 128-aligned. Single get warp → one region.
template <typename Element>
// X and dY reuse one data box sequentially but keep distinct mbarriers.
// Reinitializing one mbarrier across the two TMA streams races the async proxy;
// the box itself is safe to reuse after cp.async.bulk.wait_group<0>.
template <typename Element, int BoxRows>
struct GetBounceBwd {
static constexpr int kBoxRows = kGetBoxRowsBwd;
static constexpr int kBoxRows = BoxRows;
static constexpr int kBoxElems = kBoxRows * kGetKChunk;
static constexpr int kBoxBytes = kBoxElems * (int)sizeof(Element);
static constexpr int kPerWarpStride = ((kBoxBytes + 8) + 127) & ~127;
static constexpr int kTotalBytes = kPerWarpStride;
static constexpr int kMbarOffset = kBoxBytes;
static constexpr int kMbarStride = sizeof(uint64_t);
static constexpr int kTotalBytes =
(kBoxBytes + 2 * kMbarStride + 127) & ~127;
};
// do_get_bwd_tma is defined below, after CommBuffersBwd (it needs the
@@ -150,6 +149,7 @@ struct CommBuffersBwd {
// can't poison mlp3, because mlp3 reads the dY-pipe array.
int* tile_expert_ids_x;
int* tile_expert_ids_dy;
int* tile_valid_rows_x;
// Remote data pointers (symmetric memory)
void* remote_x; // get source: X on remote PE
@@ -158,6 +158,7 @@ struct CommBuffersBwd {
// Reused from forward
int* all_expert_offsets;
int* all_expert_counts;
int all_expert_offsets_stride;
int my_pe;
@@ -191,7 +192,7 @@ struct CommBuffersBwd {
// band in kGetBoxRowsBwd-tall sub-bands × kGetKChunk-wide column boxes.
// chunk_idx == yc (the CTA's slot within its NC-cooperating group); with
// kNumGetWarpsBwd == 1 the per-warp row band is TileM/NC.
template <typename Element, int TileM, int K, int NC>
template <typename Element, int TileM, int K, int NC, int BoxRows>
__device__ __forceinline__ void do_get_bwd_tma(
StagePipe<K, kNumGetWarpsBwd * NC, 1>& src_pipe,
const CommBuffersBwd& bufs,
@@ -204,14 +205,16 @@ __device__ __forceinline__ void do_get_bwd_tma(
int chunk_idx, // = yc (0..NC-1)
int& ib_seq, // advanced once per actual IB get call
int lane,
int mbar_index,
int* tile_expert_ids_dst,
int* tile_valid_rows_dst,
const GetTmaDescsBwd* descs,
const CUtensorMap* src_desc_per_pe, // descs->src_x_desc or src_dy_desc
const CUtensorMap* dst_desc, // descs->dst_x_staging or dst_dy_staging
char* bounce_warp) {
namespace ptx = cuda::ptx;
using Bounce = GetBounceBwd<Element>;
using Bounce = GetBounceBwd<Element, BoxRows>;
constexpr int kWarpsPerTile = kNumGetWarpsBwd * NC; // = NC
constexpr int kRowBand = TileM / kWarpsPerTile; // rows this warp owns
constexpr int kBoxRows = Bounce::kBoxRows;
@@ -227,7 +230,9 @@ __device__ __forceinline__ void do_get_bwd_tma(
if (tma_ok) {
Element* sbuf = reinterpret_cast<Element*>(bounce_warp);
uint64_t* mbar = reinterpret_cast<uint64_t*>(bounce_warp + Bounce::kBoxBytes);
uint64_t* mbar = reinterpret_cast<uint64_t*>(
bounce_warp + Bounce::kMbarOffset +
mbar_index * Bounce::kMbarStride);
if (lane == 0)
ptx::mbarrier_init(mbar, 1u);
@@ -275,15 +280,25 @@ __device__ __forceinline__ void do_get_bwd_tma(
(size_t)chunk * sizeof(Element), global_pe);
} else {
if (chunk_idx == ib_seq % kWarpsPerTile) {
nvshmemx_getmem_warp(local_tile, remote_tile,
(size_t)tile_elems * sizeof(Element), global_pe);
int valid_elems =
max(0, min(TileM, info.valid_rows)) * bufs.hidden_dim;
for (int i = valid_elems + lane; i < tile_elems; i += 32)
local_tile[i] = Element{};
__syncwarp();
if (valid_elems > 0)
nvshmemx_getmem_warp(
local_tile, remote_tile,
(size_t)valid_elems * sizeof(Element), global_pe);
}
++ib_seq;
}
}
if (tile_expert_ids_dst != nullptr && chunk_idx == 0 && lane == 0)
if (tile_expert_ids_dst != nullptr && chunk_idx == 0 && lane == 0) {
tile_expert_ids_dst[slot] = info.expert;
if (tile_valid_rows_dst != nullptr)
tile_valid_rows_dst[slot] = info.valid_rows;
}
__syncwarp();
src_pipe.producer_release(lane);
@@ -422,8 +437,12 @@ __device__ __forceinline__ void do_put_bwd(
my_bytes, global_pe);
} else {
if (put_idx == ib_seq % kWarpsPerTile) {
nvshmemx_putmem_warp(remote_tile, local_tile,
(size_t)tile_elems * sizeof(Element), global_pe);
int valid_elems =
max(0, min(TileM, info.valid_rows)) * bufs.hidden_dim;
if (valid_elems > 0)
nvshmemx_putmem_warp(
remote_tile, local_tile,
(size_t)valid_elems * sizeof(Element), global_pe);
}
++ib_seq;
}
@@ -547,6 +566,12 @@ __device__ __forceinline__ void nvshmem_comm_prologue_bwd(
for (int i = tid; i <= experts_per_pe; i += (kCommWarpsPerCta * 32))
smem.remote_offsets[pe * dst_stride + i] =
bufs.all_expert_offsets[pe * src_stride + local_e_start + i];
if (bufs.all_expert_counts != nullptr) {
for (int i = tid; i < experts_per_pe; i += (kCommWarpsPerCta * 32))
smem.remote_counts[pe * experts_per_pe + i] =
bufs.all_expert_counts[
pe * bufs.num_experts + local_e_start + i];
}
}
}
__syncwarp();
@@ -565,6 +590,9 @@ __device__ __forceinline__ void nvshmem_comm_prologue_bwd(
TileIterator<TileM> iter;
iter.remote_offsets = smem.remote_offsets;
iter.offsets_stride = dst_stride;
iter.remote_counts =
bufs.all_expert_counts != nullptr ? smem.remote_counts : nullptr;
iter.counts_stride = experts_per_pe;
iter.experts_per_pe = experts_per_pe;
iter.num_pes = num_pes;
iter.my_pe = my_pe;
@@ -612,7 +640,12 @@ __device__ __forceinline__ void nvshmem_comm_prologue_bwd(
// NumConsumers = NSplit; put pipe uses NumProducers = NSplit,
// NumConsumers = NC.
template <typename Element, int TileM, int NumStages, int NC = 2>
template <
typename Element,
int TileM,
int NumStages,
int NC = 2,
int BoxRows = kGetBoxRowsBwdSm90>
__device__ __forceinline__ void nvshmem_comm_main_bwd(
CommSmem& smem,
const CommBuffersBwd& bufs,
@@ -650,6 +683,9 @@ __device__ __forceinline__ void nvshmem_comm_main_bwd(
TileIterator<TileM> iter;
iter.remote_offsets = smem.remote_offsets;
iter.offsets_stride = bufs.experts_per_pe + 1;
iter.remote_counts =
bufs.all_expert_counts != nullptr ? smem.remote_counts : nullptr;
iter.counts_stride = bufs.experts_per_pe;
iter.experts_per_pe = bufs.experts_per_pe;
iter.num_pes = bufs.num_pes;
iter.my_pe = bufs.my_pe;
@@ -689,6 +725,7 @@ __device__ __forceinline__ void nvshmem_comm_main_bwd(
(warp_id == kCommBwdGetWarp0) && (yc == 0);
int* x_expert_dst = is_expert_id_writer ? bufs.tile_expert_ids_x : nullptr;
int* dy_expert_dst = is_expert_id_writer ? bufs.tile_expert_ids_dy : nullptr;
int* x_valid_dst = is_expert_id_writer ? bufs.tile_valid_rows_x : nullptr;
// One IB-tile counter shared by the X and dY gets, advanced per IB
// getmem so X(t), dY(t), X(t+1), … rotate across the NC get warps.
@@ -696,16 +733,20 @@ __device__ __forceinline__ void nvshmem_comm_main_bwd(
for (int i = 0; i < my_total; ++i) {
TileInfo info = iter.next();
do_get_bwd_tma<Element, TileM, K, NC>(
do_get_bwd_tma<Element, TileM, K, NC, BoxRows>(
x_pipe, bufs, info, remote_x_base, x_staging, tile_elems,
xc, MC, chunk_idx, ib_seq, lane, x_expert_dst, descs,
xc, MC, chunk_idx, ib_seq, lane,
/*mbar_index=*/0,
x_expert_dst, x_valid_dst, descs,
descs ? descs->src_x_desc : nullptr,
descs ? &descs->dst_x_staging_desc : nullptr,
get_bounce);
do_get_bwd_tma<Element, TileM, K, NC>(
do_get_bwd_tma<Element, TileM, K, NC, BoxRows>(
dy_pipe, bufs, info, remote_dy_base, dy_staging, tile_elems,
xc, MC, chunk_idx, ib_seq, lane, dy_expert_dst, descs,
xc, MC, chunk_idx, ib_seq, lane,
/*mbar_index=*/1,
dy_expert_dst, nullptr, descs,
descs ? descs->src_dy_desc : nullptr,
descs ? &descs->dst_dy_staging_desc : nullptr,
get_bounce);
@@ -180,6 +180,7 @@ struct SortBuffers {
int* sorted_token_ids; // [total_slots] — final output: slot → token
int* token_expert_slots; // [T * K] — final output: (token, k) → slot
int* expert_offsets; // [E + 1] — aligned expert boundaries (symmetric)
int* expert_counts; // [E] — exact routed rows per expert (nullable)
int* tile_expert_ids; // [max_total_tiles] — expert ID per M-tile (nullable)
int* cta_done; // [num_blocks] — per-CTA completion flags (Blelloch tree)
int* cta_sums; // [num_blocks * E] — per-CTA expert totals for prefix sum
+98 -49
View File
@@ -103,8 +103,8 @@ template <
int NC_ = 4,
// GemmTileM_ decouples the GEMM compute tile (mlp1/mlp2 wgmma + TMA) from
// the COMM staging tile (TileM_). TileM_ is the comm tile — staging ring
// slots, per-tile semaphores, NC, sort/dispatch — and is fixed at 128.
// GemmTileM_ ∈ {64,128}: when < TileM_, the GEMM waits on the 128-wide comm
// slots, per-tile semaphores, NC, sort/dispatch — and may be wider than the
// GEMM tile. GemmTileM_ ∈ {64,128}: when < TileM_, the GEMM waits on one comm
// semaphore once, then steps through kSubTiles = TileM_/GemmTileM_ sub-tiles
// of GemmTileM_ rows each (finer TMA + wgmma) within that one comm slot.
// Default GemmTileM_ = TileM_ → kSubTiles = 1 → bit-identical to the old
@@ -140,24 +140,27 @@ struct MoeFusedConfig {
static constexpr int kZBufferSlots = ZBufferSlots_;
static constexpr int kCommNumStages = CommNumStages_;
// kTileM is the COMM tile (staging ring slots, per-tile semaphores, NC,
// sort/dispatch granularity). Fixed at 128 for the decoupled path.
static constexpr int kTileM = TileM_; // comm tile (128)
// sort/dispatch granularity).
static constexpr int kTileM = TileM_;
static constexpr int kGemmTileM = GemmTileM_; // gemm tile ∈ {64,128}
static constexpr int kSubTiles = TileM_ / GemmTileM_; // 1 or 2
static constexpr int kSubTiles = TileM_ / GemmTileM_;
static constexpr int kCompute = Compute_;
static constexpr int kNumThreads = 384; // fixed
static_assert(TileM_ % GemmTileM_ == 0,
"CommTileM must be an integer multiple of GemmTileM");
static_assert(TileM_ % NC_ == 0,
"CommTileM must be divisible by NC");
static_assert(kSubTiles == 1 || kSubTiles == 2,
"kSubTiles (CommTileM/GemmTileM) must be 1 or 2");
"CommTileM/GemmTileM must be 1 or 2");
static_assert(GemmTileM_ == 64 || GemmTileM_ == 128,
"GemmTileM must be 64 or 128");
// Iterators operate on the COMM tile (kTileM): staging slots / semaphores
// are 128-wide regardless of the GEMM sub-tile size.
// Iterators operate on the COMM tile (kTileM), independent of the GEMM
// sub-tile size.
using LocalIter = LocalMlpTileIterator<Element, kTileM>;
using RemoteIter = RemoteMlpTileIterator<Element, kCommNumStages, kNC, kTileM>;
using RemoteIter = RemoteMlpTileIterator<
Element, kCommNumStages, kNC, kTileM, kSubTiles>;
};
// ============================================================================
@@ -225,6 +228,7 @@ struct MoeBuffers {
// All PEs' expert offsets -- symmetric.
int* all_expert_offsets;
int* all_expert_counts;
int* cta_counter; // [1] device memory — shared monotonic
// Sort buffers.
@@ -232,6 +236,7 @@ struct MoeBuffers {
int* sorted_token_ids;
int* token_expert_slots;
int* expert_offsets; // symmetric
int* expert_counts; // symmetric exact counts
int* cta_done;
int* cta_sums;
@@ -255,7 +260,7 @@ void moe_configure_symmetric(
int num_pes,
int num_hosts,
int gpus_per_host) {
static constexpr int kTileM = 128; // fixed by WGMMA
static constexpr int kTileM = kMaxMoeCommTileM;
// num_hosts × gpus_per_host must equal the team size so the comm
// schedule (g_dest_table / g_rank_table) addresses exactly the PEs
@@ -279,7 +284,7 @@ void moe_configure_symmetric(
cfg.max_top_k = max_top_k;
cfg.initialized = true;
// Preset sizes for the symmetric stack used to hold X / Y / offsets
// Preset sizes for the symmetric stack used to hold X / Y / routing metadata
// across fwd → bwd. Element type is bf16 (= 2 bytes); kept in sync
// with allocate_moe_buffers below.
constexpr std::size_t kElemBytes = 2; // sizeof(__nv_bfloat16)
@@ -287,15 +292,18 @@ void moe_configure_symmetric(
static_cast<std::size_t>(cfg.max_total_slots) * cfg.hidden_dim * kElemBytes;
std::size_t all_off_bytes =
static_cast<std::size_t>(cfg.num_pes) * (cfg.max_num_experts + 1) * sizeof(int);
std::size_t all_count_bytes =
static_cast<std::size_t>(cfg.num_pes) * cfg.max_num_experts * sizeof(int);
auto& stack = global_symmetric_stack();
stack.set_size(kSymmKeyXSorted, symm_slot_bytes);
stack.set_size(kSymmKeyYBuf, symm_slot_bytes);
stack.set_size(kSymmKeyAllExpertOffsets, all_off_bytes);
stack.set_size(kSymmKeyAllExpertCounts, all_count_bytes);
}
// Releases the x_sorted / y_buf / all_expert_offsets entries pushed onto the
// symmetric stack by the most recent fwd call. Must be called collectively
// Releases the forward metadata entries pushed onto the symmetric stack by the
// most recent fwd call. Must be called collectively
// on every PE in LIFO order vs. the fwd that produced them. After this,
// the buffers can be reused by a subsequent fwd. The torch::Tensor views
// returned by fwd remain valid pointers but will alias whatever lives in
@@ -303,7 +311,9 @@ void moe_configure_symmetric(
void moe_pop_fwd() {
auto& stack = global_symmetric_stack();
// LIFO order: bottom pushes first. Reverse the put order in
// allocate_moe_buffers (x_sorted, y_buf, all_expert_offsets).
// allocate_moe_buffers (x_sorted, y_buf, all_expert_offsets,
// all_expert_counts).
stack.pop(kSymmKeyAllExpertCounts);
stack.pop(kSymmKeyAllExpertOffsets);
stack.pop(kSymmKeyYBuf);
stack.pop(kSymmKeyXSorted);
@@ -333,8 +343,6 @@ static MoeBuffers<Config> allocate_moe_buffers(
using Element = typename Config::Element;
static constexpr int kTileM = Config::kTileM;
static constexpr int kZBufferSlots = Config::kZBufferSlots;
static constexpr int kCommNumStages = Config::kCommNumStages;
static constexpr int kNC = Config::kNC;
// Staging is a flat ring of L = MC · kCommNumStages slots, where
// MC = num_blocks / NC (num_blocks == launched gridDim.x). This MUST equal
@@ -348,8 +356,6 @@ static MoeBuffers<Config> allocate_moe_buffers(
// end of src_ready / tile_expert_ids (OOB). num_blocks/NC == gridDim.x/NC
// == n_gemm/NC in the divisible (legacy) case, so this is a no-op there.
// Comm strides MC through NumStages per xc; MLP (ticket iterator) wraps mod L.
int mc = num_blocks / kNC;
int comm_l = mc * kCommNumStages;
// Raw SM count — used as the device-independent upper bound on the comm
// staging row count (mc <= sm_count) so the symmetric staging size is a
// worst-case bound across configs (see staging sizing below).
@@ -367,8 +373,8 @@ static MoeBuffers<Config> allocate_moe_buffers(
auto& scfg = get_symm_config();
LIGER_CHECK(scfg.initialized, "Call moe_configure_symmetric before moe_fused_fwd_bf16");
// Persistent symmetric tensors (x_sorted, y_buf, all_expert_offsets) live
// in the symmetric stack so they can survive across fwd calls into bwd.
// Persistent symmetric tensors and routing metadata live in the symmetric
// stack so they can survive across fwd calls into bwd.
auto& sym_stack = global_symmetric_stack();
// Z buffer (device).
@@ -387,9 +393,6 @@ static MoeBuffers<Config> allocate_moe_buffers(
// Output Y -- symmetric, local MLP writes here, remote PEs put here.
b.y_buf = reinterpret_cast<Element*>(sym_stack.put(kSymmKeyYBuf));
size_t actual_y_bytes = static_cast<size_t>(total_slots) * hidden_dim * sizeof(Element);
if (cudaError_t e = cudaMemsetAsync(b.y_buf, 0, actual_y_bytes, stream); e != cudaSuccess)
LIGER_FAIL_CUDA("moe_fwd: cudaMemsetAsync(y_buf) failed: ", cudaGetErrorString(e));
// Phase counters.
size_t counter_bytes = max_runtime_grid_x * sizeof(int);
@@ -418,8 +421,13 @@ static MoeBuffers<Config> allocate_moe_buffers(
b.src_staging = reinterpret_cast<Element*>(pool.get_symmetric("moe_src_staging", src_bytes));
b.dst_staging = reinterpret_cast<Element*>(pool.get_symmetric("moe_dst_staging", dst_bytes));
// Stage pipe signals — one entry per flat slot.
size_t sig_bytes = (size_t)comm_l * sizeof(int);
// Device buffers are cached by key across tuning/config changes, so size and
// clear them at a configuration-independent upper bound. Since
// kSubTiles <= NC, (num_blocks / NC) * stages * kSubTiles is bounded by
// sm_count * max_comm_stages.
size_t signal_l_ub =
static_cast<size_t>(sm_count) * scfg.max_comm_stages;
size_t sig_bytes = signal_l_ub * sizeof(int);
b.src_ready = static_cast<int*>(pool.get_device("moe_src_ready", sig_bytes));
b.src_consumed = static_cast<int*>(pool.get_device("moe_src_consumed", sig_bytes));
b.dst_ready = static_cast<int*>(pool.get_device("moe_dst_ready", sig_bytes));
@@ -433,12 +441,13 @@ static MoeBuffers<Config> allocate_moe_buffers(
if (cudaError_t e = cudaMemsetAsync(b.dst_consumed, 0, sig_bytes, stream); e != cudaSuccess)
LIGER_FAIL_CUDA("moe_fwd: cudaMemsetAsync(dst_consumed) failed: ", cudaGetErrorString(e));
// Per-slot expert IDs — one entry per flat slot.
size_t eid_bytes = (size_t)comm_l * sizeof(int);
// Per-parent-slot expert IDs use the same conservative upper bound.
size_t eid_bytes = signal_l_ub * sizeof(int);
b.tile_expert_ids = static_cast<int*>(pool.get_device("moe_tile_expert_ids", eid_bytes));
// All PEs' expert offsets (symmetric). Use max experts for stable sizing.
b.all_expert_offsets = static_cast<int*>(sym_stack.put(kSymmKeyAllExpertOffsets));
b.all_expert_counts = static_cast<int*>(sym_stack.put(kSymmKeyAllExpertCounts));
// CTA counter for local all-CTA barriers around NVSHMEM collectives.
b.cta_counter = static_cast<int*>(
@@ -460,6 +469,8 @@ static MoeBuffers<Config> allocate_moe_buffers(
b.token_expert_slots = token_expert_slots_ptr;
b.expert_offsets = static_cast<int*>(
pool.get_symmetric("moe_sort_offsets", (scfg.max_num_experts + 1) * sizeof(int)));
b.expert_counts = static_cast<int*>(
pool.get_symmetric("moe_sort_counts", scfg.max_num_experts * sizeof(int)));
b.cta_done = static_cast<int*>(
pool.get_device("moe_sort_cta_done", num_blocks * sizeof(int)));
b.cta_sums = static_cast<int*>(
@@ -586,7 +597,15 @@ moe_fused_kernel(
size_t offsets_region = sizeof(MoeSmem<Traits1, Traits2, Config::kCompute>);
offsets_region = (offsets_region + sizeof(int) - 1) & ~(sizeof(int) - 1);
smem.comm.remote_offsets = reinterpret_cast<int*>(raw_smem + offsets_region);
size_t offsets_count =
(size_t)p.comm.num_pes() * (p.comm.experts_per_pe + 1);
if (threadIdx.x == 0) {
smem.comm.remote_offsets =
reinterpret_cast<int*>(raw_smem + offsets_region);
smem.comm.remote_counts =
smem.comm.remote_offsets + offsets_count;
}
__syncthreads();
// GET-via-TMA bounce region: placed after remote_offsets, 128-aligned
// (TMA dst smem must be 128B-aligned). MUST match the host smem_size
@@ -595,7 +614,9 @@ moe_fused_kernel(
char* get_bounce = nullptr;
if (get_descs.enabled) {
size_t boff = offsets_region
+ (size_t)p.comm.num_pes() * (p.comm.experts_per_pe + 1) * sizeof(int);
+ (offsets_count
+ (size_t)p.comm.num_pes() * p.comm.experts_per_pe)
* sizeof(int);
boff = (boff + 127) & ~((size_t)127);
get_bounce = raw_smem + boff;
}
@@ -624,8 +645,21 @@ moe_fused_kernel(
if (threadIdx.x == 0) {
int total_m_tiles = smem.comm.global_total;
int mlp_tiles = total_m_tiles;
if constexpr (Config::kSubTiles > 1) {
mlp_tiles = 0;
for (int pe = 0; pe < p.comm.num_pes(); ++pe) {
for (int e = 0; e < p.comm.experts_per_pe; ++e) {
int count = smem.comm.remote_counts[
pe * p.comm.experts_per_pe + e];
mlp_tiles +=
(count + Config::kGemmTileM - 1) /
Config::kGemmTileM;
}
}
}
runtime_nsplit = select_runtime_nsplit_from_tiles(
total_m_tiles,
mlp_tiles,
mlp_dims.num_n_tiles_1,
mlp_dims.num_n_tiles_2,
mlp_dims.num_k_tiles_1,
@@ -635,9 +669,10 @@ moe_fused_kernel(
n_gemm = ((int)gridDim.x / runtime_nsplit) * runtime_nsplit;
grid_x = n_gemm / runtime_nsplit;
col = flat_id / runtime_nsplit;
int mlp_count = 0;
if (flat_id < n_gemm && col < total_m_tiles)
mlp_count = (total_m_tiles - 1 - col) / grid_x + 1;
if (flat_id < n_gemm && col < mlp_tiles)
mlp_count = (mlp_tiles - 1 - col) / grid_x + 1;
smem.comm.per_cta_tiles = mlp_count;
smem.comm.runtime_nsplit = runtime_nsplit;
smem.comm.runtime_n_gemm = n_gemm;
@@ -660,7 +695,8 @@ moe_fused_kernel(
// on the precomputed comm tile count — no GEMM coupling, so a
// comm-only CTA (no local GEMM work) still drives its comm tiles.
if (smem.comm.total_tiles > 0) {
nvshmem_comm_main<Element, kTileM, kCommNumStages, kNC>(
nvshmem_comm_main<
Element, kTileM, kCommNumStages, kNC, Config::kSubTiles>(
smem.comm, p.comm, &get_descs, get_bounce);
}
} else if (flat_id < n_gemm) {
@@ -777,18 +813,21 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
// pipeline (more in-flight slots = grid.x/NC).
// - TileM=64: NC=2 already matches NC=4 throughput because tiles
// are half-size, so twice as many flow through the same pipeline.
// COMM tile is FIXED at 128 (NC=4) for EVERY config. This keeps the
// Both architectures use CommTileM=128 with NC=4. Keeping CommTileM uniform per
// architecture preserves
// all-to-all dispatch padding (x_sorted / expert_offsets, padded to the
// comm tile) uniform across PEs — required for correctness and what makes
// ragged-token auto-dispatch work (a per-PE comm tile would misalign the
// cross-PE get/put). `TileM` is now purely the GEMM-tile knob: it flows to
// GemmTileM (which defaults to TileM), so a "TM64" config = comm128/gemm64.
// comm tile) across PEs. The 256/8 ratio keeps each SM100 comm CTA's row
// band and GET-bounce footprint unchanged.
using CommGeometry = MoeCommGeometry<Compute>;
using Config = MoeFusedConfig<
Element_, /*CommTileM=*/128,
Element_, /*CommTileM=*/CommGeometry::TileM,
TileN1, TileK1, Stages1, EpiChunkN1,
TileN2, TileK2, Stages2, EpiChunkN2,
ZBufferSlots, CommNumStages,
/*NC=*/4, /*GemmTileM=*/GemmTileM, /*Compute_=*/Compute>;
ZBufferSlots,
CommNumStages * CommGeometry::RingStageScale
+ CommGeometry::RingStageExtra,
/*NC=*/CommGeometry::NC,
/*GemmTileM=*/GemmTileM, /*Compute_=*/Compute>;
using Element = typename Config::Element;
using Traits1 = typename Config::Traits1;
@@ -913,6 +952,7 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
p.sort.sorted_token_ids = buf.sorted_token_ids;
p.sort.token_expert_slots = buf.token_expert_slots;
p.sort.expert_offsets = buf.expert_offsets;
p.sort.expert_counts = buf.expert_counts;
p.sort.tile_expert_ids = buf.mlp_tile_expert_ids;
p.sort.cta_done = buf.cta_done;
p.sort.cta_sums = buf.cta_sums;
@@ -928,11 +968,13 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
p.comm.dst_ready = buf.dst_ready;
p.comm.dst_consumed = buf.dst_consumed;
p.comm.expert_offsets = buf.expert_offsets;
p.comm.expert_counts = buf.expert_counts;
p.comm.sorted_token_ids = buf.sorted_token_ids;
p.comm.local_tokens = buf.x_sorted;
p.comm.local_output = y_buf_ptr;
p.comm.tile_expert_ids = buf.tile_expert_ids;
p.comm.all_expert_offsets = buf.all_expert_offsets;
p.comm.all_expert_counts = buf.all_expert_counts;
p.comm.pe_sync.cta_counter = buf.cta_counter;
p.comm.pe_sync.num_pes = num_pes;
p.comm.pe_sync.my_pe = my_pe;
@@ -1148,8 +1190,6 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
ok = make_get_tma_map(get_descs.dst_staging_desc, buf.src_staging,
hidden_dim, remote_total_rows, kGetBoxRows);
get_descs.enabled = ok ? 1 : 0;
// A/B toggle: LIGER_GET_TMA=0 forces the warp-getmem path at the same
// config (no bounce smem), isolating the GET mechanism on the same pod.
if (const char* e = std::getenv("LIGER_GET_TMA"))
if (e[0] == '0') get_descs.enabled = 0;
}
@@ -1197,6 +1237,7 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
size_t smem_mlp = sizeof(MoeSmem<Traits1, Traits2, Config::kCompute>);
smem_mlp = (smem_mlp + sizeof(int) - 1) & ~(sizeof(int) - 1);
smem_mlp += num_pes * (experts_per_pe + 1) * sizeof(int); // remote_offsets
smem_mlp += num_pes * experts_per_pe * sizeof(int); // remote_counts
// GET-via-TMA bounce: append a 128-aligned region (must match the kernel's
// get_bounce offset). Disable the TMA-get path if it would exceed the
@@ -1265,7 +1306,9 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
// ids for those slots (see the OOB note in allocate_moe_buffers).
int mc_local = num_blocks / Config::kNC;
int comm_l = mc_local * Config::kCommNumStages;
size_t sig_bytes = static_cast<size_t>(comm_l) * sizeof(int);
size_t sig_bytes =
static_cast<size_t>(comm_l) * Config::kSubTiles * sizeof(int);
size_t eid_bytes = static_cast<size_t>(comm_l) * sizeof(int);
int max_m_tiles = scfg.max_total_slots / kTileM;
int max_tile_counts = max_m_tiles * scfg.max_num_experts;
@@ -1282,7 +1325,7 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
fused_memset_add(ma, buf.src_consumed, sig_bytes, 0x00);
fused_memset_add(ma, buf.dst_ready, sig_bytes, 0x00);
fused_memset_add(ma, buf.dst_consumed, sig_bytes, 0x00);
fused_memset_add(ma, buf.tile_expert_ids, sig_bytes, 0xff);
fused_memset_add(ma, buf.tile_expert_ids, eid_bytes, 0xff);
fused_memset_add(ma, buf.tile_expert_counts,
static_cast<size_t>(max_tile_counts) * sizeof(int), 0x00);
fused_memset_add(ma, buf.cta_sums,
@@ -1342,6 +1385,8 @@ moe_fused_fwd_bf16(const MoeFwdArgs& a, int static_nsplit) {
*a.x_sorted_out = buf.x_sorted;
*a.y_buf_out = y_buf_ptr;
*a.all_expert_offsets_out = buf.all_expert_offsets;
if (a.all_expert_counts_out != nullptr)
*a.all_expert_counts_out = buf.all_expert_counts;
}
// ── Runtime dispatch table for tuned-config lookup ────────────────────
@@ -1354,8 +1399,8 @@ struct DispatchEntry {
int TileN1, TileK1, Stages1, EpiChunkN1;
int TileN2, TileK2, Stages2, EpiChunkN2;
int ZBufferSlots, CommNumStages;
int TileM; // COMM tile (staging/semaphores/NC)
int GemmTileM; // GEMM tile ∈ {64,128}; == TileM for non-decoupled configs
int TileM; // tuned GEMM-tile field (legacy dispatch-table name)
int GemmTileM; // GEMM tile ∈ {64,128}
MoeFwdFn fn;
};
@@ -1618,7 +1663,9 @@ void moe_fused_fwd_dispatch(const MoeFwdArgs& a, int* chosen_tile_m) {
"LIGER_MOE_FORCE_CONFIG=", s, " is not in the compiled dispatch "
"table. Add it to LIGER_MOE_TUNE_CONFIGS in moe_fwd_bwd_tune_configs.hpp.");
de->fn(a, kFwdRuntimeNsplitSeed);
*chosen_tile_m = tc.TileM;
*chosen_tile_m = de->Compute == 100
? MoeCommGeometry<100>::TileM
: MoeCommGeometry<90>::TileM;
return;
}
@@ -1643,7 +1690,9 @@ void moe_fused_fwd_dispatch(const MoeFwdArgs& a, int* chosen_tile_m) {
"Add it to LIGER_MOE_TUNE_CONFIGS in moe_fwd_bwd_tune_configs.hpp.");
de->fn(a, kFwdRuntimeNsplitSeed);
*chosen_tile_m = tc.TileM;
*chosen_tile_m = de->Compute == 100
? MoeCommGeometry<100>::TileM
: MoeCommGeometry<90>::TileM;
}
// ─────────────────────────────────────────────────────────────────────
+5 -3
View File
@@ -40,6 +40,7 @@ using namespace cute;
inline constexpr const char* kSymmKeyXSorted = "x_sorted";
inline constexpr const char* kSymmKeyYBuf = "y_buf";
inline constexpr const char* kSymmKeyAllExpertOffsets = "all_expert_offsets";
inline constexpr const char* kSymmKeyAllExpertCounts = "all_expert_counts";
// ═══════════════════════════════════════════════════════════════════
// MoE shared memory — union of MLP smem + comm smem
@@ -62,9 +63,9 @@ template <typename Traits1, typename Traits2,
int ZBufferSlots,
int CommNumStages,
int NC,
// kSubTiles = CommTileM / GemmTileM ∈ {1,2}. >1 means the GEMM steps
// kSubTiles = CommTileM / GemmTileM. >1 means the GEMM steps
// through SubTiles sub-tiles of Traits1::TileM (=GemmTileM) rows per
// 128-wide comm staging slot. 1 → unchanged single-tile path.
// communication staging slot. 1 → unchanged single-tile path.
int SubTiles,
int Compute = 90,
typename LocalIter, typename RemoteIter,
@@ -158,7 +159,8 @@ __device__ __forceinline__ void moe_fused_fwd(
RemoteIter remote_iter;
remote_iter.init(
// remote_offsets in SMEM drives the embedded walker (null → no derivation).
smem.comm.remote_offsets, experts_per_pe, num_pes, my_pe, gpus_per_node,
smem.comm.remote_offsets, smem.comm.remote_counts,
experts_per_pe, num_pes, my_pe, gpus_per_node,
smem.comm.per_cta_tiles,
col,
n_gemm,
+130 -117
View File
@@ -87,16 +87,16 @@ namespace liger {
// illegal-instruction / smem-overrun bugs in the past.
template <
int NSplit2_ = 4, // Phase 2 (mlp3/mlp4) virtual n-split (autotuning surface)
// Trait defaults match the standalone benches (bench_mlp{1_act,2_t,3,4,5})
// at Stages=4 cooperative-M-split TileM=128.
// SM100 uses Stage-3 Phase-1 traits to leave room for independent full-size
// X/dY TMA bounce buffers. SM90 dispatch rows provide their tuned values.
int TileM1_ = 128,
int TileN1_ = 128,
int TileK1_ = 64,
int Stages1_ = 4,
int Stages1_ = 3,
int EpiChunkN1_ = 32, // mlp1_act
int TileN2_ = 256,
int TileK2_ = 64,
int Stages2_ = 4,
int Stages2_ = 3,
int TileM2T_ = 128, // Phase 1b' (mlp2_t): TileM ∈ {64, 128}
// mlp3/mlp4 cooperative layout (#102) supports only (256,128) or (128,256)
// and needs Stages=2 to fit the 228 KiB smem cap — Stages=4 at TileN=256
@@ -113,7 +113,7 @@ template <
int TileM5_ = 128,
int TileN5_ = 256,
int TileK5_ = 64,
int Stages5_ = 4,
int Stages5_ = 3,
int EpiChunkN25_ = 64, // shared by mlp2_t and mlp5 (same smem shape)
int EpiChunkN34_ = 64, // shared by mlp3 and mlp4 (same smem shape)
typename Element_ = bfloat16_t,
@@ -127,17 +127,19 @@ template <
int SubBatch_ = 2,
// CommTileM_ decouples the COMM staging tile (ring slots, semaphores,
// tile_expert_ids granularity) from the Phase-1 GEMM tile (Traits1::TileM =
// mlp1a/mlp2t/mlp5 = the GemmTileM hyperparameter ∈ {64,128}). CommTileM_ is
// fixed at 128; when Traits1::TileM < CommTileM_, Phase-1 steps through
// mlp1a/mlp2t/mlp5 = the GemmTileM hyperparameter ∈ {64,128}). When
// Traits1::TileM < CommTileM_, Phase-1 steps through
// kSubTiles = CommTileM_/Traits1::TileM sub-tiles of GemmTileM rows per
// 128-wide comm slot (mirrors the forward). Default == TileM1_ → kSubTiles=1
// communication slot (mirrors forward). Default == TileM1_ → kSubTiles=1
// → bit-identical to the old coupled path.
int CommTileM_ = 128,
int Compute_ = 90>
struct MoeBwdConfig {
using Element = Element_;
static constexpr int kActStoreTileM = 64;
using Traits1 = Mlp1Traits <
Element, TileM1_, TileN1_, TileK1_, Stages1_, EpiChunkN1_>; // Phase 1a
Element, TileM1_, TileN1_, TileK1_, Stages1_, EpiChunkN1_,
kActStoreTileM>; // Phase 1a
using Traits2T = Mlp2TTraits<Element, TileM2T_, TileN2_, TileK2_, Stages2_, EpiChunkN25_>; // Phase 1b'
// Blackwell always uses the paired-CTA MLP3/MLP4 path. Hopper keeps the
// existing single-CTA traits and never instantiates SM100-only machinery.
@@ -165,19 +167,19 @@ struct MoeBwdConfig {
static constexpr int kCommNumStages = CommNumStages_;
static constexpr int kSubBatch = SubBatch_;
// kTileM is the COMM staging tile (ring slots / semaphores / tile_expert_ids
// granularity), fixed at CommTileM_=128 — decoupled from the Phase-1 GEMM
// tile. kGemmTileM = Traits1::TileM (mlp1/2/5 GEMM tile, the hyperparameter);
// granularity), decoupled from the Phase-1 GEMM tile. kGemmTileM =
// Traits1::TileM (mlp1/2/5 GEMM tile);
// the mlp3/4 ratios (efkb_stride / bk↔Kblock / ring_kb) are computed from it.
static constexpr int kTileM = CommTileM_; // comm tile (128)
static constexpr int kTileM = CommTileM_;
static constexpr int kGemmTileM = Traits1::TileM; // Phase-1 gemm tile (64/128)
static constexpr int kSubTiles = CommTileM_ / Traits1::TileM; // 1 or 2
static constexpr int kSubTiles = CommTileM_ / Traits1::TileM;
static constexpr int kCompute = Compute_;
static constexpr int kNumThreads = 384;
static_assert(CommTileM_ % Traits1::TileM == 0,
"CommTileM must be an integer multiple of the Phase-1 GEMM TileM (Traits1::TileM)");
static_assert(kSubTiles == 1 || kSubTiles == 2,
"kSubTiles (CommTileM/GemmTileM) must be 1 or 2");
"CommTileM/GemmTileM must be 1 or 2");
// mlp1a/mlp2t/mlp5 must share the same Phase-1 GEMM tile so their sub-tiling
// and the Z/dU/dV/dZ buffer rows stay aligned.
static_assert(Traits1::TileM == Traits2T::TileM && Traits1::TileM == Traits5::TileM,
@@ -198,8 +200,10 @@ struct MoeBwdConfig {
"reduce TileN/TileK/Stages of one of the bwd phase traits");
using LocalIter = LocalMlpTileIteratorBwd<Element, kTileM>;
using RemoteIter = RemoteMlpTileIteratorBwd<Element, kCommNumStages, kNC, kTileM>;
using FusedIter = FusedMlpTileIteratorBwd<Element, kCommNumStages, kNC, kTileM>;
using RemoteIter = RemoteMlpTileIteratorBwd<
Element, kCommNumStages, kNC, kTileM>;
using FusedIter = FusedMlpTileIteratorBwd<
Element, kCommNumStages, kNC, kTileM>;
};
// ============================================================================
@@ -309,6 +313,7 @@ struct MoeBwdBuffers {
// mlp3 reads tile_expert_ids_dy. See CommBuffersBwd docstring for why.
int* tile_expert_ids_x;
int* tile_expert_ids_dy;
int* tile_valid_rows_x;
// Sort-internal scratch.
int* tile_expert_counts;
@@ -431,13 +436,13 @@ static MoeBwdBuffers<Config> allocate_moe_bwd_buffers(
// Worst-case sizing across the whole tuner sweep: the symmetric/device
// pools cache by key and ABORT on grow, so the FIRST config to allocate a
// key locks its size. A small-TileM (64) or small-CommStages config must
// not lock in a buffer that a later TileM=128 / deeper-pipe config can't
// grow into. Size every comm buffer at the configured maxima (TileM=128,
// CommStages=8, hidden_dim=scfg.hidden_dim); the kernel indexes by the
// per-call (mc·kCommNumStages, kTileM) ≤ these UBs, so over-allocation is
// safe. Mirrors moe.cu's MoeSymmConfig.max_tile_m / max_comm_stages fix.
constexpr int kCommStagesUB = 8; // max CommNumStages over the sweep
constexpr int kTileMUB = 128; // max TileM over the sweep (WGMMA-bounded)
// not lock in a buffer that a later TileM=256 / deeper-pipe config can't
// grow into. Size every comm buffer at the centralized TileM/stage maxima;
// the kernel indexes by the per-call
// (mc·kCommNumStages, kTileM) ≤ these UBs, so over-allocation is safe.
// Mirrors moe.cu's MoeSymmConfig.max_tile_m / max_comm_stages fix.
constexpr int kCommStagesUB = kMaxMoeCommStages;
constexpr int kTileMUB = kMaxMoeCommTileM;
int comm_l_ub = sm_count * kCommStagesUB;
size_t stage_slots_bytes =
(size_t)comm_l_ub * kTileMUB * scfg.hidden_dim * sizeof(Element);
@@ -474,6 +479,8 @@ static MoeBwdBuffers<Config> allocate_moe_bwd_buffers(
pool.get_device("moe_bwd_tile_expert_ids_x", eid_bytes));
b.tile_expert_ids_dy = static_cast<int*>(
pool.get_device("moe_bwd_tile_expert_ids_dy", eid_bytes));
b.tile_valid_rows_x = static_cast<int*>(
pool.get_device("moe_bwd_tile_valid_rows_x", eid_bytes));
// ── Sort scratch (sized to scfg max for stability across calls) ──
int max_sorted_slots = scfg.max_total_slots;
@@ -601,6 +608,9 @@ moe_bwd_kernel(
constexpr int kNumThreads = Config::kNumThreads;
constexpr int kCommNumStages = Config::kCommNumStages;
constexpr int kNC = Config::kNC;
constexpr int kGetBoxRowsBwd = Config::kCompute == 100
? liger::kGetBoxRowsBwdSm100
: liger::kGetBoxRowsBwdSm90;
// Target-based cross-CTA barrier — single instance per kernel call.
SyncThreadsCtaCounterBarrier pe_barrier(p.comm.pe_sync.cta_counter,
@@ -672,13 +682,23 @@ moe_bwd_kernel(
size_t offsets_region = sizeof(MoeBwdSmem<Traits1, Traits2T, Traits3, Traits4, Traits5, Config::kCompute>);
offsets_region = (offsets_region + sizeof(int) - 1) & ~(sizeof(int) - 1);
smem.comm.remote_offsets = reinterpret_cast<int*>(raw_smem + offsets_region);
size_t offsets_count =
(size_t)p.comm_bwd.num_pes * (p.comm_bwd.experts_per_pe + 1);
if (threadIdx.x == 0) {
smem.comm.remote_offsets =
reinterpret_cast<int*>(raw_smem + offsets_region);
smem.comm.remote_counts =
smem.comm.remote_offsets + offsets_count;
}
__syncthreads();
// Bwd TMA-GET bounce: 128-aligned region right after remote_offsets.
// Bwd TMA-GET bounce: 128-aligned region after offsets and counts.
// Mirrors the host smem sizing (align128(smem_mlp) + bounce). Only
// dereferenced when get_descs_bwd.enabled; harmless otherwise.
size_t bounce_off = offsets_region
+ (size_t)p.comm_bwd.num_pes * (p.comm_bwd.experts_per_pe + 1) * sizeof(int);
+ (offsets_count
+ (size_t)p.comm_bwd.num_pes * p.comm_bwd.experts_per_pe)
* sizeof(int);
bounce_off = (bounce_off + 127) & ~((size_t)127);
char* get_bounce = raw_smem + bounce_off;
@@ -737,7 +757,9 @@ moe_bwd_kernel(
if (is_comm_warp) {
if (smem.comm.total_tiles > 0) {
nvshmem_comm_main_bwd<Element, kTileM, kCommNumStages, kNC>(
nvshmem_comm_main_bwd<
Element, kTileM, kCommNumStages, kNC,
kGetBoxRowsBwd>(
smem.comm, p.comm_bwd, &get_descs_bwd, get_bounce);
nvshmem_quiet();
}
@@ -769,6 +791,7 @@ moe_bwd_kernel(
p.comm_bwd.dst_ready, p.comm_bwd.dst_consumed,
p.comm_bwd.tile_expert_ids_x,
p.comm_bwd.tile_expert_ids_dy,
p.comm_bwd.tile_valid_rows_x,
runtime_mlp_dims, mlp_bufs,
col, grid_x, split, runtime_nsplit, gemm_active);
}
@@ -799,10 +822,10 @@ moe_bwd_kernel(
// with the bwd's small box height. Returns false on encode failure → caller
// disables the bwd TMA-get path (falls back to getmem/int4).
static inline bool make_get_tma_map_bwd(CUtensorMap& m, void* base,
int hidden_dim, int n_rows) {
int hidden_dim, int n_rows, int box_rows) {
uint64_t gdim[2] = { (uint64_t)hidden_dim, (uint64_t)n_rows };
uint64_t gstride[1] = { (uint64_t)hidden_dim * sizeof(bfloat16_t) };
uint32_t bdim[2] = { (uint32_t)liger::kGetKChunk, (uint32_t)liger::kGetBoxRowsBwd };
uint32_t bdim[2] = { (uint32_t)liger::kGetKChunk, (uint32_t)box_rows };
uint32_t estride[2] = { 1, 1 };
CUresult r = cuTensorMapEncodeTiled(
&m, CU_TENSOR_MAP_DATA_TYPE_UINT16, 2, base, gdim, gstride, bdim, estride,
@@ -827,6 +850,17 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
const int top_k = a.top_k;
const nvshmem_team_t team = a.team;
cudaStream_t stream = a.stream;
cudaStreamCaptureStatus capture_status = cudaStreamCaptureStatusNone;
if (cudaError_t e = cudaStreamIsCapturing(stream, &capture_status);
e != cudaSuccess)
LIGER_FAIL_CUDA("moe_bwd: cudaStreamIsCapturing failed: ",
cudaGetErrorString(e));
if (capture_status == cudaStreamCaptureStatusNone) {
if (cudaError_t e = cudaStreamSynchronize(stream); e != cudaSuccess)
LIGER_FAIL_CUDA(
"moe_bwd: synchronizing the forward-to-backward NVSHMEM "
"handoff failed: ", cudaGetErrorString(e));
}
using Element = typename Config::Element;
using Traits1 = typename Config::Traits1;
@@ -862,24 +896,19 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
int num_sms;
cudaDeviceGetAttribute(&num_sms, cudaDevAttrMultiProcessorCount, a.device);
// Flat 1-D launch: use ALL SMs. Phase 1 + comm partition over the
// Flat 1-D launch: use the largest NC-complete SM subset. Phase 1 + comm partition over the
// GEMM-active subset n_gemm = floor_NS (largest multiple of static_nsplit ≤
// num_sms); Phase 2 (mlp3/mlp4) grid-strides over all num_blocks CTAs
// num_blocks); Phase 2 (mlp3/mlp4) grid-strides over all num_blocks CTAs
// (no divisibility needed — cell stride = num_blocks); the gap CTAs
// [n_gemm, num_blocks) fall through Phase 1/comm but still run Phase 2
// and every barrier. This decouples the Phase-1 runtime NS and Phase-2
// (NSplit2) CTA counts: e.g. NS4/NS2-8 on 132 SMs no longer rounds to
// 128 — Phase 1 gets 132 and Phase 2 gets 132.
int n_gemm = num_sms - num_sms % static_nsplit; // static seed floor_NS
int grid_x = n_gemm / static_nsplit; // initial Phase 1 column count
int num_blocks = num_sms;
// Even-grid handling for the SM100 2SM paired-CTA cluster path: a
// cudaLaunchKernelEx cluster launch requires gridDim.x to be an exact
// multiple of ClusterM so every CTA pairs off cleanly (no partial
// cluster at the tail). Rounds DOWN so num_blocks never exceeds the
// device's SM count. No-op (kClusterM == 1) for every 1SM config.
if constexpr (Config::kUsesTwoSm)
num_blocks -= num_blocks % Config::kClusterM;
// and every barrier. NC-complete launch geometry is required because comm
// ring lengths, signal arrays, and TMA descriptors all use gridDim.x / NC.
// ClusterM divides NC for every supported configuration, so this also
// guarantees complete SM100 CTA pairs.
static_assert(Config::kNC % Config::kClusterM == 0);
int num_blocks = num_sms - num_sms % Config::kNC;
int n_gemm = num_blocks - num_blocks % static_nsplit;
int grid_x = n_gemm / static_nsplit;
int max_runtime_grid_x = (num_blocks + 1) / 2; // min runtime NS candidate = 2
dim3 grid(num_blocks);
LIGER_CHECK(top_k <= kCombineMaxTopK,
@@ -944,6 +973,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
p.sort.sorted_token_ids = buf.sorted_token_ids;
p.sort.token_expert_slots = a.token_expert_slots;
p.sort.expert_offsets = local_expert_offsets;
p.sort.expert_counts = nullptr;
p.sort.tile_expert_ids = a.tile_expert_ids;
p.sort.cta_done = buf.cta_done;
p.sort.cta_sums = buf.cta_sums;
@@ -957,6 +987,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
p.comm.dst_ready = nullptr;
p.comm.dst_consumed = nullptr;
p.comm.expert_offsets = local_expert_offsets;
p.comm.expert_counts = nullptr;
p.comm.sorted_token_ids = buf.sorted_token_ids;
p.comm.local_tokens = reinterpret_cast<Element*>(a.x_sorted);
p.comm.local_output = buf.dx_sorted;
@@ -965,6 +996,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
// is a bwd-only mirror gated by release_dy).
p.comm.tile_expert_ids = buf.tile_expert_ids_x;
p.comm.all_expert_offsets = a.expert_offsets;
p.comm.all_expert_counts = a.expert_counts;
p.comm.pe_sync.cta_counter = buf.cta_counter;
p.comm.pe_sync.num_pes = num_pes;
p.comm.pe_sync.my_pe = my_pe;
@@ -986,6 +1018,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
p.comm_bwd.dst_consumed = buf.dst_consumed;
p.comm_bwd.tile_expert_ids_x = buf.tile_expert_ids_x;
p.comm_bwd.tile_expert_ids_dy = buf.tile_expert_ids_dy;
p.comm_bwd.tile_valid_rows_x = buf.tile_valid_rows_x;
// Cross-PE pull sources. Both x_sorted and dy_sorted are in the
// same global-expert-sorted layout on every PE:
// • x_sorted: forward's sort_tokens → dispatch wrote it.
@@ -999,6 +1032,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
p.comm_bwd.remote_dy = buf.dy_sorted;
p.comm_bwd.remote_dx = buf.dx_sorted;
p.comm_bwd.all_expert_offsets = a.expert_offsets;
p.comm_bwd.all_expert_counts = a.expert_counts;
p.comm_bwd.all_expert_offsets_stride = num_experts + 1;
p.comm_bwd.my_pe = my_pe;
p.comm_bwd.num_pes = num_pes;
@@ -1076,6 +1110,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
// `local_expert = tile.expert - local_expert_start` to index this PE's
// local all_B/all_C/all_A. Forward kernel does the same (moe.cu:469).
mlp_dims.local_expert_start = my_pe * experts_per_pe;
mlp_dims.num_pes = num_pes;
mlp_dims.experts_per_pe = experts_per_pe;
// Local pass: expert_for_k_block is built per-K-block by
// build_expert_for_k_block (one entry per Traits{3,4}::TileK), so the
@@ -1110,6 +1145,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
// moe_fused_bwd overrides these to the per-pipe staging arrays.
mlp_bufs.expert_for_k_block_mlp4 = buf.expert_for_k_block;
mlp_bufs.expert_for_k_block_mlp3 = buf.expert_for_k_block;
mlp_bufs.valid_rows_mlp4 = nullptr;
mlp_bufs.expert_k_starts = buf.expert_k_starts;
mlp_bufs.expert_k_ends = buf.expert_k_ends;
mlp_bufs.gmem_da = reinterpret_cast<Element const*>(a.dA);
@@ -1182,40 +1218,30 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
auto tma_store_z = make_tma_copy(TmaStoreAtom{},
make_tensor(make_gmem_ptr(buf.z_buf), make_shape(buf.scratch_rows, intermediate_dim),
make_stride(intermediate_dim, Int<1>{})),
typename Traits1::SmemLayoutStoreSlot{});
typename Traits1::SmemLayoutActStoreSlot{});
auto tma_store_u = make_tma_copy(TmaStoreAtom{},
make_tensor(make_gmem_ptr(buf.du_buf), make_shape(buf.scratch_rows, intermediate_dim),
make_stride(intermediate_dim, Int<1>{})),
typename Traits1::SmemLayoutStoreSlot{});
typename Traits1::SmemLayoutActStoreSlot{});
auto tma_store_v = make_tma_copy(TmaStoreAtom{},
make_tensor(make_gmem_ptr(buf.dv_buf), make_shape(buf.scratch_rows, intermediate_dim),
make_stride(intermediate_dim, Int<1>{})),
typename Traits1::SmemLayoutStoreSlot{});
typename Traits1::SmemLayoutActStoreSlot{});
auto tma_load_dy = make_tma_copy(TmaLoadAtom{},
make_tensor(make_gmem_ptr(pDY), make_shape(max_total_slots, hidden_dim),
make_stride(hidden_dim, Int<1>{})),
typename Traits2T::SmemLayoutZ_1{});
auto tma_load_a_col = [&]() {
if constexpr (Config::kCompute == 90) {
return make_tma_copy(TmaLoadAtom{},
make_tensor(make_gmem_ptr(pA),
make_shape(static_cast<int64_t>(intermediate_dim),
static_cast<int64_t>(hidden_dim),
static_cast<int64_t>(experts_per_pe)),
make_stride(
Int<1>{},
static_cast<int64_t>(intermediate_dim),
static_cast<int64_t>(hidden_dim) * intermediate_dim)),
typename Traits2T::SmemLayoutW_1{});
} else {
return make_tma_copy(TmaLoadAtom{},
make_tensor(make_gmem_ptr(pA),
make_shape(intermediate_dim, total_k_cols_2),
make_stride(Int<1>{}, intermediate_dim)),
typename Traits2T::SmemLayoutW_1{});
}
}();
auto tma_load_a_col = make_tma_copy(TmaLoadAtom{},
make_tensor(make_gmem_ptr(pA),
make_shape(static_cast<int64_t>(intermediate_dim),
static_cast<int64_t>(hidden_dim),
static_cast<int64_t>(experts_per_pe)),
make_stride(
Int<1>{},
static_cast<int64_t>(intermediate_dim),
static_cast<int64_t>(hidden_dim) * intermediate_dim)),
typename Traits2T::SmemLayoutW_1{});
// One TMA box per sub-tile; consumer issues NSub stores per outer N-tile.
auto tma_store_dz = make_tma_copy(TmaStoreAtom{},
make_tensor(make_gmem_ptr(buf.dz_buf),
@@ -1480,7 +1506,11 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
get_descs_bwd.enabled = 0;
get_descs_bwd.gpus_per_node = gpus_per_node;
get_descs_bwd.my_pe = my_pe;
size_t get_bounce_bytes_bwd = (size_t)liger::GetBounceBwd<Element>::kTotalBytes;
constexpr int kGetBoxRowsBwd = Config::kCompute == 100
? liger::kGetBoxRowsBwdSm100
: liger::kGetBoxRowsBwdSm90;
size_t get_bounce_bytes_bwd =
(size_t)liger::GetBounceBwd<Element, kGetBoxRowsBwd>::kTotalBytes;
{
// The single get warp's row band is TileM/NC; the small TMA box height
// must divide it (else the last band would over-read). Holds for NC≤8
@@ -1488,7 +1518,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
constexpr int kRowBandBwd = Config::kTileM / Config::kNC;
bool ok = (hidden_dim % liger::kGetKChunk == 0)
&& (gpus_per_node <= liger::kGetMaxPes)
&& (kRowBandBwd % liger::kGetBoxRowsBwd == 0);
&& (kRowBandBwd % kGetBoxRowsBwd == 0);
int host_start = (my_pe / gpus_per_node) * gpus_per_node;
for (int local_peer = 0; ok && local_peer < gpus_per_node; ++local_peer) {
int tp = host_start + local_peer;
@@ -1498,15 +1528,17 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
void* pdy_peer = nvshmem_ptr(p.comm_bwd.remote_dy, gpe); // peer dy_sorted
if (px_peer == nullptr || pdy_peer == nullptr) { ok = false; break; }
ok = make_get_tma_map_bwd(get_descs_bwd.src_x_desc[local_peer], px_peer,
hidden_dim, max_total_slots);
hidden_dim, max_total_slots, kGetBoxRowsBwd);
if (ok) ok = make_get_tma_map_bwd(get_descs_bwd.src_dy_desc[local_peer], pdy_peer,
hidden_dim, max_total_slots);
hidden_dim, max_total_slots, kGetBoxRowsBwd);
}
if (ok) ok = make_get_tma_map_bwd(get_descs_bwd.dst_x_staging_desc,
buf.x_staging, hidden_dim, remote_total_rows);
buf.x_staging, hidden_dim, remote_total_rows, kGetBoxRowsBwd);
if (ok) ok = make_get_tma_map_bwd(get_descs_bwd.dst_dy_staging_desc,
buf.dy_staging, hidden_dim, remote_total_rows);
buf.dy_staging, hidden_dim, remote_total_rows, kGetBoxRowsBwd);
get_descs_bwd.enabled = ok ? 1 : 0;
if (const char* e = std::getenv("LIGER_GET_TMA"))
if (e[0] == '0') get_descs_bwd.enabled = 0;
}
// ── Smem sizing ─────────────────────────────────────────────────
@@ -1516,6 +1548,7 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
size_t smem_mlp = sizeof(MoeBwdSmem<Traits1, Traits2T, Traits3, Traits4, Traits5, Config::kCompute>);
smem_mlp = (smem_mlp + sizeof(int) - 1) & ~(sizeof(int) - 1);
smem_mlp += num_pes * (experts_per_pe + 1) * sizeof(int); // remote_offsets
smem_mlp += num_pes * experts_per_pe * sizeof(int); // remote_counts
// Query the device's actual opt-in dynamic-smem cap rather than trust
// Config::kSmemBudget's compile-time 228 KiB constant: the 2SM paired-CTA
@@ -1604,42 +1637,24 @@ moe_bwd_fwd_bf16(const MoeBwdArgs& a, int static_nsplit) {
// for K-blocks that straddle an expert boundary (see the
// build_expert_for_k_block comment for the alignment assumption).
cudaMemsetAsync(buf.dy_sorted, 0, static_cast<size_t>(max_total_slots) * hidden_dim * sizeof(Element), stream);
// dx_sorted: write-only buffer for routed slots — Phase 1d writes valid
// tiles, comm-warp dX put writes remote-routed slots, dispatch_tokens_bwd
// reads routed slots only via token_expert_slots. Padding rows are never
// read so they don't need pre-zero'ing.
//
// x_staging / dy_staging: comm warps fill the slots THIS CTA fetches;
// unfetched slots are gated out by tile_expert_ids_x/dy = -1 (the 0xff
// memset below), and the RemoteIter only iterates per_cta_tiles so Phase
// 1 never reads unfetched slots either. Stale prev-call contents are
// inert under both bounds checks.
//
// du_buf / dv_buf / dz_buf / z_buf: Phase 1 writes the full TileM rows
// of every tile the local-expert pass / staging-ring iterates over;
// Phase 2 mlp{3,4} read at K-block granularity and bounds-check via
// expert_for_k_block (build_expert_for_k_block stamps -1 past
// num_actual_k_blocks, and the remote pass aliases tile_expert_ids).
// Fake K-blocks are skipped → any stale slot from a previous call is
// inert.
//
// Total: ~2.5 GB of per-call memset bandwidth (4× intermediate_bytes +
// 2× stage_bytes + 1× symm_slot_bytes for dx_sorted) eliminated. The
// 0xff sentinel fill of tile_expert_ids_{x,dy} below is what makes
// these drops safe — keep that.
size_t intermediate_bytes =
static_cast<size_t>(buf.scratch_rows) * intermediate_dim * sizeof(Element);
cudaMemsetAsync(buf.z_buf, 0, intermediate_bytes, stream);
cudaMemsetAsync(buf.du_buf, 0, intermediate_bytes, stream);
cudaMemsetAsync(buf.dv_buf, 0, intermediate_bytes, stream);
cudaMemsetAsync(buf.dz_buf, 0, intermediate_bytes, stream);
// Sentinel-fill BOTH comm-side tile_expert_ids arrays so unfetched
// slots produce expert_id = -1, which the Phase 3/4 bounds check
// rejects. Without this, stale memory could land in [0, experts_per_pe)
// and trigger spurious dB/dC/dA writes for empty staging slots. This
// 0xff fill is also what lets us drop the x_staging / dy_staging /
// du_buf / dv_buf / dz_buf / z_buf memsets above.
// and trigger spurious dB/dC/dA writes for empty staging slots.
size_t comm_eid_bytes =
static_cast<size_t>(comm_l_local) * sizeof(int);
if (cudaError_t e = cudaMemsetAsync(buf.tile_expert_ids_x, 0xff, comm_eid_bytes, stream); e != cudaSuccess)
LIGER_FAIL_CUDA("moe_bwd: cudaMemsetAsync(tile_expert_ids_x) failed: ", cudaGetErrorString(e));
if (cudaError_t e = cudaMemsetAsync(buf.tile_expert_ids_dy, 0xff, comm_eid_bytes, stream); e != cudaSuccess)
LIGER_FAIL_CUDA("moe_bwd: cudaMemsetAsync(tile_expert_ids_dy) failed: ", cudaGetErrorString(e));
cudaMemsetAsync(buf.tile_valid_rows_x, 0, comm_eid_bytes, stream);
if (cudaError_t e = cudaGetLastError(); e != cudaSuccess)
LIGER_FAIL_CUDA("moe_bwd: CUDA error before kernel launch: ", cudaGetErrorString(e));
@@ -1735,25 +1750,26 @@ moe_bwd_fwd_bf16_tuned(const MoeBwdArgs& a, int static_nsplit) {
// divisibility constraint — only requirement is that NC evenly divides
// gridDim.x · gridDim.y so MC is integer (e.g. NS=6, NC=4: MC = 22·6/4
// = 33).
// COMM tile FIXED at 128 (NC=4) for every config — uniform across PEs so the
// all-to-all dispatch padding (tile_expert_ids / x_sorted / expert_offsets)
// aligns. `TileM` is purely the Phase-1 GEMM-tile knob (flows to GemmTileM,
// default == TileM): a "TM64" bwd config = comm128/gemm64.
// Both architectures use CommTileM=128/NC4, matching forward metadata.
using CommGeometry = MoeCommGeometry<Compute>;
static constexpr int kPhase1TileM = Compute == 100 ? 128 : GemmTileM;
static constexpr int kSubBatch = 2;
using Config = MoeBwdConfig<
NSplit2,
GemmTileM, TileN1, TileK1, Stages1, EpiChunkN1, // Phase 1a (mlp1_act) — GEMM tile
kPhase1TileM, TileN1, TileK1, Stages1, EpiChunkN1, // Phase 1a (mlp1_act) — GEMM tile
/*TileN2=*/256, TileK1, Stages1, // Phase 1b' (Mlp2TTraits caps TileN ≤ 256)
/*TileM2T=*/GemmTileM, // Phase 1b' GEMM tile
/*TileM2T=*/kPhase1TileM, // Phase 1b' GEMM tile
TileM3, TileN3, TileK3, Stages3, // Phase 2 mlp3
TileN3, TileM3, TileK3, Stages3, // Phase 2 mlp4 (mlp3/mlp4 swap; cooperative)
GemmTileM, 256, TileK1, Stages1, // Phase 1d mlp5 — GEMM tile
kPhase1TileM, 256, TileK1, Stages1, // Phase 1d mlp5 — GEMM tile
EpiChunkN25, // shared mlp2_t + mlp5
EpiChunkN34, // shared mlp3 + mlp4
bfloat16_t,
CommNumStages,
/*NC_=*/4,
/*SubBatch_=*/2,
/*CommTileM_=*/128, // comm tile fixed at 128
CommNumStages * CommGeometry::RingStageScale
+ CommGeometry::RingStageExtra,
/*NC_=*/CommGeometry::NC,
/*SubBatch_=*/kSubBatch,
/*CommTileM_=*/CommGeometry::TileM,
/*Compute_=*/Compute>;
moe_bwd_fwd_bf16<Config>(a, static_nsplit);
}
@@ -1938,10 +1954,8 @@ static bool find_nearest_tuned_bwd(int compute, int TK, int TKE, int D, int I,
double lI = std::log((double)I);
for (int i = 0; i < table_n; ++i) {
TunedConfigBwd c = project_bwd(table[i], compute);
// No fwd/bwd TileM match required: the comm tile is fixed at 128 for
// both directions, so tile_expert_ids / x_sorted / expert_offsets align
// regardless of each direction's GEMM tile. (fwd_tile_m retained for ABI
// but no longer constrains the bwd GEMM-tile choice.)
// Forward and backward select the same architecture-specific comm tile
// (M128 on both architectures), independent of the tuned GEMM tile.
(void)fwd_tile_m;
if (!tuned_config_valid_bwd(D, I, c)) continue;
// Guard against TKE=0 in legacy rows (would yield -inf in log).
@@ -1992,7 +2006,6 @@ void moe_bwd_dispatch(const MoeBwdArgs& a, int fwd_tile_m) {
// Keep backward lookup consistent with forward for tiny token batches.
const int TKE = std::max(1, TK / E_local);
const int compute = moe_detect_compute_dispatch_key(a.device, "moe_fused_bwd_bf16_auto");
if (const char* s = std::getenv("LIGER_MOE_BWD_FORCE_CONFIG")) {
TunedConfigBwd tc{};
tc.Compute = compute;
@@ -2019,8 +2032,8 @@ void moe_bwd_dispatch(const MoeBwdArgs& a, int fwd_tile_m) {
tc.TileM = vals[12];
tc.GemmTileM = (n == 14) ? vals[13] : tc.TileM;
if (tc.GemmTileM <= 0) tc.GemmTileM = tc.TileM; // omitted → gemm == comm
// No fwd/bwd TileM match check: comm tile is fixed at 128 for both
// directions, so the sort/dispatch alignment holds for any GEMM tile.
// The wrapper selects the architecture-specific comm tile consistently
// with forward; the parsed TileM remains the GEMM tuning field.
(void)fwd_tile_m;
const DispatchEntryBwd* de = find_dispatch_entry_bwd(tc);
LIGER_CHECK(de != nullptr,
@@ -41,8 +41,8 @@ struct MoeBwdSmem {
template <typename Traits1, typename Traits2T, typename Traits3,
typename Traits4, typename Traits5,
int CommNumStages, int NSplit2, int SubBatch,
// SubTiles = CommTileM / GemmTileM ∈ {1,2}. >1 → Phase-1 (mlp1a/mlp2t/
// silu/mlp5) steps through SubTiles GemmTileM-row sub-tiles per 128-wide
// SubTiles = CommTileM / GemmTileM. >1 → Phase-1 (mlp1a/mlp2t/
// silu/mlp5) steps through SubTiles GemmTileM-row sub-tiles per
// comm staging slot; the mlp3/4 ratios use Traits1::TileM (= GemmTileM).
int SubTiles,
int Compute = 90,
@@ -107,6 +107,7 @@ __device__ __forceinline__ void moe_fused_bwd(
// when release_src has already let comm refill the X-pipe array.
const int* remote_tile_expert_ids_x,
const int* remote_tile_expert_ids_dy,
const int* remote_tile_valid_rows_x,
// Dims + buffers
const MlpBwdDims& dims,
const MlpBwdBufs<typename Traits1::Element>& bufs,
@@ -137,6 +138,7 @@ __device__ __forceinline__ void moe_fused_bwd(
// (mirrors RemoteMlpTileIterator's init in moe.cuh).
iter.init_remote(
remote_tile_expert_ids_x,
remote_tile_valid_rows_x,
smem.comm.per_cta_tiles,
col,
dims.n_gemm,
@@ -167,13 +169,12 @@ __device__ __forceinline__ void moe_fused_bwd(
MlpBwdBufs<typename Traits1::Element> remote_bufs = bufs;
remote_bufs.expert_for_k_block_mlp4 = remote_tile_expert_ids_x;
remote_bufs.expert_for_k_block_mlp3 = remote_tile_expert_ids_dy;
remote_bufs.valid_rows_mlp4 = remote_tile_valid_rows_x;
// Volatile load: written by warp 2 of this CTA in nvshmem_comm_prologue_bwd
// then made visible via __syncthreads() in moe_bwd_kernel. Without volatile
// the compiler may hoist above the syncthreads, returning a stale 0 →
// multi-PE deadlock (this CTA skips remote while peers wait at the
// remote-pass mlp_global_barrier).
bool remote_active = (*reinterpret_cast<int volatile*>(&smem.comm.global_total) != 0);
// Grid-uniform activity predicate. The unified path stages local tiles even
// at world size one, so every valid non-empty launch is active.
bool remote_active =
(dims.num_pes > 0) && (dims.num_tokens > 0);
// The remote staging ring (L = MC·CommNumStages tiles, MC = n_gemm/NC) is a
// STREAMING buffer: when global_total > L it wraps and physical slots are
@@ -190,9 +191,9 @@ __device__ __forceinline__ void moe_fused_bwd(
// mlp_fused_bwd_dual drives. Only the staging-ring (remote) TMAs and dims/bufs
// are passed; the weight/intermediate descriptors are shared across all tiles.
// efkb_stride maps a (GemmTileM-granular) Phase-2 K-block to its parent
// COMM-tile slot in tile_expert_ids (which the comm warps emit one-per-128).
// COMM-tile slot in tile_expert_ids (which the comm warps emit once per slot).
// = CommTileM/TileK = Traits1::TileM·SubTiles/Traits4::TileK. The integer
// division floors each gemm sub-tile to its parent 128-slot's expert (the
// division floors each GEMM sub-tile to its parent communication slot's expert (the
// interpolation). SubTiles=1 → Traits1::TileM/TileK, unchanged.
constexpr int kEfkbStride4Remote = Traits1::TileM * SubTiles / Traits4::TileK;
mlp_fused_bwd_dual<
@@ -0,0 +1,45 @@
#pragma once
namespace liger {
template <int Compute>
struct MoeCommGeometry;
template <>
struct MoeCommGeometry<90> {
static constexpr int TileM = 128;
static constexpr int NC = 4;
static constexpr int RingStageScale = 1;
static constexpr int RingStageExtra = 0;
};
template <>
struct MoeCommGeometry<100> {
static constexpr int TileM = 128;
static constexpr int NC = 4;
static constexpr int RingStageScale = 1;
static constexpr int RingStageExtra = 0;
};
inline constexpr int kMaxMoeCommTileM =
MoeCommGeometry<100>::TileM > MoeCommGeometry<90>::TileM
? MoeCommGeometry<100>::TileM
: MoeCommGeometry<90>::TileM;
inline constexpr int kMaxMoeTunedCommStages = 8;
inline constexpr int kMaxMoeCommStagesSm90 =
kMaxMoeTunedCommStages * MoeCommGeometry<90>::RingStageScale
+ MoeCommGeometry<90>::RingStageExtra;
inline constexpr int kMaxMoeCommStagesSm100 =
kMaxMoeTunedCommStages * MoeCommGeometry<100>::RingStageScale
+ MoeCommGeometry<100>::RingStageExtra;
inline constexpr int kMaxMoeCommStages =
kMaxMoeCommStagesSm100 > kMaxMoeCommStagesSm90
? kMaxMoeCommStagesSm100
: kMaxMoeCommStagesSm90;
static_assert(
MoeCommGeometry<90>::TileM % MoeCommGeometry<90>::NC == 0);
static_assert(
MoeCommGeometry<100>::TileM % MoeCommGeometry<100>::NC == 0);
} // namespace liger
@@ -17,11 +17,9 @@
// the canonical joined 256x256 shape, while the existing S3, EN34, and TK3
// fields tune both kernels together.
#define LIGER_MOE_BWD_TUNE_CONFIGS_SM100(X) \
X(2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128) \
X(2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128) \
X(8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128) \
X(2, 128, 64, 4, 256, 256, 64, 6, 32, 64, 64, 2, 128) \
X(2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 128, 2, 128)
X(2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128) \
X(2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128) \
X(8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128)
#define LIGER_MOE_BWD_EXTRA_CONFIGS_SM100(XG)
@@ -9,7 +9,7 @@
// n_pes is the tuning-time PE count;
// deployment lookup should compute TKE the same way.
// Each row pairs the best fwd template with the best bwd template for
// that shape. The COMM tile is fixed at 128 for both directions;
// that shape. The architecture-specific COMM tile matches in both directions;
// Fwd_TileM / Bwd_TileM are the per-direction GEMM tiles and may differ.
// Written incrementally; a partial file means the tuner crashed.
@@ -18,384 +18,443 @@
namespace liger {
static const TunedConfigFwdBwd kTunedConfigsMultiSm100[] = {
{512, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.213747f, 0.60089f, 0.814637f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.213926f, 0.600659f, 0.814586f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.215885f, 0.602304f, 0.818189f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.222106f, 0.641389f, 0.863494f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238598f, 0.738208f, 0.976806f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.264806f, 0.82416f, 1.08897f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.213299f, 0.607366f, 0.820666f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.214483f, 0.607846f, 0.82233f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.219245f, 0.608019f, 0.827264f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.230182f, 0.681306f, 0.911488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238042f, 0.708742f, 0.946784f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.275379f, 0.898445f, 1.17382f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.216307f, 0.6128f, 0.829107f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.217069f, 0.613133f, 0.830202f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.223283f, 0.64311f, 0.866394f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.240563f, 0.737152f, 0.977715f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.266451f, 0.885702f, 1.15215f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.300384f, 1.05434f, 1.35473f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.225574f, 0.65417f, 0.879744f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.22439f, 0.654656f, 0.879046f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.230758f, 0.66983f, 0.900589f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.25904f, 0.805952f, 1.06499f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.28208f, 0.896749f, 1.17883f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.340154f, 1.11456f, 1.45471f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.226726f, 0.675565f, 0.902291f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.226528f, 0.675706f, 0.902234f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.239693f, 0.706854f, 0.946547f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.277338f, 0.81559f, 1.09293f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.323507f, 0.985568f, 1.30908f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.362842f, 1.28205f, 1.64489f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238758f, 0.716832f, 0.95559f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238534f, 0.71863f, 0.957165f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.257331f, 0.790752f, 1.04808f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.302573f, 0.924448f, 1.22702f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.330758f, 1.11185f, 1.44261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.429133f, 1.63354f, 2.06268f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2544f, 0.808954f, 1.06335f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.253114f, 0.809069f, 1.06218f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.290522f, 0.852243f, 1.14276f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.34439f, 1.04163f, 1.38602f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.399219f, 1.24678f, 1.646f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.5584f, 1.77544f, 2.33384f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.27321f, 0.861344f, 1.13455f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.272794f, 0.863539f, 1.13633f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.327488f, 0.995117f, 1.3226f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.399776f, 1.17318f, 1.57295f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.482931f, 1.55891f, 2.04184f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.689562f, 2.18328f, 2.87284f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.308806f, 1.00524f, 1.31405f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.307117f, 1.00509f, 1.3122f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.394221f, 1.29259f, 1.68681f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.496083f, 1.54933f, 2.04541f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.601299f, 1.9268f, 2.5281f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.995091f, 3.21316f, 4.20825f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.346182f, 1.20886f, 1.55504f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.350566f, 1.20911f, 1.55968f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.439744f, 1.48775f, 1.92749f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.580192f, 1.90202f, 2.48221f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.710131f, 2.27458f, 2.98471f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.22605f, 3.21896f, 4.445f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.413843f, 1.40611f, 1.81995f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.418605f, 1.41544f, 1.83404f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.558554f, 1.81075f, 2.3693f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.773997f, 2.34568f, 3.11967f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.01174f, 3.08073f, 4.09247f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.80307f, 5.43617f, 7.23923f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.54928f, 1.84084f, 2.39012f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.556224f, 1.85021f, 2.40644f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.861222f, 2.49071f, 3.35193f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.17681f, 3.53585f, 4.71266f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.71146f, 5.21627f, 6.92772f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.18394f, 9.86162f, 13.0456f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.640614f, 2.25546f, 2.89608f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.655584f, 2.27194f, 2.92753f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.953478f, 2.88751f, 3.84099f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.30244f, 3.98592f, 5.28836f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.07547f, 6.23786f, 8.31333f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.41807f, 9.98637f, 13.4044f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.930528f, 3.09283f, 4.02336f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.955616f, 3.14399f, 4.0996f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.52775f, 4.34145f, 5.8692f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.22937f, 6.5366f, 8.76596f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.29908f, 9.35126f, 12.6503f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 6.45879f, 18.1805f, 24.6393f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.50225f, 4.86737f, 6.36961f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.56006f, 4.99713f, 6.55719f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.40227f, 7.42001f, 9.82228f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.88128f, 11.9842f, 15.8655f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 6.49101f, 18.534f, 25.025f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 12.8706f, 34.2043f, 47.0748f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.230829f, 0.60599f, 0.836819f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.2312f, 0.606842f, 0.838042f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.230963f, 0.606778f, 0.837741f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.238227f, 0.664243f, 0.90247f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.259462f, 0.768883f, 1.02835f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.278944f, 0.836211f, 1.11516f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.231994f, 0.621242f, 0.853235f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.232461f, 0.621773f, 0.854234f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.231859f, 0.623309f, 0.855168f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.244454f, 0.691597f, 0.936051f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.270874f, 0.82055f, 1.09142f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.28992f, 0.921882f, 1.2118f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.238106f, 0.652006f, 0.890112f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238035f, 0.653018f, 0.891053f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238618f, 0.65232f, 0.890938f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.256506f, 0.75872f, 1.01523f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.289914f, 0.89161f, 1.18152f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.316077f, 1.0592f, 1.37528f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.246835f, 0.672384f, 0.919219f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.247091f, 0.671821f, 0.918912f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.246509f, 0.672192f, 0.918701f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.275091f, 0.826669f, 1.10176f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.312704f, 0.907968f, 1.22067f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.35513f, 1.11693f, 1.47206f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.256979f, 0.718464f, 0.975443f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.256454f, 0.718675f, 0.97513f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.256256f, 0.722797f, 0.979053f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.295328f, 0.909408f, 1.20474f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.350886f, 0.987501f, 1.33839f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.411821f, 1.30524f, 1.71706f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.276128f, 0.814707f, 1.09084f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.27591f, 0.813523f, 1.08943f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.27536f, 0.817773f, 1.09313f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.327494f, 1.03512f, 1.36261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.401139f, 1.24911f, 1.65025f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.44713f, 1.65037f, 2.0975f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.312691f, 0.884538f, 1.19723f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.312051f, 0.886195f, 1.19825f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.313696f, 0.887386f, 1.20108f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.365088f, 1.11848f, 1.48356f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.447443f, 1.36129f, 1.80873f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.592256f, 1.79649f, 2.38875f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.34784f, 1.04492f, 1.39276f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.34743f, 1.04786f, 1.39529f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.349587f, 1.0489f, 1.39848f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.415744f, 1.25929f, 1.67503f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.53399f, 1.62768f, 2.16167f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.716486f, 2.25208f, 2.96857f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.420576f, 1.30209f, 1.72266f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.419194f, 1.3057f, 1.7249f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.422502f, 1.31006f, 1.73256f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.527059f, 1.66701f, 2.19407f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.704915f, 2.28874f, 2.99365f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.09348f, 3.49916f, 4.59264f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.474464f, 1.47898f, 1.95344f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.476134f, 1.48268f, 1.95882f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.486387f, 1.48512f, 1.97151f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.601299f, 1.978f, 2.5793f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.857382f, 2.37448f, 3.23186f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.16615f, 3.61879f, 4.78494f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.622138f, 1.88671f, 2.50885f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.625498f, 1.8877f, 2.5132f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.635744f, 1.90026f, 2.53601f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.814246f, 2.51696f, 3.33121f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.21653f, 3.69624f, 4.91277f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.82113f, 5.72392f, 7.54505f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.905683f, 2.70927f, 3.61496f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.911898f, 2.71977f, 3.63167f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.934042f, 2.77613f, 3.71018f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.27626f, 3.98502f, 5.26127f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.99341f, 6.23721f, 8.23062f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.2414f, 10.1021f, 13.3434f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.01412f, 3.12611f, 4.14023f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.02779f, 3.1376f, 4.16539f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.05455f, 3.17472f, 4.22927f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.40672f, 4.2659f, 5.67262f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.17643f, 6.63829f, 8.81472f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.60995f, 10.6771f, 14.2871f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.62721f, 4.85183f, 6.47903f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.655f, 4.87766f, 6.53265f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.6939f, 5.05337f, 6.74727f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.45157f, 7.25069f, 9.70226f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.96707f, 11.7518f, 15.7189f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 6.88489f, 19.8207f, 26.7056f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.88209f, 8.41804f, 11.3001f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.94429f, 8.58742f, 11.5317f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.02152f, 9.18437f, 12.2059f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.38886f, 13.4462f, 17.8351f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 7.63245f, 22.0838f, 29.7162f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 12.9417f, 37.7724f, 50.7141f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.265894f, 0.680653f, 0.946547f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.26681f, 0.680922f, 0.947731f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.266112f, 0.680013f, 0.946125f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.265741f, 0.687859f, 0.9536f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.284723f, 0.805453f, 1.09018f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.320634f, 0.94425f, 1.26488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.271219f, 0.697805f, 0.969024f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.272147f, 0.698554f, 0.970701f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.272256f, 0.698573f, 0.970829f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.270611f, 0.705043f, 0.975654f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.293152f, 0.82327f, 1.11642f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.337741f, 1.0217f, 1.35944f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.286202f, 0.747891f, 1.03409f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.286778f, 0.748115f, 1.03489f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.285946f, 0.748083f, 1.03403f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.28416f, 0.753626f, 1.03779f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.314886f, 0.916922f, 1.23181f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.372864f, 1.15762f, 1.53048f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.302682f, 0.78041f, 1.08309f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.302701f, 0.780486f, 1.08319f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.300806f, 0.780832f, 1.08164f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.302163f, 0.790931f, 1.09309f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.339808f, 0.929344f, 1.26915f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.419821f, 1.17443f, 1.59425f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.319437f, 0.859514f, 1.17895f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.318675f, 0.863347f, 1.18202f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.318368f, 0.862157f, 1.18052f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.319923f, 0.871949f, 1.19187f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.393549f, 1.03839f, 1.43194f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.463181f, 1.32989f, 1.79307f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.349658f, 1.04023f, 1.38989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.350752f, 1.04095f, 1.39171f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.349702f, 1.04639f, 1.3961f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.351072f, 1.04958f, 1.40065f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.445741f, 1.31281f, 1.75855f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.542374f, 1.76484f, 2.30722f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.412659f, 1.15776f, 1.57042f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.412589f, 1.15752f, 1.57011f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.415309f, 1.16478f, 1.58009f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.424685f, 1.17603f, 1.60071f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.508845f, 1.42831f, 1.93716f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.661926f, 1.72979f, 2.39172f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.482598f, 1.48271f, 1.96531f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.482464f, 1.48303f, 1.9655f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.485741f, 1.49244f, 1.97818f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.494144f, 1.50429f, 1.99843f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.613389f, 1.84075f, 2.45414f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.824794f, 2.5705f, 3.3953f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.634778f, 2.05928f, 2.69406f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.636627f, 2.06063f, 2.69726f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.636589f, 2.06321f, 2.6998f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.648448f, 2.08675f, 2.73519f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.826989f, 2.65636f, 3.48335f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.22142f, 3.90534f, 5.12676f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.732902f, 2.16118f, 2.89408f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.709587f, 2.16616f, 2.87574f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.719373f, 2.16716f, 2.88653f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.728205f, 2.20143f, 2.92963f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.00398f, 2.73126f, 3.73524f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.48755f, 3.90084f, 5.38839f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.00466f, 3.09745f, 4.10211f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.00483f, 3.09399f, 4.09882f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.02208f, 3.10696f, 4.12904f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.03978f, 3.15772f, 4.19749f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.42629f, 4.51465f, 5.94094f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.24326f, 6.98008f, 9.22334f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.61773f, 5.04122f, 6.65896f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.62207f, 5.07951f, 6.70157f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.64892f, 5.18264f, 6.83156f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.70089f, 5.27215f, 6.97304f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.37702f, 8.03691f, 10.4139f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.88886f, 12.3809f, 16.2697f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.76998f, 5.34197f, 7.11195f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.78164f, 5.37801f, 7.15965f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.81096f, 5.50186f, 7.31282f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.87347f, 5.67375f, 7.54722f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.52469f, 8.23703f, 10.7617f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.19889f, 12.7926f, 16.9915f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.0698f, 9.47468f, 12.5445f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.09749f, 9.60682f, 12.7043f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.14123f, 9.77014f, 12.9114f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.22658f, 10.1559f, 13.3825f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.92404f, 14.4265f, 19.3505f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 7.65665f, 23.2579f, 30.9146f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.59987f, 18.2599f, 23.8597f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.71996f, 17.9923f, 23.7123f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.77078f, 18.3543f, 24.1251f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.97734f, 18.8939f, 24.8713f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 9.70814f, 28.4522f, 38.1603f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 16.0916f, 46.9059f, 62.9975f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.783347f, 2.41108f, 3.19443f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.00726f, 3.18438f, 4.19164f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.14415f, 3.44627f, 4.59042f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.22646f, 6.53548f, 8.76195f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.685862f, 2.24368f, 2.92954f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.45402f, 3.61235f, 5.06636f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.5255f, 3.89432f, 5.41982f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.62836f, 5.03352f, 6.66188f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.28463f, 6.83313f, 9.11776f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.01187f, 3.21576f, 4.22763f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.16278f, 6.15741f, 8.32019f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.23393f, 6.53382f, 8.76775f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.56522f, 8.34846f, 10.9137f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.86225f, 8.8255f, 11.6877f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.54449f, 3.9145f, 5.45899f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.10108f, 11.9035f, 16.0046f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.08715f, 12.2772f, 16.3644f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.3216f, 12.9363f, 17.2579f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.76081f, 14.7075f, 19.4683f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.24406f, 6.48324f, 8.7273f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.941536f, 2.8339f, 3.77544f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.12862f, 3.76447f, 4.89309f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.40778f, 4.27765f, 5.68542f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.62985f, 8.3503f, 10.9802f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.964186f, 2.81217f, 3.77635f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.3811f, 4.30011f, 5.68121f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.81411f, 5.70335f, 7.51745f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.93951f, 6.27425f, 8.21377f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.74379f, 8.5935f, 11.3373f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.77131f, 5.45402f, 7.22533f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.61118f, 8.22252f, 10.8337f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.16113f, 9.95123f, 13.1124f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.08026f, 10.5614f, 13.6417f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.91874f, 13.1133f, 17.032f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.62013f, 8.11732f, 10.7375f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.09221f, 16.4977f, 21.5899f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.15354f, 16.4858f, 21.6393f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.55996f, 18.1025f, 23.6625f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 6.2207f, 21.7718f, 27.9925f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.1475f, 16.7176f, 21.8651f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.47891f, 4.16681f, 5.64572f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.84607f, 5.70346f, 7.54952f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.279f, 6.95076f, 9.22976f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.35698f, 13.76f, 18.1169f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.47431f, 4.25741f, 5.73173f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.04811f, 7.36039f, 10.4085f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.25246f, 8.05766f, 11.3101f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.27953f, 9.77864f, 13.0582f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.48801f, 14.3381f, 18.8261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.045f, 7.44241f, 10.4874f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.55274f, 13.003f, 17.5558f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.92627f, 14.0711f, 18.9974f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.72436f, 17.8316f, 23.5559f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 7.59782f, 20.1208f, 27.7186f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.47673f, 12.9529f, 17.4296f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.93621f, 25.4584f, 34.3946f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 9.04927f, 26.3695f, 35.4187f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 9.9313f, 29.5409f, 39.4722f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 11.1844f, 32.0272f, 43.2116f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.8536f, 25.473f, 34.3266f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.518925f, 1.55748f, 2.0764f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.545485f, 1.57915f, 2.12463f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.532544f, 1.57155f, 2.1041f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.70407f, 2.14577f, 2.84984f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.543021f, 1.5889f, 2.13192f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 2048, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.999814f, 2.9244f, 3.92421f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.705421f, 2.14006f, 2.84548f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 4096, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.37325f, 4.24061f, 5.61386f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.00662f, 2.75263f, 3.75926f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.06647f, 2.81228f, 3.87875f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.03005f, 2.78997f, 3.82003f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.38676f, 3.81485f, 5.20162f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.06666f, 2.82915f, 3.8958f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 2048, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.95564f, 5.63432f, 7.58995f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.40307f, 3.84635f, 5.24942f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 4096, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.28755f, 9.66229f, 12.9498f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.796486f, 2.01171f, 2.8082f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 32, 2048, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.44157f, 3.34f, 4.78157f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.827424f, 2.03738f, 2.86481f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.802547f, 2.02864f, 2.83119f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 64, 2048, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.42263f, 3.36265f, 4.78528f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.847622f, 2.0797f, 2.92732f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.82537f, 2.04788f, 2.87325f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.44335f, 3.38927f, 4.83263f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 1024, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.13277f, 2.74237f, 3.87514f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.855014f, 2.08408f, 2.93909f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.45035f, 3.43224f, 4.88259f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 2048, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.61263f, 4.07782f, 5.69044f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.13249f, 3.06005f, 4.19254f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 32, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.97889f, 5.30378f, 7.28267f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.17061f, 3.09137f, 4.26198f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.14524f, 3.07064f, 4.21588f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.97374f, 5.3206f, 7.29434f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.19825f, 3.15937f, 4.35763f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.17772f, 3.12457f, 4.30229f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 128, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.01258f, 5.35931f, 7.37189f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 1024, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.676f, 4.22019f, 5.89619f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.21618f, 3.16188f, 4.37805f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 256, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.06472f, 5.42371f, 7.48843f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 2048, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.32021f, 6.36687f, 8.68708f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.38077f, 3.88584f, 5.26661f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 32, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.66428f, 6.83492f, 9.4992f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.39587f, 3.91796f, 5.31382f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 64, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.52569f, 6.86408f, 9.38977f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.43503f, 3.96092f, 5.39595f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 128, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.55377f, 6.90422f, 9.45799f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.4885f, 4.02579f, 5.51429f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 256, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.64196f, 6.9867f, 9.62866f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.170144f, 0.623744f, 0.793888f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.172608f, 0.620704f, 0.793312f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.174688f, 0.623904f, 0.798592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.1824f, 0.648032f, 0.830432f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.186912f, 0.680224f, 0.867136f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.231744f, 0.821472f, 1.05322f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.17184f, 0.623712f, 0.795552f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.169632f, 0.627104f, 0.796736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.177664f, 0.6312f, 0.808864f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.18544f, 0.666432f, 0.851872f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.194656f, 0.709184f, 0.90384f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.246592f, 0.882432f, 1.12902f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.169536f, 0.644288f, 0.813824f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.174496f, 0.644448f, 0.818944f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.177664f, 0.66096f, 0.838624f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.201152f, 0.731584f, 0.932736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.211392f, 0.7928f, 1.00419f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.277312f, 1.05667f, 1.33398f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.17904f, 0.666784f, 0.845824f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.182848f, 0.665216f, 0.848064f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.187744f, 0.670368f, 0.858112f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.219264f, 0.751904f, 0.971168f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.245952f, 0.835744f, 1.0817f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.304f, 1.06918f, 1.37318f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.180512f, 0.678496f, 0.859008f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.183168f, 0.679808f, 0.862976f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.198912f, 0.717184f, 0.916096f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2176f, 0.816384f, 1.03398f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.267296f, 0.94608f, 1.21338f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.335264f, 1.27805f, 1.61331f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.186176f, 0.715168f, 0.901344f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.191552f, 0.737472f, 0.929024f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.213408f, 0.793472f, 1.00688f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.25856f, 0.95824f, 1.2168f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.304064f, 1.12541f, 1.42947f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.403584f, 1.64685f, 2.05043f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.20368f, 0.772064f, 0.975744f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2112f, 0.81264f, 1.02384f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.23552f, 0.856288f, 1.09181f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.295168f, 1.09549f, 1.39066f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.360992f, 1.23664f, 1.59763f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.530624f, 1.72477f, 2.25539f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.207712f, 0.79936f, 1.00707f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.232416f, 0.858624f, 1.09104f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.258912f, 0.956768f, 1.21568f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.348736f, 1.21283f, 1.56157f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.436608f, 1.48605f, 1.92266f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.67248f, 2.30464f, 2.97712f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.25184f, 0.931488f, 1.18333f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.291008f, 1.02557f, 1.31658f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.335776f, 1.15981f, 1.49558f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.46064f, 1.61072f, 2.07136f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.571584f, 2.02211f, 2.5937f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.970528f, 3.36506f, 4.33558f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.280896f, 1.0784f, 1.3593f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.325472f, 1.15485f, 1.48032f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.368512f, 1.27914f, 1.64765f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.489568f, 1.85226f, 2.34182f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.644992f, 2.13933f, 2.78432f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.18582f, 3.4128f, 4.59862f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.324288f, 1.21581f, 1.5401f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.391328f, 1.38886f, 1.78019f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.465472f, 1.60256f, 2.06803f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.681728f, 2.44394f, 3.12566f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.928544f, 3.02947f, 3.95802f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.74288f, 5.7424f, 7.48528f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.393152f, 1.50931f, 1.90246f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.518336f, 1.85155f, 2.36989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.63744f, 2.22864f, 2.86608f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.08336f, 3.7095f, 4.79286f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.51994f, 4.91075f, 6.43069f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.94374f, 10.0471f, 12.9909f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.467008f, 1.86157f, 2.32858f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.605792f, 2.18829f, 2.79408f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.764256f, 2.62019f, 3.38445f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.15994f, 4.04765f, 5.20758f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.71434f, 5.39062f, 7.10496f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.09373f, 10.3871f, 13.4808f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.608288f, 2.38278f, 2.99107f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.876992f, 3.07222f, 3.94922f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.12035f, 3.7441f, 4.86445f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.63226f, 5.0216f, 6.65386f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.00154f, 9.35562f, 12.3572f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.62192f, 19.1047f, 24.7267f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.895456f, 3.39619f, 4.29165f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.44794f, 4.74045f, 6.18838f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.88157f, 5.94205f, 7.82362f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.92192f, 9.3408f, 12.2627f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.57946f, 18.1355f, 23.7149f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 11.5911f, 36.4066f, 47.9977f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.183744f, 0.62592f, 0.809664f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.178368f, 0.624768f, 0.803136f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.184416f, 0.625664f, 0.81008f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.18848f, 0.663776f, 0.852256f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.20048f, 0.75984f, 0.96032f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.241888f, 0.827808f, 1.0697f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.178272f, 0.631424f, 0.809696f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.178944f, 0.62688f, 0.805824f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.18256f, 0.633344f, 0.815904f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.194752f, 0.695552f, 0.890304f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.215104f, 0.823584f, 1.03869f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.25408f, 0.909792f, 1.16387f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.178112f, 0.642912f, 0.821024f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.1864f, 0.648256f, 0.834656f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.188064f, 0.672288f, 0.860352f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.212608f, 0.77536f, 0.987968f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.241696f, 0.930272f, 1.17197f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.28688f, 1.06806f, 1.35494f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.188224f, 0.669472f, 0.857696f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.189024f, 0.668064f, 0.857088f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.200352f, 0.684448f, 0.8848f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.225312f, 0.807264f, 1.03258f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.260288f, 0.92304f, 1.18333f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.324064f, 1.10371f, 1.42778f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19072f, 0.698016f, 0.888736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.192992f, 0.700928f, 0.89392f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.207232f, 0.718048f, 0.92528f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.250336f, 0.854176f, 1.10451f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.31104f, 1.02029f, 1.33133f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.346048f, 1.2889f, 1.63494f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.200864f, 0.74336f, 0.944224f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.202528f, 0.742048f, 0.944576f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.235328f, 0.817984f, 1.05331f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.27824f, 0.973056f, 1.2513f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.356128f, 1.25293f, 1.60906f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.412896f, 1.65136f, 2.06426f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.221056f, 0.822784f, 1.04384f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.223552f, 0.824512f, 1.04806f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.270336f, 0.878848f, 1.14918f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.328128f, 1.08003f, 1.40816f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.381408f, 1.39382f, 1.77523f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.535744f, 1.70454f, 2.24029f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.254464f, 0.893312f, 1.14778f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.258496f, 0.895072f, 1.15357f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.314144f, 1.04131f, 1.35546f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.378976f, 1.25008f, 1.62906f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.442528f, 1.51478f, 1.95731f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.668224f, 2.35133f, 3.01955f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.29088f, 1.06464f, 1.35552f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.298272f, 1.0687f, 1.36698f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.374816f, 1.39213f, 1.76694f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.477696f, 1.69008f, 2.16778f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.655264f, 2.34141f, 2.99667f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.968768f, 3.44115f, 4.40992f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.32576f, 1.21955f, 1.54531f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.329952f, 1.22003f, 1.54998f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.430592f, 1.53574f, 1.96634f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.551104f, 1.95616f, 2.50726f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.678272f, 2.31446f, 2.99274f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.15968f, 3.48826f, 4.64794f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.396704f, 1.4825f, 1.8792f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.40432f, 1.4871f, 1.89142f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.53072f, 1.92547f, 2.45619f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.745568f, 2.5601f, 3.30566f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.10832f, 3.80998f, 4.9183f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.75475f, 5.85693f, 7.61168f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.536672f, 2.01072f, 2.54739f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.542592f, 2.01379f, 2.55638f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.755872f, 2.73626f, 3.49213f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.1489f, 3.87142f, 5.02032f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.86442f, 6.18858f, 8.05299f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.08518f, 10.3932f, 13.4784f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.618176f, 2.37578f, 2.99395f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.626752f, 2.38237f, 3.00912f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.925952f, 3.13392f, 4.05987f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.25629f, 4.21398f, 5.47027f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.01667f, 6.53949f, 8.55616f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.29424f, 10.6339f, 13.9281f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.905632f, 3.36294f, 4.26858f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.93168f, 3.38147f, 4.31315f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.36211f, 4.68909f, 6.0512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.10899f, 6.88758f, 8.99658f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.56262f, 11.5887f, 15.1514f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 6.05059f, 19.6086f, 25.6592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.47059f, 5.32419f, 6.79478f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.5199f, 5.34685f, 6.86675f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.28624f, 8.03443f, 10.3207f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.95626f, 12.6207f, 16.577f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 6.67968f, 21.6653f, 28.345f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 12.6692f, 37.0782f, 49.7475f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19456f, 0.628096f, 0.822656f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19504f, 0.633376f, 0.828416f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19616f, 0.62864f, 0.8248f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.203584f, 0.68496f, 0.888544f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.227392f, 0.78224f, 1.00963f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.26656f, 0.918208f, 1.18477f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.196768f, 0.648832f, 0.8456f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.195392f, 0.64512f, 0.840512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.20048f, 0.64768f, 0.84816f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.21152f, 0.711392f, 0.922912f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.236032f, 0.832832f, 1.06886f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.28832f, 1.02157f, 1.30989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.20656f, 0.68608f, 0.89264f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19904f, 0.68144f, 0.88048f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.207168f, 0.68608f, 0.893248f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2256f, 0.781568f, 1.00717f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.259968f, 0.938752f, 1.19872f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.32736f, 1.2328f, 1.56016f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.211008f, 0.69184f, 0.902848f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.210944f, 0.694432f, 0.905376f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.211648f, 0.692928f, 0.904576f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.250304f, 0.833632f, 1.08394f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.29744f, 0.92736f, 1.2248f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.364096f, 1.19683f, 1.56093f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.221536f, 0.740064f, 0.9616f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.221376f, 0.743424f, 0.9648f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.229344f, 0.744672f, 0.974016f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.282432f, 0.930816f, 1.21325f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.336256f, 1.03504f, 1.3713f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.389024f, 1.35664f, 1.74566f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.258816f, 0.852704f, 1.11152f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.260192f, 0.853856f, 1.11405f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.262272f, 0.855392f, 1.11766f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.316224f, 1.1f, 1.41622f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.38688f, 1.30742f, 1.6943f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.47488f, 1.78944f, 2.26432f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.289504f, 0.911392f, 1.2009f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.291168f, 0.90848f, 1.19965f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.30096f, 0.916032f, 1.21699f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.33904f, 1.15622f, 1.49526f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.42624f, 1.46781f, 1.89405f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.5632f, 1.75642f, 2.31962f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.325888f, 1.09674f, 1.42262f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.327712f, 1.10096f, 1.42867f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.332384f, 1.09763f, 1.43002f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.397248f, 1.34714f, 1.74438f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.5104f, 1.75914f, 2.26954f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.728992f, 2.53267f, 3.26166f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.3952f, 1.39219f, 1.78739f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.399456f, 1.39382f, 1.79328f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.407872f, 1.40483f, 1.8127f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.498144f, 1.77962f, 2.27776f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.68032f, 2.46982f, 3.15014f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.05725f, 3.83197f, 4.88922f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.446176f, 1.53632f, 1.9825f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.448704f, 1.5433f, 1.992f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.457376f, 1.54304f, 2.00042f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.565792f, 2.08362f, 2.64941f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.817568f, 2.53549f, 3.35306f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.11613f, 3.64989f, 4.76602f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.594176f, 2.05174f, 2.64592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.596448f, 2.05229f, 2.64874f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.610528f, 2.07005f, 2.68058f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.783008f, 2.70989f, 3.4929f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.18797f, 3.99824f, 5.18621f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.92531f, 6.5727f, 8.49802f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.884672f, 3.02106f, 3.90573f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.886976f, 3.02349f, 3.91046f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.909312f, 3.03789f, 3.9472f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.22243f, 4.2007f, 5.42314f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.93795f, 6.56611f, 8.50406f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.18189f, 10.245f, 13.4268f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.9832f, 3.38768f, 4.37088f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.995872f, 3.39814f, 4.39402f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.01818f, 3.41258f, 4.43075f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.3625f, 4.57059f, 5.93309f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.10586f, 6.8695f, 8.97536f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.64051f, 11.9647f, 15.6052f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.58886f, 5.25859f, 6.84746f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.60602f, 5.2639f, 6.86992f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.65667f, 5.3281f, 6.98477f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.3399f, 7.71654f, 10.0564f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.84739f, 12.2621f, 16.1095f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 6.48477f, 21.9752f, 28.46f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.78022f, 9.10947f, 11.8897f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.81354f, 9.1433f, 11.9568f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.89949f, 9.50614f, 12.4056f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.35613f, 14.1966f, 18.5527f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 7.38214f, 23.1963f, 30.5784f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 12.4999f, 42.5693f, 55.0692f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.229088f, 0.693952f, 0.92304f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.227328f, 0.695296f, 0.922624f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.229216f, 0.6952f, 0.924416f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.231488f, 0.696544f, 0.928032f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.251104f, 0.84192f, 1.09302f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.303072f, 0.947232f, 1.2503f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.23328f, 0.731072f, 0.964352f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.235296f, 0.736544f, 0.97184f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.233408f, 0.7304f, 0.963808f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.23936f, 0.73728f, 0.97664f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.262176f, 0.8792f, 1.14138f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.321728f, 1.08051f, 1.40224f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.248288f, 0.788992f, 1.03728f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.25344f, 0.79184f, 1.04528f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.254208f, 0.78928f, 1.04349f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.262336f, 0.797312f, 1.05965f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.303776f, 0.97376f, 1.27754f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.362336f, 1.25408f, 1.61642f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.264864f, 0.806304f, 1.07117f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.27056f, 0.806592f, 1.07715f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.275008f, 0.812896f, 1.0879f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2808f, 0.821408f, 1.10221f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.3256f, 0.977376f, 1.30298f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.401152f, 1.23738f, 1.63853f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.301376f, 0.895168f, 1.19654f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.295008f, 0.898592f, 1.1936f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.297696f, 0.894496f, 1.19219f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.305152f, 0.903936f, 1.20909f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.375488f, 1.08176f, 1.45725f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.444608f, 1.41146f, 1.85606f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.335552f, 1.08598f, 1.42154f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.335712f, 1.09242f, 1.42813f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.334336f, 1.09555f, 1.42989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.340096f, 1.1097f, 1.44979f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.464928f, 1.52163f, 1.98656f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.526112f, 1.89158f, 2.4177f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.38512f, 1.17501f, 1.56013f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.383264f, 1.1745f, 1.55776f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.387936f, 1.17731f, 1.56525f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.395424f, 1.19171f, 1.58714f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.47968f, 1.50061f, 1.98029f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.654368f, 1.85699f, 2.51136f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.453056f, 1.5768f, 2.02986f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.454784f, 1.58266f, 2.03744f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.456704f, 1.58371f, 2.04042f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.47488f, 1.60726f, 2.08214f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.583488f, 2.00077f, 2.58426f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.813312f, 2.81629f, 3.6296f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.602208f, 2.20042f, 2.80262f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.604832f, 2.20384f, 2.80867f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.606272f, 2.20973f, 2.816f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.621504f, 2.23923f, 2.86074f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.799008f, 2.88374f, 3.68275f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.1897f, 4.2448f, 5.4345f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.67184f, 2.31674f, 2.98858f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.670368f, 2.31648f, 2.98685f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.678432f, 2.33075f, 3.00918f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.69456f, 2.36627f, 3.06083f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.9336f, 2.94547f, 3.87907f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.46234f, 4.25158f, 5.71392f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.966144f, 3.41245f, 4.37859f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.971104f, 3.42045f, 4.39155f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.978496f, 3.4311f, 4.4096f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.00614f, 3.4752f, 4.48134f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.35763f, 4.9063f, 6.26394f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.01568f, 6.77523f, 8.79091f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.57546f, 5.62909f, 7.20454f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.57757f, 5.62522f, 7.20278f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.60589f, 5.65347f, 7.25936f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.64883f, 5.73024f, 7.37907f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.24122f, 8.14506f, 10.3863f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.80675f, 13.3177f, 17.1244f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.70992f, 5.94387f, 7.65379f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.73104f, 5.95149f, 7.68253f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.7527f, 5.96317f, 7.71587f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.81302f, 6.05894f, 7.87197f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.64362f, 8.38717f, 11.0308f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.03181f, 13.6312f, 17.663f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.00826f, 10.227f, 13.2353f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.03213f, 10.256f, 13.2882f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.06915f, 10.3034f, 13.3725f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.1577f, 10.7098f, 13.8675f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.72877f, 15.5655f, 20.2942f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 7.62358f, 24.9189f, 32.5425f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.47101f, 18.7137f, 24.1847f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.51574f, 18.767f, 24.2827f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.62438f, 19.0699f, 24.6943f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.79597f, 19.8603f, 25.6563f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 9.50867f, 29.3649f, 38.8735f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 16.2827f, 48.2963f, 64.579f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.759968f, 2.63827f, 3.39824f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.997536f, 3.54342f, 4.54096f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.11242f, 3.62954f, 4.74195f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.15728f, 6.61533f, 8.77261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.66768f, 2.43395f, 3.10163f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.42579f, 4.01818f, 5.44397f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.49123f, 4.25142f, 5.74266f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.50317f, 5.06035f, 6.56352f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.21574f, 6.8287f, 9.04445f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.06422f, 6.40224f, 8.46646f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.08838f, 6.56678f, 8.65517f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.53853f, 8.92682f, 11.4653f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.74941f, 9.23629f, 11.9857f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.83514f, 12.5196f, 16.3547f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.8721f, 12.959f, 16.8311f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.10528f, 14.9369f, 19.0422f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.52266f, 15.2174f, 19.7401f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.91648f, 3.05197f, 3.96845f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.10022f, 4.04739f, 5.14762f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.37683f, 4.6095f, 5.98634f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.55264f, 8.81258f, 11.3652f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.68954f, 5.71789f, 7.40742f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.80646f, 6.12282f, 7.92928f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.96176f, 6.65168f, 8.61344f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.62288f, 9.0911f, 11.714f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.46368f, 8.40317f, 10.8668f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.98704f, 10.434f, 13.4211f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.99795f, 10.853f, 13.8509f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.87594f, 13.9953f, 17.8712f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.80922f, 17.4061f, 22.2153f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.20643f, 17.5162f, 22.7227f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.23098f, 18.1433f, 23.3743f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.98678f, 22.4772f, 28.464f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.44234f, 4.62394f, 6.06627f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.85939f, 6.37357f, 8.23296f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.20934f, 7.38557f, 9.59491f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.21462f, 14.4709f, 18.6855f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.19459f, 7.17875f, 9.37334f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.05296f, 8.71776f, 11.7707f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.2287f, 10.7856f, 14.0143f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.36301f, 14.9351f, 19.2981f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.21526f, 13.822f, 18.0373f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.25338f, 17.0937f, 22.3471f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.57488f, 18.914f, 24.4889f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 7.36973f, 21.0573f, 28.427f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 16384, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.28723f, 27.3583f, 35.6455f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.5631f, 28.3392f, 36.9023f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 9.43098f, 31.3446f, 40.7756f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 10.7265f, 34.6802f, 45.4067f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.4792f, 1.57898f, 2.05818f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.522592f, 1.60138f, 2.12397f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.498048f, 1.59661f, 2.09466f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.67008f, 2.28173f, 2.95181f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 2048, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.94624f, 3.21709f, 4.16333f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 4096, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.29418f, 4.42704f, 5.72122f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.949056f, 2.97386f, 3.92291f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.02067f, 3.04106f, 4.06173f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.985024f, 3.01267f, 3.9977f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.31907f, 4.16784f, 5.48691f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 2048, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.86611f, 5.72608f, 7.59219f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 4096, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.1471f, 10.0429f, 13.19f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.696768f, 2.01856f, 2.71533f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.717344f, 2.04371f, 2.76106f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.700544f, 2.03571f, 2.73626f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.782464f, 2.09088f, 2.87334f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 1024, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.04906f, 2.80058f, 3.84963f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 2048, 2048, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.51574f, 4.1127f, 5.62845f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.01402f, 3.1239f, 4.13792f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.04733f, 3.17898f, 4.2263f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.02637f, 3.15264f, 4.17901f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.10838f, 3.2399f, 4.34829f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 1024, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.5256f, 4.41072f, 5.93632f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 2048, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.28026f, 6.47808f, 8.75834f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.21245f, 3.87971f, 5.09216f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.2264f, 3.92029f, 5.14669f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.26394f, 3.95542f, 5.21936f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.37587f, 4.03699f, 5.41286f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
};
static constexpr int kNumTunedConfigsMultiSm100 =
@@ -9,7 +9,7 @@
// n_pes is the tuning-time PE count;
// deployment lookup should compute TKE the same way.
// Each row pairs the best fwd template with the best bwd template for
// that shape. The COMM tile is fixed at 128 for both directions;
// that shape. The architecture-specific COMM tile matches in both directions;
// Fwd_TileM / Bwd_TileM are the per-direction GEMM tiles and may differ.
// Written incrementally; a partial file means the tuner crashed.
@@ -18,372 +18,352 @@
namespace liger {
static const TunedConfigFwdBwd kTunedConfigsSingleSm100[] = {
{512, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16096f, 0.546048f, 0.707008f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.159571f, 0.55081f, 0.710381f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.161306f, 0.551597f, 0.712902f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16023f, 0.558912f, 0.719142f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.172051f, 0.597254f, 0.769306f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.198259f, 0.722874f, 0.921133f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.162989f, 0.553005f, 0.715994f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.160723f, 0.557869f, 0.718592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.160966f, 0.558304f, 0.71927f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.161664f, 0.56743f, 0.729094f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.177856f, 0.627418f, 0.805274f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.210534f, 0.799469f, 1.01f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.164218f, 0.561926f, 0.726144f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.161581f, 0.565453f, 0.727034f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.163437f, 0.567162f, 0.730598f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.167846f, 0.600678f, 0.768525f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.189658f, 0.697325f, 0.886982f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.235597f, 0.95904f, 1.19464f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16665f, 0.595174f, 0.761824f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.166285f, 0.598272f, 0.764557f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.165606f, 0.600128f, 0.765734f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.17273f, 0.6192f, 0.79193f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.196493f, 0.744544f, 0.941037f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.24777f, 0.976986f, 1.22476f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16816f, 0.599699f, 0.767859f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.169069f, 0.604154f, 0.773222f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16969f, 0.617242f, 0.786931f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.182208f, 0.646451f, 0.828659f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.21385f, 0.844902f, 1.05875f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.281094f, 1.14685f, 1.42794f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.172557f, 0.610522f, 0.783078f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.175418f, 0.627526f, 0.802944f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.181299f, 0.64807f, 0.82937f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.201114f, 0.748147f, 0.949261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.246586f, 1.01132f, 1.25791f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.350502f, 1.48898f, 1.83948f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.183827f, 0.674822f, 0.85865f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.184864f, 0.691008f, 0.875872f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.19424f, 0.738483f, 0.932723f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.23111f, 0.811949f, 1.04306f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.309165f, 1.10876f, 1.41792f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.456915f, 1.5166f, 1.97351f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19463f, 0.705862f, 0.900493f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.196666f, 0.719789f, 0.916454f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.212301f, 0.792544f, 1.00484f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.26752f, 0.955469f, 1.22299f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.380179f, 1.32317f, 1.70335f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.605792f, 2.06072f, 2.66651f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.221798f, 0.817843f, 1.03964f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.218688f, 0.844973f, 1.06366f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.24873f, 0.943693f, 1.19242f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.339386f, 1.19742f, 1.53681f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.521843f, 1.81075f, 2.3326f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.894726f, 3.04808f, 3.94281f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.238099f, 0.977165f, 1.21526f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.239622f, 1.01887f, 1.25849f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.275392f, 1.10008f, 1.37547f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.371962f, 1.33362f, 1.70558f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.577318f, 1.90124f, 2.47855f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.0524f, 3.00953f, 4.06193f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.274931f, 1.12375f, 1.39868f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.275226f, 1.15483f, 1.43005f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.345651f, 1.32271f, 1.66836f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.508416f, 1.72819f, 2.2366f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.859859f, 2.74424f, 3.6041f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.64299f, 5.24431f, 6.8873f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.351994f, 1.42275f, 1.77475f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.349222f, 1.44351f, 1.79273f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.48992f, 1.77823f, 2.26815f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.795494f, 2.48421f, 3.27971f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.48655f, 4.58863f, 6.07519f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.88976f, 9.4326f, 12.3224f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.388698f, 1.79371f, 2.18241f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.399482f, 1.8148f, 2.21428f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.550675f, 2.12644f, 2.67712f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.878464f, 2.88533f, 3.7638f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.57642f, 4.83883f, 6.41525f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.08339f, 9.52294f, 12.6063f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.539501f, 2.3311f, 2.8706f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.551302f, 2.37534f, 2.92664f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.848538f, 3.02945f, 3.87799f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.48499f, 4.49831f, 5.9833f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.86057f, 8.50899f, 11.3696f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.79613f, 17.3508f, 23.147f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.834419f, 3.39818f, 4.2326f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.870733f, 3.52156f, 4.39229f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.47284f, 4.99103f, 6.46387f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.73096f, 7.94452f, 10.6755f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.53554f, 16.3115f, 21.847f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 11.7453f, 33.2224f, 44.9677f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.162214f, 0.550822f, 0.713037f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.160448f, 0.551482f, 0.71193f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16041f, 0.552717f, 0.713126f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.160038f, 0.558963f, 0.719002f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.171949f, 0.603494f, 0.775443f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.199328f, 0.728352f, 0.92768f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.162182f, 0.558912f, 0.721094f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.160544f, 0.559142f, 0.719686f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.159859f, 0.562074f, 0.721933f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.162278f, 0.576659f, 0.738938f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.17817f, 0.631366f, 0.809536f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.211021f, 0.813939f, 1.02496f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.162624f, 0.563968f, 0.726592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.163782f, 0.566176f, 0.729958f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.163942f, 0.580595f, 0.744538f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.170957f, 0.604307f, 0.775264f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.190778f, 0.711251f, 0.902029f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.236928f, 0.955981f, 1.19291f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.165875f, 0.597376f, 0.763251f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.164998f, 0.60025f, 0.765248f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.166227f, 0.614176f, 0.780403f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.174899f, 0.621747f, 0.796646f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.197798f, 0.759501f, 0.957299f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.247072f, 0.966522f, 1.21359f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.168032f, 0.602374f, 0.770406f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.171104f, 0.616794f, 0.787898f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.171283f, 0.62185f, 0.793133f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.183744f, 0.664909f, 0.848653f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.214746f, 0.851731f, 1.06648f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.283757f, 1.15622f, 1.43998f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.177766f, 0.632928f, 0.810694f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.18585f, 0.65287f, 0.83872f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.184966f, 0.676787f, 0.861754f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.204742f, 0.760877f, 0.965619f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.250061f, 1.02882f, 1.27888f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.352602f, 1.50364f, 1.85624f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.189216f, 0.698547f, 0.887763f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.193965f, 0.730995f, 0.92496f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.196941f, 0.752166f, 0.949107f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.237203f, 0.829818f, 1.06702f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.311309f, 1.12188f, 1.43318f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.468768f, 1.54268f, 2.01144f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.201766f, 0.785971f, 0.987738f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.216819f, 0.82023f, 1.03705f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.217331f, 0.844282f, 1.06161f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.274432f, 0.993734f, 1.26817f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.384832f, 1.35169f, 1.73652f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.608928f, 2.07844f, 2.68737f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.228595f, 0.921088f, 1.14968f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.254995f, 0.997395f, 1.25239f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.299411f, 1.12072f, 1.42013f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.34505f, 1.25896f, 1.60401f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.526522f, 1.88765f, 2.41418f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.899462f, 3.11491f, 4.01437f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.243974f, 1.09159f, 1.33556f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.27449f, 1.15569f, 1.43018f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.283584f, 1.18113f, 1.46471f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.37952f, 1.39919f, 1.77871f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.583462f, 1.97329f, 2.55675f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.06557f, 3.09319f, 4.15876f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.289216f, 1.30917f, 1.59839f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.289958f, 1.32048f, 1.61044f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.363955f, 1.47661f, 1.84057f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.521664f, 1.84826f, 2.36993f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.874086f, 2.86406f, 3.73814f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.66095f, 5.37363f, 7.03458f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.373517f, 1.73999f, 2.11351f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.505184f, 2.00012f, 2.50531f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.527347f, 2.08755f, 2.61489f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.83273f, 2.76506f, 3.59779f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.50279f, 4.873f, 6.3758f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.92215f, 9.87941f, 12.8016f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.414534f, 2.11793f, 2.53247f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.557606f, 2.35284f, 2.91045f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.588218f, 2.44658f, 3.0348f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.912582f, 3.15036f, 4.06294f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.6018f, 5.07896f, 6.68076f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.07203f, 9.77594f, 12.848f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.59065f, 2.96287f, 3.55352f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.866464f, 3.4296f, 4.29606f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.923091f, 3.64536f, 4.56845f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.57554f, 4.98232f, 6.55786f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.88855f, 8.96927f, 11.8578f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.81412f, 18.2542f, 24.0683f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.931571f, 4.51811f, 5.44968f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.995827f, 4.71695f, 5.71278f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.61433f, 6.2028f, 7.81713f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.92491f, 9.19107f, 12.116f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.62045f, 17.1017f, 22.7222f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 12.2477f, 34.8364f, 47.0841f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.162944f, 0.555616f, 0.71856f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.163168f, 0.556717f, 0.719885f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.162349f, 0.55664f, 0.718989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.1632f, 0.56896f, 0.73216f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.174547f, 0.603578f, 0.778125f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.200698f, 0.757939f, 0.958637f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.163034f, 0.560019f, 0.723053f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.16423f, 0.559757f, 0.723987f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.163725f, 0.573459f, 0.737184f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.167827f, 0.581818f, 0.749645f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.180698f, 0.6488f, 0.829498f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.214483f, 0.8536f, 1.06808f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.165312f, 0.578918f, 0.74423f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.167725f, 0.577395f, 0.74512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.17168f, 0.595693f, 0.767373f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.175859f, 0.605632f, 0.781491f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.194829f, 0.702278f, 0.897107f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.240954f, 0.960659f, 1.20161f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.167814f, 0.61047f, 0.778285f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.170202f, 0.613056f, 0.783258f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.173146f, 0.615866f, 0.789011f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.179424f, 0.626778f, 0.806202f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.201069f, 0.740045f, 0.941114f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.250259f, 0.967379f, 1.21764f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.174989f, 0.624397f, 0.799386f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.179238f, 0.624954f, 0.804192f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.185984f, 0.654259f, 0.840243f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19161f, 0.68311f, 0.87472f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.21897f, 0.808928f, 1.0279f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.285965f, 1.10769f, 1.39365f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.190125f, 0.683443f, 0.873568f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.195142f, 0.705907f, 0.90105f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.202163f, 0.757088f, 0.959251f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.213158f, 0.810477f, 1.02364f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.258112f, 0.995917f, 1.25403f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.358637f, 1.46473f, 1.82337f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.196634f, 0.77305f, 0.969683f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.203731f, 0.777766f, 0.981498f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.218637f, 0.832506f, 1.05114f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.24967f, 0.87504f, 1.12471f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.326573f, 1.09793f, 1.42451f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.470381f, 1.467f, 1.93738f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.213165f, 0.885043f, 1.09821f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.226483f, 0.917421f, 1.1439f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.226266f, 0.927418f, 1.15368f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.285542f, 1.0644f, 1.34995f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.398566f, 1.43455f, 1.83312f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.62096f, 2.14584f, 2.7668f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.249574f, 1.10305f, 1.35262f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.270445f, 1.15441f, 1.42485f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.315251f, 1.2843f, 1.59955f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.44352f, 1.64879f, 2.09231f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.548013f, 2.02694f, 2.57495f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.915846f, 3.22538f, 4.14123f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.267392f, 1.28614f, 1.55353f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.290746f, 1.32076f, 1.61151f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.332717f, 1.41734f, 1.75005f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.388589f, 1.53738f, 1.92597f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.601389f, 2.11804f, 2.71942f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.08308f, 3.21721f, 4.30029f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.331782f, 1.66191f, 1.9937f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.383347f, 1.76138f, 2.14473f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.459834f, 1.8954f, 2.35524f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.562778f, 2.16318f, 2.72596f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.920595f, 3.13629f, 4.05688f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.69107f, 5.66895f, 7.36003f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.458643f, 2.37119f, 2.82984f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.559546f, 2.56278f, 3.12233f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.686061f, 2.82744f, 3.5135f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.923002f, 3.43746f, 4.36046f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.58068f, 5.45822f, 7.03891f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.94154f, 10.1306f, 13.0721f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.499859f, 2.82436f, 3.32422f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.616083f, 2.99231f, 3.60839f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.781171f, 3.28253f, 4.06371f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.978912f, 3.6662f, 4.64511f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.67904f, 5.71059f, 7.38963f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.08406f, 10.2584f, 13.3425f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.754042f, 4.26596f, 5.02f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.96825f, 4.61373f, 5.58198f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.24596f, 5.16367f, 6.40964f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.74573f, 6.14823f, 7.89396f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.0072f, 10.3697f, 13.3769f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.857f, 19.0825f, 24.9395f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.2482f, 7.22574f, 8.47395f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.64743f, 7.88344f, 9.53087f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.23164f, 9.521f, 11.7526f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.1903f, 12.2423f, 15.4326f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.91006f, 19.9454f, 25.8554f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 12.8726f, 37.3966f, 50.2692f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.598515f, 2.14352f, 2.74204f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.64905f, 2.57359f, 3.22264f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.836486f, 3.52805f, 4.36454f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 64, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.914771f, 4.85496f, 5.76973f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.956416f, 3.00646f, 3.96287f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.0426f, 3.53028f, 4.57289f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.10831f, 4.26625f, 5.37456f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.04183f, 5.16664f, 6.20847f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.85017f, 5.56392f, 7.41409f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.0458f, 5.80321f, 7.84901f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.1353f, 6.69059f, 8.82589f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.65723f, 6.30265f, 7.95988f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.63251f, 11.6411f, 15.2736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.70323f, 11.6077f, 15.3109f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.99831f, 12.1225f, 16.1208f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.2753f, 8.25329f, 10.5286f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.716608f, 2.53953f, 3.25613f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.793613f, 2.99225f, 3.78586f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.04718f, 4.45848f, 5.50566f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.05812f, 4.41288f, 5.471f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.26455f, 3.93414f, 5.19869f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.32768f, 4.36927f, 5.69695f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.47221f, 5.69192f, 7.16413f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.45343f, 5.70325f, 7.15668f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.43396f, 7.48473f, 9.91869f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.47902f, 8.1946f, 10.6736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.61087f, 8.99692f, 11.6078f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.54624f, 9.02966f, 11.5759f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.86874f, 16.0047f, 20.8734f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.90017f, 16.7438f, 21.6439f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.83562f, 17.7315f, 22.5671f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.86783f, 17.779f, 22.6469f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.12426f, 3.83206f, 4.95632f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.24636f, 4.67206f, 5.91843f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.66568f, 7.12779f, 8.79347f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.65919f, 7.11795f, 8.77714f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.07651f, 6.17338f, 8.24989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.12752f, 6.76521f, 8.89273f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.45377f, 8.82236f, 11.2761f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.44584f, 9.22264f, 11.6685f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.15798f, 12.4055f, 16.5634f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.26247f, 13.2215f, 17.4839f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.29064f, 14.6231f, 18.9137f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.53569f, 14.9693f, 19.505f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.36337f, 24.7387f, 33.1021f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 8.56801f, 25.7722f, 34.3402f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.85167f, 26.4568f, 35.3085f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 9.08888f, 26.2726f, 35.3615f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.215725f, 0.866202f, 1.08193f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 64, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.553062f, 2.28551f, 2.83857f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2608f, 1.05052f, 1.31132f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 128, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.674771f, 2.8078f, 3.48257f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.283642f, 1.12197f, 1.40561f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 256, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.818848f, 3.26259f, 4.08143f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.391686f, 1.50966f, 1.90134f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 512, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.15446f, 4.45352f, 5.60798f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.327347f, 1.52049f, 1.84784f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 64, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.37672f, 6.36242f, 7.73914f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.430131f, 1.87593f, 2.30606f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 128, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.47265f, 6.98243f, 8.45508f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.558093f, 2.06042f, 2.61851f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 256, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.97919f, 8.39598f, 10.3752f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.858042f, 3.02355f, 3.88159f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.25366f, 11.7409f, 14.9945f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.234022f, 0.914323f, 1.14835f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 32, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.31081f, 1.24284f, 1.55364f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 32, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.772275f, 3.04493f, 3.8172f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.27376f, 1.09395f, 1.36771f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 64, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.318624f, 1.25868f, 1.5773f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 64, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.78983f, 3.08269f, 3.87252f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.33049f, 1.20868f, 1.53917f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.373798f, 1.42374f, 1.79754f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.984243f, 3.71412f, 4.69836f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.381101f, 1.47073f, 1.85183f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.479853f, 1.71626f, 2.19612f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.29343f, 4.87793f, 6.17137f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.318368f, 1.42202f, 1.74038f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 32, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.488531f, 2.09588f, 2.58441f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 32, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.33764f, 6.44071f, 7.77835f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 3072, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.386381f, 1.63635f, 2.02273f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.503482f, 2.11553f, 2.61901f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.35761f, 6.50255f, 7.86015f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 3072, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.489286f, 1.89745f, 2.38673f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 128, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.568883f, 2.33123f, 2.90011f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 128, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.6731f, 7.31202f, 8.98512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.608576f, 2.21927f, 2.82785f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 256, 3072, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.786259f, 2.90239f, 3.68865f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 256, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.29688f, 9.37094f, 11.6678f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.382323f, 1.69431f, 2.07663f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 32, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.584083f, 2.59315f, 3.17723f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.450093f, 2.00484f, 2.45493f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 64, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 4, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.597293f, 2.62149f, 3.21878f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/4_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.56944f, 2.40541f, 2.97485f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 128, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.714413f, 2.9117f, 3.62611f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.803859f, 2.78159f, 3.58545f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 256, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 4, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.938003f, 3.5838f, 4.5218f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/4_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.129088f, 0.574752f, 0.70384f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.130944f, 0.57872f, 0.709664f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.1328f, 0.58112f, 0.71392f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.134752f, 0.584672f, 0.719424f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.141696f, 0.615136f, 0.756832f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.176704f, 0.74288f, 0.919584f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.131456f, 0.581344f, 0.7128f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.130944f, 0.585792f, 0.716736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.134112f, 0.58784f, 0.721952f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.136896f, 0.596544f, 0.73344f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.149216f, 0.653472f, 0.802688f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.195648f, 0.82624f, 1.02189f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.133056f, 0.599232f, 0.732288f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.134048f, 0.599072f, 0.73312f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.135936f, 0.60384f, 0.739776f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.142624f, 0.637632f, 0.780256f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.164672f, 0.73216f, 0.896832f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.229696f, 0.9896f, 1.2193f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.136544f, 0.622368f, 0.758912f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.136096f, 0.628032f, 0.764128f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.140672f, 0.62976f, 0.770432f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.146176f, 0.641472f, 0.787648f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.185376f, 0.769696f, 0.955072f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.240384f, 0.9776f, 1.21798f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.138624f, 0.63504f, 0.773664f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.138432f, 0.639072f, 0.777504f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.142528f, 0.65648f, 0.799008f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.161216f, 0.689408f, 0.850624f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.208864f, 0.872928f, 1.08179f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.276032f, 1.17683f, 1.45286f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.140992f, 0.654912f, 0.795904f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.144f, 0.673184f, 0.817184f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.155232f, 0.696832f, 0.852064f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.193984f, 0.79408f, 0.988064f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.244864f, 1.04659f, 1.29146f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.343616f, 1.53901f, 1.88262f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.150624f, 0.713952f, 0.864576f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.155872f, 0.730048f, 0.88592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.167936f, 0.758624f, 0.92656f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.228928f, 0.845952f, 1.07488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.300544f, 1.1343f, 1.43485f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.448f, 1.54688f, 1.99488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.159456f, 0.75744f, 0.916896f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.179392f, 0.775936f, 0.955328f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.20448f, 0.842496f, 1.04698f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.26592f, 1.01728f, 1.2832f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.375456f, 1.40781f, 1.78326f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.594944f, 2.21261f, 2.80755f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2096f, 0.9f, 1.1096f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.208192f, 0.923424f, 1.13162f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.241504f, 1.02067f, 1.26218f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.337792f, 1.29565f, 1.63344f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.515168f, 1.95782f, 2.47299f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.88416f, 3.30157f, 4.18573f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.225568f, 1.04365f, 1.26922f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.22784f, 1.07216f, 1.3f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.269344f, 1.16259f, 1.43194f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.366528f, 1.42605f, 1.79258f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.564384f, 2.05338f, 2.61776f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.0385f, 3.28992f, 4.32842f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.262944f, 1.22918f, 1.49213f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.266048f, 1.2473f, 1.51334f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.340768f, 1.43654f, 1.77731f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.503808f, 1.89101f, 2.39482f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.849344f, 2.99898f, 3.84832f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.62326f, 5.59517f, 7.21843f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.340032f, 1.59824f, 1.93827f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.340288f, 1.61878f, 1.95907f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.48256f, 1.98205f, 2.46461f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.79216f, 2.75098f, 3.54314f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.44182f, 4.87891f, 6.32074f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.83594f, 10.1023f, 12.9383f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.378208f, 1.9144f, 2.29261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.392704f, 1.93747f, 2.33018f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.540384f, 2.29053f, 2.83091f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.868096f, 3.14438f, 4.01248f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.53776f, 5.26246f, 6.80022f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.97392f, 10.2317f, 13.2056f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.527232f, 2.57866f, 3.10589f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.546528f, 2.61834f, 3.16486f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.838208f, 3.32032f, 4.15853f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.4648f, 4.85939f, 6.32419f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.74765f, 9.12051f, 11.8682f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.47059f, 18.8916f, 24.3621f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.815552f, 3.89955f, 4.7151f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.868672f, 3.98198f, 4.85066f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.44557f, 5.46557f, 6.91114f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.66f, 8.78672f, 11.4467f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.24118f, 17.7932f, 23.0344f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 10.7964f, 35.763f, 46.5594f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.14016f, 0.577216f, 0.717376f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.132512f, 0.582784f, 0.715296f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.135072f, 0.581696f, 0.716768f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.137248f, 0.590592f, 0.72784f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.142496f, 0.62848f, 0.770976f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 256, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.178272f, 0.74416f, 0.922432f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.13408f, 0.586592f, 0.720672f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.132544f, 0.587968f, 0.720512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.136192f, 0.59104f, 0.727232f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.138816f, 0.604896f, 0.743712f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.149024f, 0.662336f, 0.81136f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.204512f, 0.843936f, 1.04845f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.134304f, 0.59728f, 0.731584f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.134656f, 0.600864f, 0.73552f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.142976f, 0.630624f, 0.7736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.144576f, 0.636384f, 0.78096f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.167456f, 0.743648f, 0.911104f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.232608f, 0.98528f, 1.21789f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.137568f, 0.62288f, 0.760448f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.138784f, 0.625728f, 0.764512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.142848f, 0.642912f, 0.78576f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.148832f, 0.648448f, 0.79728f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.190944f, 0.782624f, 0.973568f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2408f, 0.970528f, 1.21133f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.140224f, 0.637088f, 0.777312f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.141344f, 0.651456f, 0.7928f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.145408f, 0.658944f, 0.804352f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.1736f, 0.708128f, 0.881728f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.20976f, 0.877472f, 1.08723f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.275744f, 1.18563f, 1.46138f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.146752f, 0.678432f, 0.825184f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.158368f, 0.687008f, 0.845376f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.176928f, 0.72544f, 0.902368f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.199552f, 0.810336f, 1.00989f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.247904f, 1.06064f, 1.30854f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.34736f, 1.54186f, 1.88922f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.15536f, 0.740128f, 0.895488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.16624f, 0.743616f, 0.909856f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.190336f, 0.793024f, 0.98336f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.233152f, 0.871136f, 1.10429f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.304864f, 1.14957f, 1.45443f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.452f, 1.5641f, 2.0161f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.187424f, 0.839488f, 1.02691f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.18992f, 0.85152f, 1.04144f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.208224f, 0.894944f, 1.10317f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.271072f, 1.05299f, 1.32406f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.377504f, 1.43821f, 1.81571f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.595296f, 2.23958f, 2.83488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.214816f, 1.012f, 1.22682f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.240384f, 1.07802f, 1.3184f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.251424f, 1.10374f, 1.35517f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.343264f, 1.36262f, 1.70589f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.519648f, 2.02237f, 2.54202f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.891232f, 3.36893f, 4.26016f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.228896f, 1.14624f, 1.37514f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.265568f, 1.22243f, 1.488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.277888f, 1.24771f, 1.5256f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.369728f, 1.49152f, 1.86125f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.569824f, 2.11277f, 2.68259f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.04554f, 3.38147f, 4.42701f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.273824f, 1.41488f, 1.6887f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.34f, 1.57072f, 1.91072f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.36016f, 1.60826f, 1.96842f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.51936f, 2.01158f, 2.53094f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.861696f, 3.12925f, 3.99094f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.63904f, 5.74848f, 7.38752f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.36112f, 1.93514f, 2.29626f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.490624f, 2.24538f, 2.736f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.523968f, 2.30701f, 2.83098f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.813728f, 3.00282f, 3.81654f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.47328f, 5.15914f, 6.63242f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.86858f, 10.2154f, 13.084f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.40544f, 2.25328f, 2.65872f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.420896f, 2.27206f, 2.69296f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.581952f, 2.6185f, 3.20045f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.904928f, 3.39613f, 4.30106f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.57357f, 5.45162f, 7.02518f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.01146f, 10.4621f, 13.4735f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.58096f, 3.25677f, 3.83773f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.611264f, 3.29315f, 3.90442f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.925504f, 3.95254f, 4.87805f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.5449f, 5.42992f, 6.97482f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.86672f, 9.77018f, 12.6369f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.47613f, 19.3724f, 24.8485f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.912448f, 5.02058f, 5.93302f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.41427f, 6.17853f, 7.5928f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.63011f, 6.52109f, 8.1512f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.8039f, 9.83181f, 12.6357f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 5.44179f, 18.3932f, 23.835f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 10.7607f, 37.3194f, 48.0801f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.137632f, 0.585088f, 0.72272f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.136384f, 0.584064f, 0.720448f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.138464f, 0.595392f, 0.733856f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.139936f, 0.601088f, 0.741024f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.145472f, 0.6264f, 0.771872f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 256, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.185376f, 0.773216f, 0.958592f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.13584f, 0.58944f, 0.72528f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.136704f, 0.59856f, 0.735264f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.138816f, 0.602272f, 0.741088f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.14208f, 0.610016f, 0.752096f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.154496f, 0.683936f, 0.838432f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.20816f, 0.905696f, 1.11386f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.137152f, 0.612384f, 0.749536f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.139072f, 0.615552f, 0.754624f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.1448f, 0.635136f, 0.779936f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.150784f, 0.642304f, 0.793088f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 512, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.180864f, 0.749472f, 0.930336f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 512, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.2352f, 1.02653f, 1.26173f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.141792f, 0.639968f, 0.78176f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.143648f, 0.641184f, 0.784832f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.149408f, 0.646816f, 0.796224f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.158912f, 0.660576f, 0.819488f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.195648f, 0.769152f, 0.9648f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.243552f, 1.02646f, 1.27002f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.144544f, 0.66224f, 0.806784f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.146816f, 0.663136f, 0.809952f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.162336f, 0.695552f, 0.857888f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.18352f, 0.716192f, 0.899712f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.216032f, 0.855072f, 1.0711f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.280224f, 1.17866f, 1.45888f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.177568f, 0.741248f, 0.918816f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 1024, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.182368f, 0.763392f, 0.94576f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.195616f, 0.811008f, 1.00662f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.206016f, 0.861568f, 1.06758f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.252992f, 1.05526f, 1.30826f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 1024, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.350944f, 1.55158f, 1.90253f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.185056f, 0.823776f, 1.00883f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.19248f, 0.830816f, 1.0233f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.21216f, 0.876736f, 1.0889f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.24128f, 0.912672f, 1.15395f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.314784f, 1.13453f, 1.44931f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.454496f, 1.50851f, 1.96301f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 2048, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.200224f, 0.9416f, 1.14182f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.214752f, 0.965472f, 1.18022f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.24048f, 1.052f, 1.29248f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.279904f, 1.13427f, 1.41418f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.389536f, 1.53997f, 1.9295f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.612f, 2.30858f, 2.92058f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 2048, 4096, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.233472f, 1.19558f, 1.42906f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.25904f, 1.25395f, 1.51299f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.30624f, 1.38141f, 1.68765f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.346592f, 1.48643f, 1.83302f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.533568f, 2.18733f, 2.7209f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 2048, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 0.907168f, 3.46739f, 4.37456f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.252864f, 1.34381f, 1.59667f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.2816f, 1.40448f, 1.68608f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.327296f, 1.50771f, 1.83501f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.39024f, 1.64698f, 2.03722f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.586688f, 2.28755f, 2.87424f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 2048, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.06147f, 3.50678f, 4.56826f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.318656f, 1.77395f, 2.09261f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.367136f, 1.90573f, 2.27286f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.45168f, 2.07997f, 2.53165f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.550432f, 2.28202f, 2.83245f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.898048f, 3.43712f, 4.33517f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.67107f, 6.06365f, 7.73472f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.45184f, 2.55424f, 3.00608f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.548768f, 2.82659f, 3.37536f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.681312f, 3.12592f, 3.80723f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.08314f, 4.79917f, 5.8823f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.54544f, 5.83043f, 7.37587f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.9296f, 10.7769f, 13.7065f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.483712f, 2.9865f, 3.47021f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.60096f, 3.2281f, 3.82906f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.756608f, 3.5617f, 4.3183f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.98672f, 3.9399f, 4.92662f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.64909f, 6.10336f, 7.75245f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 4096, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.06502f, 10.9527f, 14.0177f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.728864f, 4.5071f, 5.23597f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.94112f, 4.96365f, 5.90477f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.22646f, 5.57578f, 6.80224f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.67741f, 6.47827f, 8.15568f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.92349f, 10.9413f, 13.8648f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.55827f, 20.438f, 25.9962f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{512, 64, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.23709f, 8.05328f, 9.29037f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 128, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.65357f, 9.08214f, 10.7357f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.2343f, 10.3008f, 12.5351f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.18224f, 11.9992f, 15.1814f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 5.54282f, 20.4312f, 25.974f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 8192, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 13.1156f, 39.3198f, 52.4354f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.59184f, 2.3967f, 2.98854f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.642048f, 2.83488f, 3.47693f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.83152f, 3.98525f, 4.81677f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{1024, 64, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.896416f, 5.33306f, 6.22947f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.934624f, 3.27926f, 4.21389f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.01946f, 3.70954f, 4.72899f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.10698f, 4.55926f, 5.66624f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.02486f, 5.68678f, 6.71165f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.80554f, 5.82387f, 7.62941f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.95517f, 6.13488f, 8.09005f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.05677f, 6.88272f, 8.93949f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.61562f, 6.87754f, 8.49315f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.47475f, 11.9797f, 15.4545f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.54125f, 12.2246f, 15.7659f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 3.82678f, 12.3724f, 16.1992f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 5120, 8192, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.2663f, 8.38902f, 10.6553f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.703616f, 2.82266f, 3.52627f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.776864f, 3.30618f, 4.08304f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.04666f, 5.01267f, 6.05933f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 1.24096f, 4.29984f, 5.5408f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.27968f, 4.68928f, 5.96896f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.44458f, 5.82758f, 7.27216f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.3535f, 8.064f, 10.4175f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.41338f, 8.56275f, 10.9761f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.5777f, 9.42013f, 11.9978f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.66605f, 17.4756f, 22.1417f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.72288f, 17.6334f, 22.3563f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 4096, 14336, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 4.85206f, 18.8683f, 23.7204f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.1097f, 4.2423f, 5.352f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.24198f, 5.08851f, 6.3305f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 256, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.65818f, 7.76861f, 9.42678f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.02874f, 6.74477f, 8.7735f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 2.10883f, 7.55542f, 9.66426f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 512, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.43658f, 9.51059f, 11.9472f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.92112f, 13.6494f, 17.5705f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.12163f, 14.2316f, 18.3532f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 1024, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 4.26554f, 15.3447f, 19.6102f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 8192, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 8, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 7.95766f, 26.4414f, 34.3991f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-8_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 4096, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 8.18723f, 28.0232f, 36.2105f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 2048, 6144, 16384, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 5, 32, 64, 64, 2, 128, 128, 8.54845f, 28.2221f, 36.7706f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/5_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.217824f, 0.90288f, 1.1207f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 64, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.533376f, 2.3897f, 2.92307f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.252384f, 1.0912f, 1.34358f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 128, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.615168f, 2.85469f, 3.46986f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.273632f, 1.1631f, 1.43674f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 256, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.85296f, 3.89357f, 4.74653f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 2048, 768, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.372832f, 1.55427f, 1.9271f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 512, 2048, 768, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.11171f, 4.728f, 5.83971f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 128, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.320704f, 1.60534f, 1.92605f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 64, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.35437f, 6.75318f, 8.10755f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 256, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.416832f, 1.94259f, 2.35942f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 128, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.42086f, 7.40518f, 8.82605f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.541024f, 2.24301f, 2.78403f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 256, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.94474f, 9.06586f, 11.0106f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 1024, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.833472f, 3.24675f, 4.08022f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 512, 4096, 1536, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 3.14925f, 12.579f, 15.7283f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.226944f, 0.947648f, 1.17459f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 32, 2048, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.724576f, 3.12374f, 3.84832f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.26432f, 1.1303f, 1.39462f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 64, 2048, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.75888f, 3.16522f, 3.9241f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.316512f, 1.24182f, 1.55834f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 128, 2048, 512, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.938784f, 3.84838f, 4.78717f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.361824f, 1.49341f, 1.85523f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 256, 2048, 512, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.16362f, 5.21146f, 6.37507f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.307424f, 1.48979f, 1.79722f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 32, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.29446f, 6.81008f, 8.10454f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 3072, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.370848f, 1.6975f, 2.06835f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 64, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.32237f, 6.87814f, 8.20051f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 3072, 1024, 128, 64, 4, 64, 128, 64, 4, 64, 4, 3, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.47072f, 1.85261f, 2.32333f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-128/64/4/EC64_ZB4_CS3 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{32768, 128, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 4, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 1.63862f, 7.84605f, 9.48467f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS4 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.587968f, 2.27808f, 2.86605f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{65536, 256, 3072, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 2.16198f, 9.68422f, 11.8462f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{2048, 64, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.368736f, 1.7664f, 2.13514f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{4096, 128, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 2, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.425632f, 2.10451f, 2.53014f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS2 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{8192, 256, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.546432f, 2.56493f, 3.11136f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
{16384, 512, 4096, 1024, 128, 64, 4, 64, 256, 64, 4, 64, 4, 8, 2, 128, 64, 3, 256, 256, 64, 4, 32, 64, 64, 2, 128, 128, 0.765216f, 2.8248f, 3.59002f}, // FWD=TM128_TN1-128/64/4/EC64_TN2-256/64/4/EC64_ZB4_CS8 | BWD=NS2-2_TN1-128/64/3_TM3-256_TN3-256/64/4_EN1-32_EN25-64_EN34-64_CS2_TM128
};
static constexpr int kNumTunedConfigsSingleSm100 =
@@ -43,6 +43,7 @@ struct MoeFwdArgs {
void** x_sorted_out;
void** y_buf_out;
void** all_expert_offsets_out;
void** all_expert_counts_out;
};
// Backward launcher inputs. dB/dC/dA/dW are gradient ACCUMULATION targets — the
@@ -54,6 +55,7 @@ struct MoeBwdArgs {
int* token_expert_slots; // [T*top_k] int32
int* tile_expert_ids; // [max_m_tiles] int32
int* expert_offsets; // [num_pes, num_experts+1] int32 (fwd's all_*)
int* expert_counts; // [num_pes, num_experts] int32 (fwd's exact counts)
int* expert_indices; // [T, K] int32
const void* expert_weights; // [T, K] bf16
const void* all_B; // [epp, I, D] bf16
@@ -1,5 +1,7 @@
#pragma once
#include "moe_comm_config.cuh"
// ============================================================================
// MoeSymmConfig — fixed parameters for symmetric-memory sizing.
//
@@ -32,13 +34,14 @@ struct MoeSymmConfig {
// session may run. The symmetric staging pool (moe_src/dst_staging) is
// a single shared key sized ONCE; because get_symmetric aborts on grow,
// it must be reserved at the largest CommNumStages × TileM any config
// uses (the tuner sweeps NS=16/CS=8/TileM=128). Per-config sizing would
// uses (the tuner sweeps NS=16/CS=8).
// Per-config sizing would
// let a small first config lock in a buffer a later large config can't
// grow into. Same reasoning as sizing by max hidden_dim, extended to
// the (CS, TileM) axes. The bwd path doesn't read these, but they MUST
// stay in the layout so its get_symm_config() view matches the fwd's.
int max_comm_stages = 8; // max CommNumStages over LIGER_MOE_TUNE_CONFIGS
int max_tile_m = 128; // max TileM (WGMMA-bounded)
int max_comm_stages = kMaxMoeCommStages;
int max_tile_m = kMaxMoeCommTileM;
bool initialized = false;
};
@@ -199,6 +199,8 @@ __device__ __forceinline__ void sort_tokens(
if (tid == 0) {
sort.expert_offsets[0] = 0;
for (int e = 0; e < num_experts; ++e) {
if (sort.expert_counts != nullptr)
sort.expert_counts[e] = sort_counts[e];
int aligned = ((sort_counts[e] + TileM - 1) / TileM) * TileM;
sort.expert_offsets[e + 1] = sort.expert_offsets[e] + aligned;
}
@@ -36,6 +36,8 @@ struct MlpTileInfo {
// per-peer TMA descriptor built over nvshmem_ptr(y_buf, pe).
bool is_local; // same-host (NVLink) → GEMM TMA-stores Y straight into the
// peer's symmetric local_output, bypassing dst_staging+put.
int valid_m64_subtiles; // number of 64-row output subtiles containing valid rows
int m_subtile; // GemmTileM row within the parent communication tile
};
// ═══════════════════════════════════════════════════════════════════
@@ -115,6 +117,8 @@ struct LocalMlpTileIterator {
info.y_store_m = info.y_m;
info.peer_rank = 0;
info.is_local = false;
info.valid_m64_subtiles = TileM / 64;
info.m_subtile = 0;
m += col_stride;
return info;
@@ -308,13 +312,17 @@ struct LocalFlatMlpTileIterator {
// that NC evenly divides gridDim.x · gridDim.y so MC is integer
// (host-side concern, not a template constraint).
template <typename Element, int NumStages, int NC = 2, int TileM = 128>
template <typename Element, int NumStages, int NC = 2, int TileM = 128,
int MSubTiles = 1>
struct RemoteMlpTileIterator {
// Slot's producer/consumer counts (compile-time, used for ticket math).
// FWD steady-state GET uses kNumGetWarpsFwd active warps/CTA (the TMA path
// saturates with one), so the MLP waits for kNumGetWarpsFwd·NC src signals.
static constexpr int NumProducersSrc = kNumGetWarpsFwd * NC; // active get warps × NC
static constexpr int NumConsumersDst = kNumPutWarpsFwd * NC; // put warps × NC
static_assert(NC % MSubTiles == 0,
"communication CTAs must divide evenly across GEMM M-subtiles");
static constexpr int RowNC = NC / MSubTiles;
static constexpr int NumProducersSrc = kNumGetWarpsFwd * RowNC;
static constexpr int NumConsumersDst = kNumPutWarpsFwd * RowNC;
// (expert, pe) are re-derived in SMEM, NOT read from HBM: the MLP's j-th tile
// is global flat tile T_j = m_base + j·col_stride — the same flat position the
@@ -322,7 +330,7 @@ struct RemoteMlpTileIterator {
// guarantees the rendezvous). So an embedded TileIterator init(m_base,
// col_stride) walked in lockstep with idx reproduces what the comm wrote,
// with zero per-tile HBM load and fewer registers than holding HBM pointers.
TileIterator<TileM> tit; // embedded comm-side walker
GemmTileIterator<TileM, MSubTiles> tit;
bool derive_on; // false → no remote_offsets (test harness) → local
int gpus_per_node; // same-host divisor for is_local
int iter_my_pe; // this PE (team space) for is_local
@@ -333,7 +341,7 @@ struct RemoteMlpTileIterator {
// tile-sequence start
int col_stride; // logical grid_x (= n_gemm / runtime NS) — tile-sequence
// stride; NOT gridDim.x under the flat-grid launch
int ring_len; // L = MC · NumStages, set at init
int ring_len; // physical communication slots: L = MC · NumStages
int num_splits;
int* src_ready;
@@ -345,13 +353,17 @@ struct RemoteMlpTileIterator {
int idx; // iteration counter within this column
int cur_slot; // cached slot for current acquire/release cycle
int cur_data_slot;
int cur_ticket; // cached ticket for current acquire/release cycle
int cur_m_subtile;
int cur_parent_tile;
// remote_offsets (SMEM) drives the embedded walker; pass nullptr to disable
// derivation (e.g. the standalone handshake test, which only exercises the
// ticket/slot protocol). experts_per_pe/num_pes/my_pe/gpus_per_node feed the
// walker and the same-host is_local predicate.
__device__ void init(const int* remote_offsets,
const int* remote_counts,
int experts_per_pe,
int num_pes,
int my_pe,
@@ -388,11 +400,11 @@ struct RemoteMlpTileIterator {
if (derive_on) {
tit.remote_offsets = remote_offsets;
tit.offsets_stride = experts_per_pe + 1;
tit.remote_counts = remote_counts;
tit.counts_stride = experts_per_pe;
tit.experts_per_pe = experts_per_pe;
tit.num_pes = num_pes;
tit.my_pe = my_pe;
// Walk the MLP column's flat-tile subsequence (start m_base, stride
// col_stride) — identical positions to compute_slot()'s T_j.
tit.init(m_base_, col_stride);
}
}
@@ -405,9 +417,19 @@ struct RemoteMlpTileIterator {
// Called by acquire_src() — the rest of the per-tile API (next,
// release_src, acquire_dst, release_dst) reuses the cached values.
__device__ void compute_slot() {
int T = m_base + idx * col_stride;
cur_slot = T % ring_len;
cur_ticket = T / ring_len;
int parent_t;
if (derive_on) {
parent_t = tit.current_parent_tile();
cur_m_subtile = tit.current_m_subtile();
} else {
int virtual_t = m_base + idx * col_stride;
parent_t = virtual_t / MSubTiles;
cur_m_subtile = virtual_t % MSubTiles;
}
cur_parent_tile = parent_t;
cur_data_slot = parent_t % ring_len;
cur_slot = cur_data_slot * MSubTiles + cur_m_subtile;
cur_ticket = parent_t / ring_len;
}
// Re-derive (expert, pe) for this tile from SMEM offsets — the embedded
@@ -416,7 +438,7 @@ struct RemoteMlpTileIterator {
__device__ MlpTileInfo next() {
MlpTileInfo info;
info.x_ptr = nullptr; // not used — TMA loads by coordinate
info.y_m = cur_slot;
info.y_m = cur_data_slot;
if (derive_on) {
TileInfo ti = tit.next();
info.expert = ti.expert;
@@ -429,6 +451,8 @@ struct RemoteMlpTileIterator {
info.peer_rank = (gpus_per_node > 0) ? (ti.pe % gpus_per_node) : 0;
// Direct-store row = this tile's token offset in the peer's local_output.
info.y_store_m = ti.token_offset / TileM;
info.valid_m64_subtiles = (ti.valid_rows + 63) / 64;
info.m_subtile = ti.m_subtile;
} else {
// Test harness (no SMEM offsets): no derivation, no direct store.
info.expert = 0;
@@ -436,6 +460,8 @@ struct RemoteMlpTileIterator {
info.is_local = false;
info.peer_rank = 0;
info.y_store_m = cur_slot;
info.valid_m64_subtiles = TileM / 64;
info.m_subtile = 0;
}
idx++;
return info;
@@ -71,6 +71,8 @@ struct LocalMlpTileIteratorBwd {
info.x_ptr = x_base + (size_t)m * TileM * hidden_dim;
info.expert = expert_ids[m];
info.y_m = tile_offset + m;
info.valid_m64_subtiles = TileM / 64;
info.m_subtile = 0;
m += col_stride;
return info;
@@ -128,16 +130,14 @@ struct LocalMlpTileIteratorBwd {
template <typename Element, int NumStages, int NC = 2, int TileM = 128>
struct RemoteMlpTileIteratorBwd {
// Slot's producer/consumer counts. RUNTIME (not constexpr) because the
// comm warp layout switches on the TMA-GET enable flag:
// getmem : 2·NC get warps produce X/dY, NC put warps consume dX
// TMA : 1·NC get warp produces X/dY, 2·NC put warps consume dX
// Set in init() from tma_enabled so the acquire thresholds match the
// actual number of producer_release / consumer_release calls per slot.
// Slot's producer/consumer counts. The unified backward comm loop always
// uses one GET warp and one PUT warp per CTA; do_get_bwd_tma selects TMA or
// getmem per tile without changing warp ownership.
int NumProducersSrc; // get warps × NC
int NumConsumersDst; // put warps × NC
const int* tile_expert_ids; // [L] — comm writes expert id at slot index
const int* tile_valid_rows; // [L] — comm writes exact valid row count
int total_tiles;
int m_base; // logical column (flat_id / runtime NS) — tile-seq start
int col_stride; // grid_x = n_gemm / runtime NS (column stride)
@@ -162,6 +162,7 @@ struct RemoteMlpTileIteratorBwd {
// MC = n_gemm_ / NC. n_gemm_ < 0 falls back to gridDim.x · gridDim.y for
// legacy 2-D-grid standalone callers.
__device__ void init(const int* tile_expert_ids_,
const int* tile_valid_rows_,
int total_tiles_,
int m_base_,
int n_gemm_,
@@ -171,11 +172,11 @@ struct RemoteMlpTileIteratorBwd {
bool is_leader_,
int runtime_nsplit_,
bool tma_enabled_ = false) {
// Producer/consumer counts follow the comm-side warp layout, which is
// chosen by the same tma_enabled flag (see nvshmem_comm_main_bwd).
NumProducersSrc = (tma_enabled_ ? kNumGetWarpsBwd : kNumGetWarpsPerCta) * NC;
NumConsumersDst = (tma_enabled_ ? kNumPutWarpsBwd : 1) * NC;
(void)tma_enabled_;
NumProducersSrc = kNumGetWarpsBwd * NC;
NumConsumersDst = kNumPutWarpsBwd * NC;
tile_expert_ids = tile_expert_ids_;
tile_valid_rows = tile_valid_rows_;
total_tiles = total_tiles_;
m_base = m_base_;
num_splits = runtime_nsplit_;
@@ -219,6 +220,9 @@ struct RemoteMlpTileIteratorBwd {
info.x_ptr = nullptr; // not used — TMA loads by coordinate
info.expert = tile_expert_ids[cur_slot];
info.y_m = cur_slot;
info.valid_m64_subtiles =
(tile_valid_rows[cur_slot] + 63) / 64;
info.m_subtile = 0;
idx++;
return info;
}
@@ -300,7 +304,7 @@ struct RemoteMlpTileIteratorBwd {
// Signal comm warps that dX is ready to be put. Per tile, dst_ready
// advances by N_SPLIT.
__device__ void release_dst(int lane) {
__threadfence(); // device-scope (NVLink-only build); IB put needs __threadfence_system()
__threadfence_system();
if (lane == 0) {
atomicAdd(&dst_ready[cur_slot], 1);
}
@@ -323,6 +327,7 @@ struct FusedMlpTileIteratorBwd {
RemoteMlpTileIteratorBwd<Element, NumStages, NC, TileM> remote;
__device__ void init_remote(const int* tile_expert_ids,
const int* tile_valid_rows,
int total_tiles,
int m_base,
int n_gemm,
@@ -332,7 +337,8 @@ struct FusedMlpTileIteratorBwd {
bool is_leader,
int runtime_nsplit,
bool tma_enabled = false) {
remote.init(tile_expert_ids, total_tiles, m_base, n_gemm,
remote.init(tile_expert_ids, tile_valid_rows,
total_tiles, m_base, n_gemm,
x_src_ready, x_src_consumed, dy_src_ready, dy_src_consumed,
dst_ready, dst_consumed, is_leader, runtime_nsplit, tma_enabled);
}
@@ -73,6 +73,63 @@ int nvshmem_int_min_reduce(
static int* g_tuner_status_src = nullptr;
static int* g_tuner_status_dst = nullptr;
__global__ void mark_nonfinite_bf16(
const uint16_t* data, size_t count, int* found) {
for (size_t i = blockIdx.x * blockDim.x + threadIdx.x;
i < count;
i += blockDim.x * gridDim.x) {
if ((data[i] & UINT16_C(0x7f80)) == UINT16_C(0x7f80)) {
atomicExch(found, 1);
return;
}
}
}
static bool tuner_outputs_are_finite(
const torch::Tensor& y,
const torch::Tensor* dx,
const torch::Tensor* db,
const torch::Tensor* dc,
const torch::Tensor* da,
const torch::Tensor* dw,
cudaStream_t stream) {
if (getenv("MOE_FWDBWD_TUNE_CHECK_FINITE") == nullptr) return true;
int* found = nullptr;
if (cudaMalloc(&found, sizeof(int)) != cudaSuccess) return false;
if (cudaMemsetAsync(found, 0, sizeof(int), stream) != cudaSuccess) {
cudaFree(found);
return false;
}
auto check = [&](const torch::Tensor& tensor) {
constexpr int kThreads = 256;
const int blocks = static_cast<int>(std::min<int64_t>(
(tensor.numel() + kThreads - 1) / kThreads, 4096));
if (blocks > 0) {
mark_nonfinite_bf16<<<blocks, kThreads, 0, stream>>>(
static_cast<const uint16_t*>(tensor.data_ptr()),
static_cast<size_t>(tensor.numel()), found);
}
};
check(y);
if (dx != nullptr) {
check(*dx);
check(*db);
check(*dc);
check(*da);
check(*dw);
}
int host_found = 0;
cudaError_t status = cudaMemcpyAsync(
&host_found, found, sizeof(int), cudaMemcpyDeviceToHost, stream);
if (status == cudaSuccess) status = cudaStreamSynchronize(stream);
cudaFree(found);
return status == cudaSuccess && host_found == 0;
}
static inline void tuner_team_sync(nvshmem_team_t team, int n_pes) {
if (n_pes > 1) nvshmem_team_sync(team);
}
@@ -336,7 +393,9 @@ static bool bwd_shape_valid(int D, int I, const TunerEntryBwd& e) {
const int TM = e.TileM, TN1 = e.TileN1, TK1 = e.TileK1, S1 = e.Stages1;
const int TM3 = e.TileM3, TN3 = e.TileN3, TK3 = e.TileK3, S3 = e.Stages3;
const int EN1 = e.EpiChunkN1, EN25 = e.EpiChunkN25, EN34 = e.EpiChunkN34;
int mlp1 = 2 * ((TM + 2 * TN1) * TK1 * S1) + 6 * 128 * EN1;
int act_store_m = e.Compute == 100 ? 32 : 64;
int mlp1 = 2 * ((TM + 2 * TN1) * TK1 * S1)
+ 12 * act_store_m * EN1;
int mlp25 = 2 * ((128 + 256) * TK1 * S1) + 2 * 128 * EN25; // mlp2_t / mlp5
// SM100 mlp3/mlp4 2SM: sizeof(Mlp3FusedSmem2Sm<...>) /
// sizeof(Mlp4FusedSmem<...>) at the fixed joined TileN=256 collapse to
@@ -512,6 +571,14 @@ static bool run_pair_once(
fwd_status = 0;
(void)cudaGetLastError();
}
if (fwd_status == 1 && !run_backward &&
!tuner_outputs_are_finite(
Y, nullptr, nullptr, nullptr, nullptr, nullptr, stream)) {
fprintf(stderr,
" [PE=%d FWD=%s @ %s FWD] non-finite output\n",
pe, fwd_e.name, step);
fwd_status = 0;
}
const int global_fwd_status = tuner_consensus_status(team, fwd_status);
if (global_fwd_status != 1) {
// The forward owns symmetric-stack entries, and a throwing rank may
@@ -566,6 +633,13 @@ static bool run_pair_once(
bwd_status = 0;
(void)cudaGetLastError();
}
if (bwd_status == 1 &&
!tuner_outputs_are_finite(Y, &dX, &dB, &dC, &dA, &dW, stream)) {
fprintf(stderr,
" [PE=%d BWD=%s @ %s BWD] non-finite output\n",
pe, bwd_e.name, step);
bwd_status = 0;
}
const int global_bwd_status = tuner_consensus_status(team, bwd_status);
// Drain fwd's symm-stack entries so the next sequence starts clean. MUST
@@ -749,7 +823,7 @@ static void dump_tuned_configs() {
<< "// n_pes is the tuning-time PE count;\n"
<< "// deployment lookup should compute TKE the same way.\n"
<< "// Each row pairs the best fwd template with the best bwd template for\n"
<< "// that shape. The COMM tile is fixed at 128 for both directions;\n"
<< "// that shape. The architecture-specific COMM tile matches in both directions;\n"
<< "// Fwd_TileM / Bwd_TileM are the per-direction GEMM tiles and may differ.\n"
<< "// Written incrementally; a partial file means the tuner crashed.\n\n"
<< "#include \"moe_fwd_bwd_tuning_config_types.cuh\"\n\n"
@@ -815,6 +889,14 @@ static void tune_shape(
const int skew = std::max(0, atoi(skew_env));
T = std::max(128, T - pe * skew);
}
if (K > E) {
if (pe == 0) {
printf("%-7d %-6d %-6d SKIP (top_k=%d exceeds num_experts=%d)\n",
T, D, I, K, E);
fflush(stdout);
}
return;
}
int epp = E / n_pes;
// Pre-filter: every fwd / bwd config that passes its own shape-validity
@@ -1097,8 +1179,8 @@ static void tune_shape(
}
// Pick the best fwd and best bwd INDEPENDENTLY across the two GEMM-tile
// buckets. The comm tile is fixed at 128 for both directions, so the bwd
// always inherits a 128-aligned sort layout regardless of either side's
// buckets. The architecture-specific comm tile matches in both directions,
// so backward inherits the same sort layout regardless of either side's
// GEMM tile — fwd and bwd no longer need to share TileM. (bwd_ms in each
// bucket was measured paired with that bucket's seed fwd, but the bwd
// timing is invariant to the fwd config, so cross-bucket comparison is
@@ -1216,10 +1298,19 @@ static void tune_shape(
int main(int argc, char** argv) {
setvbuf(stdout, nullptr, _IONBF, 0);
const char* procid = getenv("SLURM_PROCID");
if (procid) cudaSetDevice(atoi(procid));
const char* rank_env = getenv("SLURM_LOCALID");
if (rank_env == nullptr) rank_env = getenv("PMI_RANK");
if (rank_env == nullptr) rank_env = getenv("PMIX_RANK");
if (rank_env == nullptr) rank_env = getenv("OMPI_COMM_WORLD_LOCAL_RANK");
if (rank_env == nullptr) rank_env = getenv("SLURM_PROCID");
int device_count = 0;
if (rank_env != nullptr &&
cudaGetDeviceCount(&device_count) == cudaSuccess &&
device_count > 0) {
cudaSetDevice(atoi(rank_env) % device_count);
}
const bool has_pmi =
procid || getenv("PMI_RANK") || getenv("PMIX_RANK") ||
getenv("SLURM_PROCID") || getenv("PMI_RANK") || getenv("PMIX_RANK") ||
getenv("OMPI_COMM_WORLD_RANK");
auto nvshmem_status = LIGER_CUTE_OK;
if (has_pmi) {
@@ -1241,7 +1332,8 @@ int main(int argc, char** argv) {
nvshmem_team_t team = NVSHMEM_TEAM_WORLD;
int pe = nvshmem_team_my_pe(team);
int n_pes = nvshmem_team_n_pes(team);
cudaSetDevice(pe);
if (device_count <= 0) cudaGetDeviceCount(&device_count);
if (device_count > 0) cudaSetDevice(pe % device_count);
g_tuner_n_pes = n_pes; // selects single- vs multi-GPU config class on dump
int dev = 0;
cudaGetDevice(&dev);
@@ -1412,14 +1504,14 @@ int main(int argc, char** argv) {
// out at E_local=8 = E_global 64, far below these models). Pinning here
// also keeps the symm pool sized for the real E (pool sizing reads these).
// Qwen3 E=128 -> E_local 16 (128 / 8)
// Qwen3.5 E=256 and 512 -> E_local 32 and 64 (256/8, 512/8)
// Qwen3.5 E=256 -> E_local 32 (256/8)
struct FamilySweep { const char* family; std::vector<int> E_local_values; };
const std::vector<FamilySweep> family_sweeps = {
// Qwen3 pinned to 16 experts/GPU (= real 128-expert model on 8 PEs).
{"QWEN3", {16}},
// Qwen3.5 spans two expert counts; sweep both real densities so the
// 256- and 512-expert variants each get a real-density data point.
{"QWEN35", {32, 64}},
// The 512-expert Qwen3.5 variant uses top_k=10, above MaxTopK=8.
// Keep only the supported 256-expert density in the tuning table.
{"QWEN35", {32}},
// SCOUT / MIXTRAL (and any unlisted family) default to {1, 2, 4, 8}.
};
auto sweep_local_Es_for_family = [&](const char* fam) -> std::vector<int> {
@@ -1626,15 +1718,9 @@ int main(int argc, char** argv) {
s.name, E_eff, n_pes);
continue;
}
// The router trait fixes MaxTopK=8 (router.cu RouterTraits); K>8
// (e.g. qwen3.5-397B's K=10) would throw "top_k exceeds MaxTopK" in
// moe_router_fwd. Skip cleanly instead of catching a stack trace.
if (K_eff > 8) {
if (pe == 0)
printf("%s [real]: SKIP (top_k=%d > MaxTopK=8 unsupported)\n",
s.name, K_eff);
continue;
}
// Keep unsupported model metadata for future coverage, but omit its
// real run until the fused combine paths support top_k > 8.
if (K_eff > 8) continue;
if (real_tuned_in_sweep) continue;
if (pe == 0) {
bool E_ovr = E_eff != s.E;
@@ -186,7 +186,7 @@ def moe_fused_fwd_bf16(
Y = torch.empty((num_tokens, hidden_dim), dtype=torch.bfloat16, device=X.device)
token_expert_slots = torch.empty((max_total_slots,), dtype=torch.int32, device=X.device)
tile_expert_ids = torch.empty((max_m_tiles,), dtype=torch.int32, device=X.device)
symm_meta = torch.empty(13, dtype=torch.int64, device="cpu")
symm_meta = torch.empty(17, dtype=torch.int64, device="cpu")
_load_module().moe_fused_fwd_bf16(
X,
expert_indices,
@@ -202,7 +202,7 @@ def moe_fused_fwd_bf16(
tile_expert_ids,
symm_meta,
)
chosen_tile_m = int(symm_meta[12].item())
chosen_tile_m = int(symm_meta[16].item())
return Y, symm_meta, symm_meta, symm_meta, token_expert_slots, tile_expert_ids, chosen_tile_m
@@ -237,7 +237,7 @@ void moe_fused_fwd_bf16(
ffi::TensorView all_B, ffi::TensorView all_C, ffi::TensorView all_A, int64_t num_experts,
int64_t top_k, int64_t team_handle, ffi::TensorView Y, ffi::TensorView token_expert_slots,
ffi::TensorView tile_expert_ids, ffi::TensorView symm_meta) {
RequireCpuInt64(symm_meta, 13);
RequireCpuInt64(symm_meta, 17);
DLDataType bf16{kDLBfloat, 16, 1};
DLDataType i32{kDLInt, 32, 1};
RequireCudaTensor(X, 2, bf16, "X");
@@ -283,6 +283,7 @@ void moe_fused_fwd_bf16(
void* x_sorted = nullptr;
void* y_buf = nullptr;
void* all_expert_offsets = nullptr;
void* all_expert_counts = nullptr;
liger::MoeFwdArgs args{};
args.X = X.data_ptr();
args.expert_indices = static_cast<const int*>(expert_indices.data_ptr());
@@ -306,6 +307,7 @@ void moe_fused_fwd_bf16(
args.x_sorted_out = &x_sorted;
args.y_buf_out = &y_buf;
args.all_expert_offsets_out = &all_expert_offsets;
args.all_expert_counts_out = &all_expert_counts;
try {
liger::moe_fused_fwd_dispatch(args, &chosen_tile_m);
} catch (const std::exception& e) {
@@ -314,7 +316,8 @@ void moe_fused_fwd_bf16(
WriteMeta(symm_meta, 0, x_sorted, cfg.max_total_slots, cfg.hidden_dim, 3);
WriteMeta(symm_meta, 4, y_buf, cfg.max_total_slots, cfg.hidden_dim, 3);
WriteMeta(symm_meta, 8, all_expert_offsets, cfg.num_pes, cfg.max_num_experts + 1, 7);
static_cast<int64_t*>(symm_meta.data_ptr())[12] = chosen_tile_m;
WriteMeta(symm_meta, 12, all_expert_counts, cfg.num_pes, cfg.max_num_experts, 7);
static_cast<int64_t*>(symm_meta.data_ptr())[16] = chosen_tile_m;
}
void moe_fused_bwd_bf16(
@@ -323,7 +326,7 @@ void moe_fused_bwd_bf16(
ffi::TensorView all_B, ffi::TensorView all_C, ffi::TensorView all_A, int64_t num_experts,
int64_t top_k, int64_t team_handle, ffi::TensorView dX, ffi::TensorView dB,
ffi::TensorView dC, ffi::TensorView dA, ffi::TensorView dW) {
RequireCpuInt64(symm_meta, 13);
RequireCpuInt64(symm_meta, 17);
DLDataType bf16{kDLBfloat, 16, 1};
DLDataType i32{kDLInt, 32, 1};
RequireCudaTensor(dY, 2, bf16, "dY");
@@ -342,6 +345,7 @@ void moe_fused_bwd_bf16(
Meta2 x_sorted = ReadMeta(symm_meta, 0);
Meta2 y_buf = ReadMeta(symm_meta, 4);
Meta2 expert_offsets = ReadMeta(symm_meta, 8);
Meta2 expert_counts = ReadMeta(symm_meta, 12);
int64_t stream_handle =
reinterpret_cast<int64_t>(TVMFFIEnvGetStream(dY.device().device_type, dY.device().device_id));
int device = 0;
@@ -353,6 +357,7 @@ void moe_fused_bwd_bf16(
args.token_expert_slots = static_cast<int*>(token_expert_slots.data_ptr());
args.tile_expert_ids = static_cast<int*>(tile_expert_ids.data_ptr());
args.expert_offsets = static_cast<int*>(expert_offsets.ptr);
args.expert_counts = static_cast<int*>(expert_counts.ptr);
args.expert_indices = static_cast<int*>(expert_indices.data_ptr());
args.expert_weights = expert_weights.data_ptr();
args.all_B = all_B.data_ptr();
@@ -373,7 +378,7 @@ void moe_fused_bwd_bf16(
args.dA = dA.data_ptr();
args.dW = dW.data_ptr();
try {
liger::moe_bwd_dispatch(args, static_cast<int>(static_cast<const int64_t*>(symm_meta.data_ptr())[12]));
liger::moe_bwd_dispatch(args, static_cast<int>(static_cast<const int64_t*>(symm_meta.data_ptr())[16]));
} catch (const std::exception& e) {
ThrowCoreError("moe_fused_bwd_bf16", e);
}
+407 -3
View File
@@ -24,10 +24,12 @@ dispatch table covers so the auto path resolves a config.
from __future__ import annotations
import os
import re
import shutil
import tempfile
from datetime import timedelta
from pathlib import Path
import pytest
@@ -135,8 +137,124 @@ def _check_close(ours, ref, *, mean_rel_tol=0.15, atol_for_rel=1e-3):
diff = (ours_f32 - ref_f32).abs()
rel = diff / ref_f32.abs().clamp_min(atol_for_rel)
mean_rel = rel.mean().item()
assert mean_rel < mean_rel_tol, (
f"reference mismatch: mean_rel={mean_rel:.4f} (tol {mean_rel_tol}), max_abs={diff.max().item():.4f}"
relative_l2 = (
torch.linalg.vector_norm(ours_f32 - ref_f32) / torch.linalg.vector_norm(ref_f32).clamp_min(atol_for_rel)
).item()
cosine = torch.nn.functional.cosine_similarity(
ours_f32.flatten(),
ref_f32.flatten(),
dim=0,
).item()
numerically_close = mean_rel < mean_rel_tol or (relative_l2 < 0.01 and cosine > 0.999)
assert numerically_close, (
f"reference mismatch: mean_rel={mean_rel:.4f} (tol {mean_rel_tol}), "
f"relative_l2={relative_l2:.4f}, cosine={cosine:.6f}, "
f"max_abs={diff.max().item():.4f}, ref_max={ref_f32.abs().max().item():.4f}"
)
_FWD_CONFIG_RE = re.compile(
r"FWD=TM(?P<tm>\d+)_TN1-(?P<tn1>\d+)/(?P<tk1>\d+)/(?P<s1>\d+)/EC(?P<ec1>\d+)"
r"_TN2-(?P<tn2>\d+)/(?P<tk2>\d+)/(?P<s2>\d+)/EC(?P<ec2>\d+)"
r"_ZB(?P<zb>\d+)_CS(?P<cs>\d+)"
)
_BWD_CONFIG_RE = re.compile(
r"BWD=NS2-(?P<ns2>\d+)_TN1-(?P<tn1>\d+)/(?P<tk1>\d+)/(?P<s1>\d+)"
r"_TM3-(?P<tm3>\d+)_TN3-(?P<tn3>\d+)/(?P<tk3>\d+)/(?P<s3>\d+)"
r"_EN1-(?P<en1>\d+)_EN25-(?P<en25>\d+)_EN34-(?P<en34>\d+)"
r"_CS(?P<cs>\d+)_TM(?P<tm>\d+)"
)
def _tuned_force_configs():
major = torch.cuda.get_device_capability()[0]
if major == 9:
compute = 90
elif major >= 10:
compute = 100
else:
raise RuntimeError(f"unsupported MoE tuning-test compute capability: {major}")
moe_dir = Path(__file__).resolve().parents[1] / "csrc" / "core" / "src" / "moe"
texts = [
(moe_dir / f"moe_fwd_bwd_tuning_configs_{kind}_sm{compute}.cuh").read_text() for kind in ("single", "multi")
]
fwd_configs = set()
bwd_configs = set()
for text in texts:
for match in _FWD_CONFIG_RE.finditer(text):
values = match.groupdict()
fwd_configs.add(
",".join(
values[name] for name in ("tn1", "tk1", "s1", "ec1", "tn2", "tk2", "s2", "ec2", "zb", "cs", "tm")
)
)
for match in _BWD_CONFIG_RE.finditer(text):
values = match.groupdict()
bwd_configs.add(
",".join(
values[name]
for name in (
"ns2",
"tn1",
"tk1",
"s1",
"tm3",
"tn3",
"tk3",
"s3",
"en1",
"en25",
"en34",
"cs",
"tm",
)
)
)
assert fwd_configs, f"no SM{compute} forward tuning configs found"
assert bwd_configs, f"no SM{compute} backward tuning configs found"
return sorted(fwd_configs), sorted(bwd_configs)
def _torch_reference_moe_backward(
X,
dY,
expert_indices,
expert_weights,
all_B_global,
all_C_global,
all_A_global,
top_k,
rank,
experts_per_pe,
):
X_ref = X.float().detach().requires_grad_(True)
weights_ref = expert_weights.float().detach().requires_grad_(True)
B_ref = all_B_global.float().detach().requires_grad_(True)
C_ref = all_C_global.float().detach().requires_grad_(True)
A_ref = all_A_global.float().detach().requires_grad_(True)
Y_ref = _torch_reference_moe(
X_ref,
expert_indices,
weights_ref,
B_ref,
C_ref,
A_ref,
top_k,
)
Y_ref.backward(dY.float())
for grad in (B_ref.grad, C_ref.grad, A_ref.grad):
dist.all_reduce(grad)
expert_slice = slice(rank * experts_per_pe, (rank + 1) * experts_per_pe)
return (
Y_ref.detach().to(torch.bfloat16),
X_ref.grad.detach().to(torch.bfloat16),
B_ref.grad[expert_slice].detach().to(torch.bfloat16),
C_ref.grad[expert_slice].detach().to(torch.bfloat16),
A_ref.grad[expert_slice].detach().to(torch.bfloat16),
weights_ref.grad.detach().to(torch.bfloat16),
)
@@ -622,7 +740,10 @@ def _single_token_auto_dispatch_worker(
top_k = 8
experts_per_pe = num_experts // world_size
fwd_force = "128,64,4,64,128,64,4,64,4,3,128"
bwd_force = "2,128,64,4,128,256,64,2,32,64,64,2,128"
if torch.cuda.get_device_capability()[0] >= 10:
bwd_force = "2,128,64,3,256,256,64,4,32,64,64,2,128"
else:
bwd_force = "16,128,64,4,128,256,64,2,32,64,64,2,64"
try:
tvm_ffi.moe_configure_symmetric(
@@ -724,6 +845,275 @@ def _single_token_auto_dispatch_worker(
_check_close(auto, forced)
def _all_tuned_configs_worker(rank: int, world_size: int, init_file: str):
_init(rank, world_size, init_file)
team = nvshmem.team_world()
fwd_configs, bwd_configs = _tuned_force_configs()
tokens, hidden_dim, intermediate_dim = 1025, 512, 256
num_experts, top_k = 16, 2
experts_per_pe = num_experts // world_size
try:
tvm_ffi.moe_configure_symmetric(
max_tokens=tokens,
hidden_dim=hidden_dim,
max_num_experts=num_experts,
max_top_k=top_k,
num_pes=world_size,
num_hosts=1,
gpus_per_host=world_size,
)
torch.manual_seed(20_000 + rank)
X = torch.randn(tokens, hidden_dim, dtype=torch.bfloat16, device="cuda")
dY = torch.randn_like(X)
all_B = torch.randn(
experts_per_pe,
intermediate_dim,
hidden_dim,
dtype=torch.bfloat16,
device="cuda",
)
all_C = torch.randn_like(all_B)
all_A = torch.randn(
experts_per_pe,
hidden_dim,
intermediate_dim,
dtype=torch.bfloat16,
device="cuda",
)
expert_indices = (
torch.arange(tokens * top_k, device="cuda").reshape(tokens, top_k).remainder(num_experts).to(torch.int32)
)
expert_weights = torch.softmax(
torch.rand(tokens, top_k, dtype=torch.float32, device="cuda"),
dim=1,
).to(torch.bfloat16)
all_B_global = _gather_experts(all_B, dist.group.WORLD)
all_C_global = _gather_experts(all_C, dist.group.WORLD)
all_A_global = _gather_experts(all_A, dist.group.WORLD)
reference = _torch_reference_moe_backward(
X,
dY,
expert_indices,
expert_weights,
all_B_global,
all_C_global,
all_A_global,
top_k,
rank,
experts_per_pe,
)
reference_cpu = [tensor.cpu() for tensor in reference]
del reference, all_B_global, all_C_global, all_A_global
def fwd():
return tvm_ffi.moe_fused_fwd_bf16(
X,
expert_indices,
expert_weights,
all_B,
all_C,
all_A,
num_experts=num_experts,
top_k=top_k,
team_handle=team,
)
def bwd(out):
return tvm_ffi.moe_fused_bwd_bf16(
dY,
out[2],
out[1],
out[4],
out[5],
out[3],
expert_indices,
expert_weights,
all_B,
all_C,
all_A,
num_experts=num_experts,
top_k=top_k,
team_handle=team,
fwd_tile_m=out[6],
)
os.environ.pop("LIGER_MOE_BWD_FORCE_CONFIG", None)
os.environ.pop("LIGER_MOE_BWD_FORCE_CONFIG", None)
for config in fwd_configs:
if rank == 0 and os.environ.get("LIGER_MOE_TEST_VERBOSE"):
print(f"testing forward config {config}", flush=True)
os.environ["LIGER_MOE_FORCE_CONFIG"] = config
out = fwd()
torch.cuda.synchronize()
got = out[0].cpu()
tvm_ffi.moe_pop_fwd()
try:
_check_close(got, reference_cpu[0])
except AssertionError as error:
raise AssertionError(f"forward config {config}: {error}") from error
reference_fwd_config = fwd_configs[0]
for config in bwd_configs:
if rank == 0 and os.environ.get("LIGER_MOE_TEST_VERBOSE"):
print(f"testing backward config {config}", flush=True)
os.environ["LIGER_MOE_FORCE_CONFIG"] = reference_fwd_config
os.environ["LIGER_MOE_BWD_FORCE_CONFIG"] = config
for repeat in range(2):
if rank == 0 and os.environ.get("LIGER_MOE_TEST_VERBOSE"):
print(f" repeat {repeat}: forward", flush=True)
out = fwd()
if rank == 0 and os.environ.get("LIGER_MOE_TEST_VERBOSE"):
print(f" repeat {repeat}: backward", flush=True)
grads = bwd(out)
torch.cuda.synchronize()
if rank == 0 and os.environ.get("LIGER_MOE_TEST_VERBOSE"):
print(f" repeat {repeat}: compare", flush=True)
got_cpu = [out[0].cpu()]
got_cpu.extend(grad.cpu() for grad in grads)
tvm_ffi.moe_pop_fwd()
failures = []
for name, got, expected in zip(
("Y", "dX", "dB", "dC", "dA", "dW"),
got_cpu,
reference_cpu,
):
try:
_check_close(got, expected)
except AssertionError as error:
failures.append(f"{name}: {error}")
assert not failures, f"backward config {config}, repeat {repeat}: " + "; ".join(failures)
os.environ.pop("LIGER_MOE_FORCE_CONFIG", None)
os.environ.pop("LIGER_MOE_BWD_FORCE_CONFIG", None)
dist.barrier()
nvshmem.finalize()
dist.destroy_process_group()
except BaseException:
os.environ.pop("LIGER_MOE_FORCE_CONFIG", None)
os.environ.pop("LIGER_MOE_BWD_FORCE_CONFIG", None)
try:
dist.destroy_process_group()
except Exception:
pass
raise
def _stacked_forward_metadata_worker(rank: int, world_size: int, init_file: str):
_init(rank, world_size, init_file)
team = nvshmem.team_world()
tokens, hidden_dim, intermediate_dim = 129, 512, 256
num_experts, top_k = 16, 2
experts_per_pe = num_experts // world_size
try:
tvm_ffi.moe_configure_symmetric(
max_tokens=tokens,
hidden_dim=hidden_dim,
max_num_experts=num_experts,
max_top_k=top_k,
num_pes=world_size,
num_hosts=1,
gpus_per_host=world_size,
)
torch.manual_seed(30_000 + rank)
X = torch.randn(tokens, hidden_dim, dtype=torch.bfloat16, device="cuda")
dY = torch.randn_like(X)
all_B = torch.randn(
experts_per_pe,
intermediate_dim,
hidden_dim,
dtype=torch.bfloat16,
device="cuda",
)
all_C = torch.randn_like(all_B)
all_A = torch.randn(
experts_per_pe,
hidden_dim,
intermediate_dim,
dtype=torch.bfloat16,
device="cuda",
)
weights = torch.full(
(tokens, top_k),
0.5,
dtype=torch.bfloat16,
device="cuda",
)
balanced_indices = (
torch.arange(tokens * top_k, device="cuda").reshape(tokens, top_k).remainder(num_experts).to(torch.int32)
)
skewed_indices = torch.arange(top_k, device="cuda").repeat(tokens, 1).to(torch.int32)
def fwd(indices):
return tvm_ffi.moe_fused_fwd_bf16(
X,
indices,
weights,
all_B,
all_C,
all_A,
num_experts=num_experts,
top_k=top_k,
team_handle=team,
)
def bwd(out, indices):
return tvm_ffi.moe_fused_bwd_bf16(
dY,
out[2],
out[1],
out[4],
out[5],
out[3],
indices,
weights,
all_B,
all_C,
all_A,
num_experts=num_experts,
top_k=top_k,
team_handle=team,
fwd_tile_m=out[6],
)
first = fwd(balanced_indices)
second = fwd(skewed_indices)
first_meta = first[3].cpu()
second_meta = second[3].cpu()
assert first_meta[12].item() != second_meta[12].item()
bwd(second, skewed_indices)
torch.cuda.synchronize()
tvm_ffi.moe_pop_fwd()
stacked = [tensor.cpu() for tensor in bwd(first, balanced_indices)]
tvm_ffi.moe_pop_fwd()
baseline_out = fwd(balanced_indices)
baseline = [tensor.cpu() for tensor in bwd(baseline_out, balanced_indices)]
tvm_ffi.moe_pop_fwd()
for name, got, expected in zip(
("dX", "dB", "dC", "dA", "dW"),
stacked,
baseline,
):
try:
_check_close(got, expected, mean_rel_tol=0.01)
except AssertionError as error:
raise AssertionError(f"stacked-forward metadata corrupted {name}: {error}") from error
dist.barrier()
nvshmem.finalize()
dist.destroy_process_group()
except BaseException:
try:
dist.destroy_process_group()
except Exception:
pass
raise
# ── tests ─────────────────────────────────────────────────────────────────────
@@ -777,3 +1167,17 @@ def test_moe_fwd_bwd_single_token_auto_dispatch():
compiled configurations while every rank participates in NVSHMEM.
"""
_run(_world_size(), _single_token_auto_dispatch_worker)
@pytest.mark.skipif(_NDEV < 2, reason="needs >=2 CUDA devices")
def test_moe_all_tuned_configs_match_torch():
"""Every unique tuned template must match the differentiable torch reference."""
_run(_world_size(), _all_tuned_configs_worker)
@pytest.mark.skipif(_NDEV < 2, reason="needs >=2 CUDA devices")
def test_moe_stacked_forward_metadata_lifetime():
"""Each outstanding forward keeps distinct routing counts for backward."""
_run(_world_size(), _stacked_forward_metadata_worker)
+57 -18
View File
@@ -56,7 +56,8 @@ using Element = cutlass::bfloat16_t;
using TraitsFused = Mlp1Traits<Element, /*TileM=*/128, /*TileN=*/128,
/*TileK=*/64, /*Stages=*/4, /*EpiChunkN=*/64>;
using TraitsAct = Mlp1Traits<Element, /*TileM=*/128, /*TileN=*/128,
/*TileK=*/64, /*Stages=*/3, /*EpiChunkN=*/32>;
/*TileK=*/64, /*Stages=*/4, /*EpiChunkN=*/32,
/*ActStoreTileM=*/32>;
#define CUDA_OK(expr) \
do { \
@@ -215,9 +216,10 @@ mlp1_act_test_kernel(
return liger::mlp1_make_pipe<Traits>(smem.pipe_storage);
}();
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 1000)
cute::TMEM::Allocator1Sm tmem_alloc{};
cute::TMEM::Allocator2Sm tmem_alloc{};
if constexpr (Compute == 100) {
constexpr int kTmemColumns = Traits::AccStages * (2 * Traits::TileN);
cute::cluster_sync();
if (warp_id == 3) {
tmem_alloc.allocate(kTmemColumns, &smem.tile.tmem_base);
__syncwarp();
@@ -225,9 +227,12 @@ mlp1_act_test_kernel(
}
#endif
__syncthreads();
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 1000)
if constexpr (Compute == 100)
cute::cluster_sync();
#endif
PipeState prod_state = cutlass::make_producer_start_state<Pipeline>();
PipeState cons_state;
uint32_t pipe_count = 0;
// Single block per M-tile here (gridDim.y == 1), so split_idx/num_splits
// degenerate to "this block owns every n-tile".
@@ -237,9 +242,13 @@ mlp1_act_test_kernel(
for (int m = blockIdx.x; m < num_m_tiles; m += gridDim.x) {
int expert = expert_ids[m];
int expert_n_offset = expert * num_n_tiles;
PipeState state = is_producer
? cutlass::make_producer_start_state<Pipeline>()
: PipeState{};
state.advance(pipe_count);
if (is_producer) {
liger::mlp1_fused_act_producer<Traits, Expert3D>(
pipe, prod_state, smem.tile,
pipe, state, smem.tile,
tma_load_x, tma_load_b, tma_load_c,
m, Expert3D ? expert : expert_n_offset,
num_tokens, hidden_dim,
@@ -249,14 +258,14 @@ mlp1_act_test_kernel(
} else if (is_consumer) {
if constexpr (Compute == 100) {
liger::mlp1_fused_act_consumer<Traits, 100>(
pipe, cons_state, smem.tile,
pipe, state, smem.tile,
tma_store_du, tma_store_dv, tma_store_z,
m, num_n_tiles * Traits::TileN,
num_m_tiles, num_n_tiles, num_k_tiles, split_idx, num_splits);
} else {
#if !defined(__CUDA_ARCH__) || (__CUDA_ARCH__ < 1000)
liger::mlp1_fused_act_consumer<Traits, 90>(
pipe, cons_state, smem.tile,
pipe, state, smem.tile,
tma_store_du, tma_store_dv, tma_store_z,
m, num_n_tiles * Traits::TileN,
num_m_tiles, num_n_tiles, num_k_tiles, split_idx, num_splits);
@@ -265,11 +274,13 @@ mlp1_act_test_kernel(
#endif
}
}
pipe_count = state.count();
}
__syncthreads();
#if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ >= 1000)
if constexpr (Compute == 100) {
constexpr int kTmemColumns = Traits::AccStages * (2 * Traits::TileN);
cute::cluster_sync();
if (warp_id == 3) {
tmem_alloc.release_allocation_lock();
tmem_alloc.free(smem.tile.tmem_base, kTmemColumns);
@@ -371,7 +382,8 @@ static RefOutputs cpu_reference(
}
// Build host inputs (bf16-rounded floats) + device buffers shared by both
// variants. expert_ids[m] = m % num_experts.
// variants. Offset large-E cases to exercise production-scale flattened TMA
// coordinates without requiring many M tiles.
struct Inputs {
std::vector<float> X, B, C; // bf16-rounded host copies
std::vector<int> expert_ids;
@@ -398,7 +410,8 @@ static void make_inputs(const Mlp1Shape& s, Inputs& in, unsigned seed) {
in.total_n_rows = s.num_experts * s.intermediate_dim;
in.expert_ids.resize(in.num_m_tiles);
for (int m = 0; m < in.num_m_tiles; ++m) in.expert_ids[m] = m % s.num_experts;
for (int m = 0; m < in.num_m_tiles; ++m)
in.expert_ids[m] = (m + (s.num_experts > 48 ? 48 : 0)) % s.num_experts;
upload_bf16(in.dX, in.X);
upload_bf16(in.dB, in.B);
@@ -565,21 +578,46 @@ static void run_act(const Mlp1Shape& s) {
return make_tma_copy(SM90_TMA_LOAD{}, tC, typename Traits::SmemLayoutW_1{});
}
}();
auto tma_du = make_tma_copy(SM90_TMA_STORE{}, mkZ(dU), typename Traits::SmemLayoutStoreSlot{});
auto tma_dv = make_tma_copy(SM90_TMA_STORE{}, mkZ(dV), typename Traits::SmemLayoutStoreSlot{});
auto tma_z = make_tma_copy(SM90_TMA_STORE{}, mkZ(dZ), typename Traits::SmemLayoutStoreSlot{});
auto tma_du = make_tma_copy(
SM90_TMA_STORE{}, mkZ(dU), typename Traits::SmemLayoutActStoreSlot{});
auto tma_dv = make_tma_copy(
SM90_TMA_STORE{}, mkZ(dV), typename Traits::SmemLayoutActStoreSlot{});
auto tma_z = make_tma_copy(
SM90_TMA_STORE{}, mkZ(dZ), typename Traits::SmemLayoutActStoreSlot{});
size_t smem_size = sizeof(Mlp1ActKernelSmem<Traits, Compute>);
size_t smem_size = Compute == 100
? static_cast<size_t>(232000)
: sizeof(Mlp1ActKernelSmem<Traits, Compute>);
auto kernel = mlp1_act_test_kernel<Traits, Compute, Compute == 90,
decltype(tma_x), decltype(tma_b), decltype(tma_z)>;
CUDA_OK(cudaFuncSetAttribute(kernel,
cudaFuncAttributeMaxDynamicSharedMemorySize, smem_size));
dim3 grid(in.num_m_tiles, 1);
kernel<<<grid, Traits::NumThreads, smem_size>>>(
tma_x, tma_b, tma_c, tma_du, tma_dv, tma_z, in.d_expert_ids,
s.num_tokens, s.hidden_dim, in.total_n_rows, in.num_m_tiles, in.num_n_tiles);
CUDA_OK(cudaGetLastError());
dim3 grid(2, 4);
if constexpr (Compute == 100) {
cudaLaunchConfig_t config{};
config.gridDim = grid;
config.blockDim = Traits::NumThreads;
config.dynamicSmemBytes = smem_size;
cudaLaunchAttribute cluster_attr{};
cluster_attr.id = cudaLaunchAttributeClusterDimension;
cluster_attr.val.clusterDim.x = 2;
cluster_attr.val.clusterDim.y = 1;
cluster_attr.val.clusterDim.z = 1;
config.attrs = &cluster_attr;
config.numAttrs = 1;
CUDA_OK(cudaLaunchKernelEx(
&config, kernel,
tma_x, tma_b, tma_c, tma_du, tma_dv, tma_z, in.d_expert_ids,
s.num_tokens, s.hidden_dim, in.total_n_rows,
in.num_m_tiles, in.num_n_tiles));
} else {
kernel<<<grid, Traits::NumThreads, smem_size>>>(
tma_x, tma_b, tma_c, tma_du, tma_dv, tma_z, in.d_expert_ids,
s.num_tokens, s.hidden_dim, in.total_n_rows,
in.num_m_tiles, in.num_n_tiles);
CUDA_OK(cudaGetLastError());
}
CUDA_OK(cudaDeviceSynchronize());
auto U = download_rows(dU, padded, s.num_tokens, s.intermediate_dim);
@@ -874,6 +912,7 @@ static const std::vector<Mlp1Shape> kShapes = {
{128, 512, 256, 1}, // deeper K, two N-tiles
{256, 256, 256, 2}, // two M-tiles across two experts
{384, 256, 128, 3}, // three M-tiles, one expert each
{1280, 2048, 512, 1}, // reaches pipeline count 130 on the fifth M tile
};
// Large, GPU-saturating shapes for the TFLOPS benchmark. T is a multiple of
@@ -60,7 +60,7 @@ using Element = cutlass::bfloat16_t;
// Shape/pipeline config. TileM=128 exercises the cooperative M-split (Hopper)
// and MSub=2 row-tile store (Blackwell). EpiChunkN=32 → TmemLoadOp<32> =
// SM100_TMEM_LOAD_32dp32b32x on the Blackwell epilogue.
using TraitsT = Mlp2TTraits<Element, /*TileM=*/128, /*TileN=*/128,
using TraitsT = Mlp2TTraits<Element, /*TileM=*/128, /*TileN=*/256,
/*TileK=*/64, /*Stages=*/4, /*EpiChunkN=*/32>;
#define CUDA_OK(expr) \
@@ -137,12 +137,12 @@ mlp2_t_fused_test_kernel(
int expert = expert_ids[m];
// mlp2_t: the expert is contiguous along K (= hidden_dim), so the
// weight offset is along k_tile.
int expert_k_offset = expert * num_k_tiles;
if (is_producer) {
liger::mlp2_t_fused_producer<Traits, Compute == 90>(
liger::mlp2_t_fused_producer<Traits, /*Expert3D=*/true,
/*ThrottleTma=*/Compute == 100>(
pipe, prod_state, smem.tile,
tma_load_z, tma_load_a,
m, (Compute == 90) ? expert : expert_k_offset,
m, expert,
num_tokens, hidden_dim, intermediate_dim,
total_k_cols / hidden_dim, total_k_cols,
num_n_tiles, num_k_tiles);
@@ -281,7 +281,8 @@ static void make_inputs(const Mlp2Shape& s, Inputs& in, unsigned seed) {
in.total_k_cols = s.num_experts * s.hidden_dim; // K columns = E·H
in.expert_ids.resize(in.num_m_tiles);
for (int m = 0; m < in.num_m_tiles; ++m) in.expert_ids[m] = m % s.num_experts;
for (int m = 0; m < in.num_m_tiles; ++m)
in.expert_ids[m] = (m + (s.num_experts > 233 ? 233 : 0)) % s.num_experts;
upload_bf16(in.dZ, in.Z);
upload_bf16(in.dA, in.A);
@@ -314,18 +315,11 @@ static auto make_tma_z(const Inputs& in, const Mlp2Shape& s) {
}
template <typename Traits, int Compute>
static auto make_tma_a(const Inputs& in, const Mlp2Shape& s) {
if constexpr (Compute == 90) {
auto tA = make_tensor(make_gmem_ptr(in.dA.ptr),
make_shape(s.intermediate_dim, s.hidden_dim, s.num_experts),
make_stride(Int<1>{}, s.intermediate_dim,
s.hidden_dim * s.intermediate_dim));
return make_tma_copy(SM90_TMA_LOAD{}, tA, typename Traits::SmemLayoutW_1{});
} else {
auto tA = make_tensor(make_gmem_ptr(in.dA.ptr),
make_shape(s.intermediate_dim, in.total_k_cols),
make_stride(Int<1>{}, s.intermediate_dim));
return make_tma_copy(SM90_TMA_LOAD{}, tA, typename Traits::SmemLayoutW_1{});
}
auto tA = make_tensor(make_gmem_ptr(in.dA.ptr),
make_shape(s.intermediate_dim, s.hidden_dim, s.num_experts),
make_stride(Int<1>{}, s.intermediate_dim,
s.hidden_dim * s.intermediate_dim));
return make_tma_copy(SM90_TMA_LOAD{}, tA, typename Traits::SmemLayoutW_1{});
}
template <typename Traits>
static auto make_tma_y(Element* dY, int padded, const Mlp2Shape& s) {
@@ -389,7 +383,7 @@ template <int Compute>
static void run_t_single_tile() {
using Traits = TraitsT;
const int TM = Traits::TileM;
Mlp2Shape s{ /*T=*/TM, /*H=*/TM, /*I=*/TM, /*E=*/1 };
Mlp2Shape s{ /*T=*/TM, /*H=*/TM, /*I=*/Traits::TileN, /*E=*/1 };
Inputs in; make_inputs<Traits>(s, in, /*seed=*/7);
int padded = in.num_m_tiles * Traits::TileM;
@@ -583,13 +577,14 @@ static bool hopper_available() {
}
// Small correctness shapes. T mult of TileM (128), H mult of TileK (64) — the K
// (contraction) axis; I mult of TileN (128) — the N (output) axis. Exact FLOP
// (contraction) axis; I mult of TileN (256) — the N (output) axis. Exact FLOP
// count, no padding.
static const std::vector<Mlp2Shape> kShapes = {
{128, 128, 128, 1}, // single M-tile, single N-tile, single expert
{128, 128, 256, 1}, // single M-tile, single N-tile, single expert
{128, 64, 256, 1}, // shallow K (1 k-step), two N-tiles
{256, 256, 256, 2}, // two M-tiles across two experts, deeper K
{384, 128, 256, 3}, // three M-tiles, one expert each
{128, 2048, 512, 256}, // production-scale expert 233
};
// Large, GPU-saturating shapes for the TFLOPS benchmark. T mult of TileM (128)
@@ -6,15 +6,20 @@
#include <tvm/ffi/extra/module.h>
#include <tvm/ffi/function.h>
#include <algorithm>
#include <array>
#include <cmath>
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "moe_dispatch_configs_sm90.cuh"
#include "moe_dispatch_configs_sm100.cuh"
#include "moe_fwd_bwd_tuning_configs.cuh"
namespace {
@@ -25,10 +30,12 @@ namespace ffi = tvm::ffi;
#endif
constexpr int kTokens = 256;
constexpr int kHiddenDim = 512;
constexpr int kIntermediateDim = 2048;
constexpr int kHiddenDim = 2048;
constexpr int kIntermediateDim = 768;
constexpr int kNumExperts = 16;
constexpr int kTopK = 1;
constexpr int kCommTileM = 128;
constexpr int kBwdRepeats = 3;
DLDataType bf16_dtype() { return DLDataType{kDLBfloat, 16, 1}; }
DLDataType i32_dtype() { return DLDataType{kDLInt, 32, 1}; }
@@ -117,6 +124,69 @@ std::string force_string(const BwdConfig& c) {
return os.str();
}
bool matches(const BwdConfig& dispatch, const liger::TunedConfigFwdBwd& tuned) {
return dispatch.ns2 == tuned.Bwd_NSplit2 &&
dispatch.tn1 == tuned.Bwd_TileN1 &&
dispatch.tk1 == tuned.Bwd_TileK1 &&
dispatch.s1 == tuned.Bwd_Stages1 &&
dispatch.tm3 == tuned.Bwd_TileM3 &&
dispatch.tn3 == tuned.Bwd_TileN3 &&
dispatch.tk3 == tuned.Bwd_TileK3 &&
dispatch.s3 == tuned.Bwd_Stages3 &&
dispatch.en1 == tuned.Bwd_EpiChunkN1 &&
dispatch.en25 == tuned.Bwd_EpiChunkN25 &&
dispatch.en34 == tuned.Bwd_EpiChunkN34 &&
dispatch.cs == tuned.Bwd_CommNumStages &&
dispatch.tm == tuned.Bwd_TileM &&
dispatch.gtm == tuned.Bwd_TileM;
}
void expect_tuned_rows_dispatchable(
int compute,
const liger::TunedConfigFwdBwdTable* tables,
int table_count) {
const auto configs = all_bwd_configs();
for (int table_index = 0; table_index < table_count; ++table_index) {
const auto& table = tables[table_index];
if (table.Compute != compute) continue;
for (int i = 0; i < table.count; ++i) {
const auto& tuned = table.configs[i];
EXPECT_TRUE(std::any_of(
configs.begin(), configs.end(), [&](const BwdConfig& dispatch) {
return dispatch.compute == compute && matches(dispatch, tuned);
})) << "missing dispatch row for tuned BWD config at index " << i;
}
}
}
bool table_contains(
const BwdConfig& dispatch,
int compute,
const liger::TunedConfigFwdBwdTable* tables,
int table_count) {
for (int table_index = 0; table_index < table_count; ++table_index) {
const auto& table = tables[table_index];
if (table.Compute != compute) continue;
for (int i = 0; i < table.count; ++i)
if (matches(dispatch, table.configs[i])) return true;
}
return false;
}
void expect_dispatch_rows_tuned(int compute) {
for (const auto& dispatch : all_bwd_configs()) {
if (dispatch.compute != compute) continue;
EXPECT_TRUE(
table_contains(
dispatch, compute, liger::kTunedConfigTablesSingle,
liger::kNumTunedConfigTablesSingle) ||
table_contains(
dispatch, compute, liger::kTunedConfigTablesMulti,
liger::kNumTunedConfigTablesMulti))
<< "untuned backward dispatch row: " << force_string(dispatch);
}
}
int compute_dispatch_key() {
int dev = 0;
cudaDeviceProp prop{};
@@ -207,6 +277,41 @@ struct DeviceBuffer {
DeviceBuffer& operator=(const DeviceBuffer&) = delete;
};
std::vector<uint16_t> copy_bf16(const DeviceBuffer& buffer) {
std::vector<uint16_t> host(buffer.bytes / sizeof(uint16_t));
check_cuda(cudaMemcpy(
host.data(), buffer.ptr, buffer.bytes, cudaMemcpyDeviceToHost),
"cudaMemcpy finite check");
return host;
}
bool all_finite_bf16(const std::vector<uint16_t>& values) {
return std::all_of(values.begin(), values.end(), [](uint16_t value) {
return (value & UINT16_C(0x7f80)) != UINT16_C(0x7f80);
});
}
float bf16_to_float(uint16_t value) {
uint32_t bits = static_cast<uint32_t>(value) << 16;
float result;
std::memcpy(&result, &bits, sizeof(result));
return result;
}
bool mean_relative_close(
const std::vector<uint16_t>& actual,
const std::vector<uint16_t>& expected) {
if (actual.size() != expected.size() || actual.empty()) return false;
double relative_error = 0.0;
for (size_t i = 0; i < actual.size(); ++i) {
const float actual_value = bf16_to_float(actual[i]);
const float expected_value = bf16_to_float(expected[i]);
relative_error += std::abs(actual_value - expected_value) /
std::max(std::abs(expected_value), 1.0e-3f);
}
return relative_error / actual.size() < 0.15;
}
struct MoeBuffers {
int n_pes;
int num_experts;
@@ -234,7 +339,7 @@ struct MoeBuffers {
MoeBuffers(int pes, int device_id)
: n_pes(pes),
num_experts(pes > 0 ? pes : 1),
num_experts(kNumExperts),
experts_per_pe(num_experts / n_pes),
max_total_slots(kTokens * kTopK + num_experts * kCommTileM),
tile_id_slots(max_total_slots / kCommTileM),
@@ -254,12 +359,19 @@ struct MoeBuffers {
dC(sizeof(uint16_t) * experts_per_pe * kIntermediateDim * kHiddenDim),
dA(sizeof(uint16_t) * experts_per_pe * kHiddenDim * kIntermediateDim),
dW(sizeof(uint16_t) * kTokens * kTopK),
symm_meta(13) {
symm_meta(17) {
std::vector<int32_t> h_indices(kTokens * kTopK);
for (int t = 0; t < kTokens; ++t) h_indices[t] = t % num_experts;
check_cuda(cudaMemcpy(expert_indices.ptr, h_indices.data(),
h_indices.size() * sizeof(int32_t), cudaMemcpyHostToDevice),
"cudaMemcpy expert_indices");
check_cuda(cudaMemset(X.ptr, 0x3f, X.bytes), "initialize X");
check_cuda(cudaMemset(dY.ptr, 0x3f, dY.bytes), "initialize dY");
check_cuda(cudaMemset(expert_weights.ptr, 0x3f, expert_weights.bytes),
"initialize expert_weights");
check_cuda(cudaMemset(all_B.ptr, 0x3f, all_B.bytes), "initialize B");
check_cuda(cudaMemset(all_C.ptr, 0x3f, all_C.bytes), "initialize C");
check_cuda(cudaMemset(all_A.ptr, 0x3f, all_A.bytes), "initialize A");
}
DLDevice cuda_dev() const { return cuda_device(device); }
@@ -408,6 +520,7 @@ void run_dispatch_coverage_for_compute(int target_compute) {
ASSERT_FALSE(fwd_configs.empty());
ASSERT_FALSE(bwd_configs.empty());
std::vector<uint16_t> reference_y;
unsetenv("LIGER_MOE_BWD_FORCE_CONFIG");
for (const auto& cfg : fwd_configs) {
const std::string force = force_string(cfg);
@@ -415,19 +528,52 @@ void run_dispatch_coverage_for_compute(int target_compute) {
SCOPED_TRACE("fwd " + force);
run_fwd(buffers, team, fwd_fn);
check_cuda(cudaDeviceSynchronize(), "fwd sync");
auto y = copy_bf16(buffers.Y);
EXPECT_TRUE(all_finite_bf16(y)) << "non-finite forward output";
if (reference_y.empty())
reference_y = y;
else
EXPECT_TRUE(mean_relative_close(y, reference_y))
<< "forward output differs from the reference template";
pop_fwd_fn();
}
const std::string fwd_force = force_string(fwd_configs.front());
setenv("LIGER_MOE_FORCE_CONFIG", fwd_force.c_str(), 1);
std::array<std::vector<uint16_t>, 5> reference_grads;
bool have_reference_grads = false;
const char* grad_names[] = {"dX", "dB", "dC", "dA", "dW"};
for (const auto& cfg : bwd_configs) {
const std::string force = force_string(cfg);
setenv("LIGER_MOE_BWD_FORCE_CONFIG", force.c_str(), 1);
SCOPED_TRACE("bwd " + force);
run_fwd(buffers, team, fwd_fn);
run_bwd(buffers, team, bwd_fn);
check_cuda(cudaDeviceSynchronize(), "bwd sync");
pop_fwd_fn();
for (int repeat = 0; repeat < kBwdRepeats; ++repeat) {
SCOPED_TRACE("repeat " + std::to_string(repeat));
run_fwd(buffers, team, fwd_fn);
run_bwd(buffers, team, bwd_fn);
check_cuda(cudaDeviceSynchronize(), "bwd sync");
std::array<std::vector<uint16_t>, 5> grads = {
copy_bf16(buffers.dX),
copy_bf16(buffers.dB),
copy_bf16(buffers.dC),
copy_bf16(buffers.dA),
copy_bf16(buffers.dW),
};
for (size_t i = 0; i < grads.size(); ++i) {
EXPECT_TRUE(all_finite_bf16(grads[i]))
<< "non-finite " << grad_names[i];
if (have_reference_grads) {
EXPECT_TRUE(mean_relative_close(grads[i], reference_grads[i]))
<< grad_names[i]
<< " differs from the reference backward template";
}
}
if (!have_reference_grads) {
reference_grads = std::move(grads);
have_reference_grads = true;
}
pop_fwd_fn();
}
}
unsetenv("LIGER_MOE_FORCE_CONFIG");
@@ -447,6 +593,30 @@ TEST(MoeApiDispatchSm100, RunsEveryForwardAndBackwardDispatchEntry) {
run_dispatch_coverage_for_compute(100);
}
#if LIGER_CUTE_DISPATCH_COMPUTE == 0 || LIGER_CUTE_DISPATCH_COMPUTE == 90
TEST(MoeApiDispatchSm90, EveryTunedBackwardRowIsDispatchable) {
expect_tuned_rows_dispatchable(
90, liger::kTunedConfigTablesSingle,
liger::kNumTunedConfigTablesSingle);
expect_tuned_rows_dispatchable(
90, liger::kTunedConfigTablesMulti,
liger::kNumTunedConfigTablesMulti);
expect_dispatch_rows_tuned(90);
}
#endif
#if LIGER_CUTE_DISPATCH_COMPUTE == 0 || LIGER_CUTE_DISPATCH_COMPUTE == 100
TEST(MoeApiDispatchSm100, EveryTunedBackwardRowIsDispatchable) {
expect_tuned_rows_dispatchable(
100, liger::kTunedConfigTablesSingle,
liger::kNumTunedConfigTablesSingle);
expect_tuned_rows_dispatchable(
100, liger::kTunedConfigTablesMulti,
liger::kNumTunedConfigTablesMulti);
expect_dispatch_rows_tuned(100);
}
#endif
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();