From e804c0d23872af995ded73ec93505cb3aebfc555 Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Fri, 21 Aug 2026 16:42:12 +0000 Subject: [PATCH] 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 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../csrc/core/src/moe/cta_barrier.cuh | 8 +- liger_cute_kernels/csrc/core/src/moe/mlp.cuh | 146 +++- .../csrc/core/src/moe/mlp1_fused.cuh | 44 +- .../csrc/core/src/moe/mlp1_fused_act.cuh | 190 ++-- .../csrc/core/src/moe/mlp2_fused.cuh | 57 +- .../csrc/core/src/moe/mlp2_t_fused.cuh | 19 +- liger_cute_kernels/csrc/core/src/moe/mlp3.cuh | 68 +- liger_cute_kernels/csrc/core/src/moe/mlp4.cuh | 65 +- .../csrc/core/src/moe/mlp5_fused.cuh | 1 + .../csrc/core/src/moe/mlp_bwd.cuh | 290 ++++--- .../csrc/core/src/moe/mlp_comms.cuh | 310 ++++++- .../csrc/core/src/moe/mlp_comms_bwd.cuh | 95 +- .../csrc/core/src/moe/models.cuh | 1 + liger_cute_kernels/csrc/core/src/moe/moe.cu | 147 ++-- liger_cute_kernels/csrc/core/src/moe/moe.cuh | 8 +- .../csrc/core/src/moe/moe_bwd.cu | 247 +++--- .../csrc/core/src/moe/moe_bwd.cuh | 21 +- .../csrc/core/src/moe/moe_comm_config.cuh | 45 + .../src/moe/moe_dispatch_configs_sm100.cuh | 8 +- ...moe_fwd_bwd_tuning_configs_multi_sm100.cuh | 817 ++++++++++-------- ...oe_fwd_bwd_tuning_configs_single_sm100.cuh | 714 ++++++++------- .../csrc/core/src/moe/moe_launch.h | 2 + .../csrc/core/src/moe/moe_symm_config.cuh | 9 +- .../csrc/core/src/moe/radix_sort.cuh | 2 + .../csrc/core/src/moe/tile_iterator.cuh | 48 +- .../csrc/core/src/moe/tile_iterator_bwd.cuh | 30 +- .../core/src/moe/tune/tune_moe_fwd_bwd.cu | 128 ++- .../liger_cute_kernels/tvm_ffi.py | 4 +- .../liger_cute_kernels/tvm_ffi_bindings.cpp | 13 +- .../test/test_moe_cuda_graph.py | 410 ++++++++- .../tests/cpp/test_mlp1_fused.cu | 75 +- .../tests/cpp/test_mlp2_t_fused.cu | 35 +- .../tests/cpp/test_moe_api_dispatch.cpp | 186 +++- 33 files changed, 2853 insertions(+), 1390 deletions(-) create mode 100644 liger_cute_kernels/csrc/core/src/moe/moe_comm_config.cuh diff --git a/liger_cute_kernels/csrc/core/src/moe/cta_barrier.cuh b/liger_cute_kernels/csrc/core/src/moe/cta_barrier.cuh index 92fe1bde..836192bf 100644 --- a/liger_cute_kernels/csrc/core/src/moe/cta_barrier.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/cta_barrier.cuh @@ -91,9 +91,9 @@ struct CtaCounterBarrier { __threadfence(); cutlass::arch::NamedBarrier::sync(NumThreads, BarrierId); if (threadIdx.x == 0) { - atomicAdd(counter, 1); cuda::atomic_ref 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 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(); } diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp.cuh index 891e6c79..fcfbabc3 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp.cuh @@ -81,11 +81,11 @@ struct MlpDims { template = 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( - 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( + 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( + 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( - 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( + 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( + 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( - 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( + 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( + 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( - 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( + 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( + 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); diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp1_fused.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp1_fused.cuh index 219a3222..0580b62b 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp1_fused.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp1_fused.cuh @@ -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>, Stride, _1>>; using SmemLayoutStore_1 = SmemLayoutStoreSlot; + using SmemLayoutActStoreSlot = Layout< + Shape, Int>, + Stride, _1>>; using MainloopPipeline = cutlass::PipelineTmaAsync; using PipelineState = cutlass::PipelineState; @@ -283,7 +292,8 @@ __device__ __forceinline__ auto mlp1_make_pipe_umma( // Single fused X + W1 + W2 TMA pipe per k-step. // ═══════════════════════════════════════════════════════════════════ -template __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{}, Int{}), - 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{}, Int{}), + 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 +template 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 +template 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{}, Int{}), @@ -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(...) to select the Blackwell path. // ─────────────────────────────────────────────────────────────────── -template __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::template run( + Mlp1FusedConsumerImpl::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); } diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp1_fused_act.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp1_fused_act.cuh index 4a40ea73..8cbcec81 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp1_fused_act.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp1_fused_act.cuh @@ -44,7 +44,8 @@ struct Mlp1FusedActSmem { static constexpr int smem_X_size = cosize_v; static constexpr int smem_W_size = cosize_v; - static constexpr int smem_store_size = cosize_v; + static constexpr int smem_store_size = + cosize_v; 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(uprime); - sStoreV(m_local, chunk_n) = static_cast(vprime); - sStoreZ(m_local, chunk_n) = static_cast(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(v * sil_d); + sStoreV(store_m, chunk_n) = + static_cast(vprime); + sStoreZ(store_m, chunk_n) = + static_cast(vprime * v); + } } - auto gU = local_tile(mU, - make_tile(Int{}, Int{}), - make_coord(row_tile, col_tile)); - auto gV = local_tile(mV, - make_tile(Int{}, Int{}), - make_coord(row_tile, col_tile)); - auto gZ = local_tile(mZ, - make_tile(Int{}, Int{}), - 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{}, + Int{}); + 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(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(v * sil_d); // V·silu'(U) - sStoreV(m_loc, n_col) = static_cast(vprime); // silu(U) - sStoreZ(m_loc, n_col) = static_cast(vprime * v); // V'·V + float uprime = v * sil_d; + Element uprime_e = static_cast(uprime); + Element vprime_e = static_cast(vprime); + Element z_e = static_cast(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{}, Int{}), + make_tile(Int{}, Int{}), make_coord(row_tile, col_tile)); auto gV = local_tile(mV, - make_tile(Int{}, Int{}), + make_tile(Int{}, Int{}), make_coord(row_tile, col_tile)); auto gZ = local_tile(mZ, - make_tile(Int{}, Int{}), + make_tile(Int{}, Int{}), make_coord(row_tile, col_tile)); copy(tma_store_du_coef, cta_tma_u.partition_S(sStoreU), cta_tma_u.partition_D(gU)); diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp2_fused.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp2_fused.cuh index 4ab0a732..3e8dd89d 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp2_fused.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp2_fused.cuh @@ -268,7 +268,8 @@ __device__ __forceinline__ auto mlp2_make_pipe_umma( // Single fused Z + W TMA pipe per k-step. // ═══════════════════════════════════════════════════════════════════ -template __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{}, Int{}), - 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{}, Int{}), + 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 +template 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 +template 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{}, Int{}), @@ -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(...) to select the Blackwell path. // ─────────────────────────────────────────────────────────────────── -template +template __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::template run( + int num_splits = -1, + int valid_m64_subtiles = -1) { + Mlp2FusedConsumerImpl::template run( 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 diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp2_t_fused.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp2_t_fused.cuh index 65635f91..c3a5f264 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp2_t_fused.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp2_t_fused.cuh @@ -130,7 +130,8 @@ __device__ __forceinline__ auto mlp2_t_make_pipe_umma( // with N along intermediate_dim and K along E·hidden_dim. // ═══════════════════════════════════════════════════════════════════ -template __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(); + 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 diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp3.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp3.cuh index 77df8381..df72f67d 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp3.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp3.cuh @@ -819,14 +819,27 @@ __device__ __forceinline__ void mlp3_consumer( int cell_stride, int batch_kb_start, int batch_kb_end, - int k_split) { - Mlp3ConsumerImpl::template run( - 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::template run( + 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::template run( + 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 = diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp4.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp4.cuh index ee5b0661..b14867dd 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp4.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp4.cuh @@ -849,13 +849,25 @@ __device__ __forceinline__ void mlp4_consumer( int cell_stride, int batch_kb_start, int batch_kb_end, - int k_split) { - Mlp4ConsumerImpl::template run( - 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::template run( + 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::template run( + 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>(); diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp5_fused.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp5_fused.cuh index 2a703bc6..cf7c2588 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp5_fused.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp5_fused.cuh @@ -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 diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp_bwd.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp_bwd.cuh index ebc4d0b0..db10238e 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp_bwd.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp_bwd.cuh @@ -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 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>( pa_count, warp_id == 0); - if (warp_id == 0) + if (warp_id == 0) { mlp1_fused_act_producer(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(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>( pb_count, warp_id == 0); - if (warp_id == 0) - mlp2_t_fused_producer(pb_pipe, s, + if (warp_id == 0) { + mlp2_t_fused_producer(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(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>( pd_count, warp_id == 0); - if (warp_id == 0) + if (warp_id == 0) { mlp5_fused_producer(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(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; - 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( @@ -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( @@ -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( 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 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::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( - 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( + 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( - 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( + 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( - 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( + 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( - 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( + 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( 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); } } diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp_comms.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp_comms.cuh index 01b81a16..e30bb495 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp_comms.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp_comms.cuh @@ -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 +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 +template __device__ __forceinline__ void do_get( - StagePipe& src_pipe, + StagePipe& 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 +template __device__ __forceinline__ void do_put( - StagePipe& dst_pipe, + StagePipe& 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 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 +template __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 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 dst_pipe; - dst_pipe.init(bufs.dst_ready + xc, bufs.dst_consumed + xc, is_leader, MC, - runtime_nsplit, kNumPutWarpsFwd * NC); + StagePipe 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( + 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( 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 src_pipe; - src_pipe.init(bufs.src_ready + xc, bufs.src_consumed + xc, is_leader, MC, - kNumGetWarpsFwd * NC, runtime_nsplit); + StagePipe 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( + constexpr int kRowsPerSubtile = TileM / MSubTiles; + bool row_empty = + info.valid_rows <= m_subtile * kRowsPerSubtile; + int s = src_pipe.producer_stage(); + do_get( 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); + } } } } diff --git a/liger_cute_kernels/csrc/core/src/moe/mlp_comms_bwd.cuh b/liger_cute_kernels/csrc/core/src/moe/mlp_comms_bwd.cuh index 1b758192..4aef2359 100644 --- a/liger_cute_kernels/csrc/core/src/moe/mlp_comms_bwd.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/mlp_comms_bwd.cuh @@ -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 +// 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 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 +template __device__ __forceinline__ void do_get_bwd_tma( StagePipe& 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; + using Bounce = GetBounceBwd; 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(bounce_warp); - uint64_t* mbar = reinterpret_cast(bounce_warp + Bounce::kBoxBytes); + uint64_t* mbar = reinterpret_cast( + 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 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 +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 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( + do_get_bwd_tma( 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( + do_get_bwd_tma( 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); diff --git a/liger_cute_kernels/csrc/core/src/moe/models.cuh b/liger_cute_kernels/csrc/core/src/moe/models.cuh index be61f164..d53d4ac0 100644 --- a/liger_cute_kernels/csrc/core/src/moe/models.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/models.cuh @@ -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 diff --git a/liger_cute_kernels/csrc/core/src/moe/moe.cu b/liger_cute_kernels/csrc/core/src/moe/moe.cu index ae6ddc4b..ddc23795 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe.cu +++ b/liger_cute_kernels/csrc/core/src/moe/moe.cu @@ -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; - using RemoteIter = RemoteMlpTileIterator; + 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(cfg.max_total_slots) * cfg.hidden_dim * kElemBytes; std::size_t all_off_bytes = static_cast(cfg.num_pes) * (cfg.max_num_experts + 1) * sizeof(int); + std::size_t all_count_bytes = + static_cast(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 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 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 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 allocate_moe_buffers( // Output Y -- symmetric, local MLP writes here, remote PEs put here. b.y_buf = reinterpret_cast(sym_stack.put(kSymmKeyYBuf)); - size_t actual_y_bytes = static_cast(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 allocate_moe_buffers( b.src_staging = reinterpret_cast(pool.get_symmetric("moe_src_staging", src_bytes)); b.dst_staging = reinterpret_cast(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(sm_count) * scfg.max_comm_stages; + size_t sig_bytes = signal_l_ub * sizeof(int); b.src_ready = static_cast(pool.get_device("moe_src_ready", sig_bytes)); b.src_consumed = static_cast(pool.get_device("moe_src_consumed", sig_bytes)); b.dst_ready = static_cast(pool.get_device("moe_dst_ready", sig_bytes)); @@ -433,12 +441,13 @@ static MoeBuffers 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(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(sym_stack.put(kSymmKeyAllExpertOffsets)); + b.all_expert_counts = static_cast(sym_stack.put(kSymmKeyAllExpertCounts)); // CTA counter for local all-CTA barriers around NVSHMEM collectives. b.cta_counter = static_cast( @@ -460,6 +469,8 @@ static MoeBuffers allocate_moe_buffers( b.token_expert_slots = token_expert_slots_ptr; b.expert_offsets = static_cast( pool.get_symmetric("moe_sort_offsets", (scfg.max_num_experts + 1) * sizeof(int))); + b.expert_counts = static_cast( + pool.get_symmetric("moe_sort_counts", scfg.max_num_experts * sizeof(int))); b.cta_done = static_cast( pool.get_device("moe_sort_cta_done", num_blocks * sizeof(int))); b.cta_sums = static_cast( @@ -586,7 +597,15 @@ moe_fused_kernel( size_t offsets_region = sizeof(MoeSmem); offsets_region = (offsets_region + sizeof(int) - 1) & ~(sizeof(int) - 1); - smem.comm.remote_offsets = reinterpret_cast(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(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( + 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; 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); 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(comm_l) * sizeof(int); + size_t sig_bytes = + static_cast(comm_l) * Config::kSubTiles * sizeof(int); + size_t eid_bytes = static_cast(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(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; } // ───────────────────────────────────────────────────────────────────── diff --git a/liger_cute_kernels/csrc/core/src/moe/moe.cuh b/liger_cute_kernels/csrc/core/src/moe/moe.cuh index bfc024c5..ca547ba9 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/moe.cuh @@ -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 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, diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cu b/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cu index 48be2875..af92ccc5 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cu +++ b/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cu @@ -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; // 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; - using RemoteIter = RemoteMlpTileIteratorBwd; - using FusedIter = FusedMlpTileIteratorBwd; + 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 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 allocate_moe_bwd_buffers( pool.get_device("moe_bwd_tile_expert_ids_x", eid_bytes)); b.tile_expert_ids_dy = static_cast( pool.get_device("moe_bwd_tile_expert_ids_dy", eid_bytes)); + b.tile_valid_rows_x = static_cast( + 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); offsets_region = (offsets_region + sizeof(int) - 1) & ~(sizeof(int) - 1); - smem.comm.remote_offsets = reinterpret_cast(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(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( + 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(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(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(intermediate_dim), - static_cast(hidden_dim), - static_cast(experts_per_pe)), - make_stride( - Int<1>{}, - static_cast(intermediate_dim), - static_cast(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(intermediate_dim), + static_cast(hidden_dim), + static_cast(experts_per_pe)), + make_stride( + Int<1>{}, + static_cast(intermediate_dim), + static_cast(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::kTotalBytes; + constexpr int kGetBoxRowsBwd = Config::kCompute == 100 + ? liger::kGetBoxRowsBwdSm100 + : liger::kGetBoxRowsBwdSm90; + size_t get_bounce_bytes_bwd = + (size_t)liger::GetBounceBwd::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); 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(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(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(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; + 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(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, diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cuh b/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cuh index 92493e88..726c9d4c 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/moe_bwd.cuh @@ -41,8 +41,8 @@ struct MoeBwdSmem { template 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& 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 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(&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< diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_comm_config.cuh b/liger_cute_kernels/csrc/core/src/moe/moe_comm_config.cuh new file mode 100644 index 00000000..fea0e146 --- /dev/null +++ b/liger_cute_kernels/csrc/core/src/moe/moe_comm_config.cuh @@ -0,0 +1,45 @@ +#pragma once + +namespace liger { + +template +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 diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_dispatch_configs_sm100.cuh b/liger_cute_kernels/csrc/core/src/moe/moe_dispatch_configs_sm100.cuh index 9e672e94..f57f9f8d 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_dispatch_configs_sm100.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/moe_dispatch_configs_sm100.cuh @@ -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) diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_multi_sm100.cuh b/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_multi_sm100.cuh index e7b936ef..b5601ff0 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_multi_sm100.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_multi_sm100.cuh @@ -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 = diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_single_sm100.cuh b/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_single_sm100.cuh index b9a3c5ce..4653062f 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_single_sm100.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/moe_fwd_bwd_tuning_configs_single_sm100.cuh @@ -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 = diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_launch.h b/liger_cute_kernels/csrc/core/src/moe/moe_launch.h index e2de3af6..34caa5b1 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_launch.h +++ b/liger_cute_kernels/csrc/core/src/moe/moe_launch.h @@ -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 diff --git a/liger_cute_kernels/csrc/core/src/moe/moe_symm_config.cuh b/liger_cute_kernels/csrc/core/src/moe/moe_symm_config.cuh index 61cfb7ce..a8827991 100644 --- a/liger_cute_kernels/csrc/core/src/moe/moe_symm_config.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/moe_symm_config.cuh @@ -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; }; diff --git a/liger_cute_kernels/csrc/core/src/moe/radix_sort.cuh b/liger_cute_kernels/csrc/core/src/moe/radix_sort.cuh index ee3ca044..1527b4ef 100644 --- a/liger_cute_kernels/csrc/core/src/moe/radix_sort.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/radix_sort.cuh @@ -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; } diff --git a/liger_cute_kernels/csrc/core/src/moe/tile_iterator.cuh b/liger_cute_kernels/csrc/core/src/moe/tile_iterator.cuh index 5081bbeb..d73b8617 100644 --- a/liger_cute_kernels/csrc/core/src/moe/tile_iterator.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/tile_iterator.cuh @@ -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 +template 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 tit; // embedded comm-side walker + GemmTileIterator 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; diff --git a/liger_cute_kernels/csrc/core/src/moe/tile_iterator_bwd.cuh b/liger_cute_kernels/csrc/core/src/moe/tile_iterator_bwd.cuh index 96967d4c..79e44ca0 100644 --- a/liger_cute_kernels/csrc/core/src/moe/tile_iterator_bwd.cuh +++ b/liger_cute_kernels/csrc/core/src/moe/tile_iterator_bwd.cuh @@ -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 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 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); } diff --git a/liger_cute_kernels/csrc/core/src/moe/tune/tune_moe_fwd_bwd.cu b/liger_cute_kernels/csrc/core/src/moe/tune/tune_moe_fwd_bwd.cu index ccb8dff8..900dd9f6 100644 --- a/liger_cute_kernels/csrc/core/src/moe/tune/tune_moe_fwd_bwd.cu +++ b/liger_cute_kernels/csrc/core/src/moe/tune/tune_moe_fwd_bwd.cu @@ -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(std::min( + (tensor.numel() + kThreads - 1) / kThreads, 4096)); + if (blocks > 0) { + mark_nonfinite_bf16<<>>( + static_cast(tensor.data_ptr()), + static_cast(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 E_local_values; }; const std::vector 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 { @@ -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; diff --git a/liger_cute_kernels/liger_cute_kernels/tvm_ffi.py b/liger_cute_kernels/liger_cute_kernels/tvm_ffi.py index aac4dd8c..8b75790d 100644 --- a/liger_cute_kernels/liger_cute_kernels/tvm_ffi.py +++ b/liger_cute_kernels/liger_cute_kernels/tvm_ffi.py @@ -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 diff --git a/liger_cute_kernels/liger_cute_kernels/tvm_ffi_bindings.cpp b/liger_cute_kernels/liger_cute_kernels/tvm_ffi_bindings.cpp index 758f5732..251f53c2 100644 --- a/liger_cute_kernels/liger_cute_kernels/tvm_ffi_bindings.cpp +++ b/liger_cute_kernels/liger_cute_kernels/tvm_ffi_bindings.cpp @@ -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(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(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(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(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(token_expert_slots.data_ptr()); args.tile_expert_ids = static_cast(tile_expert_ids.data_ptr()); args.expert_offsets = static_cast(expert_offsets.ptr); + args.expert_counts = static_cast(expert_counts.ptr); args.expert_indices = static_cast(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(static_cast(symm_meta.data_ptr())[12])); + liger::moe_bwd_dispatch(args, static_cast(static_cast(symm_meta.data_ptr())[16])); } catch (const std::exception& e) { ThrowCoreError("moe_fused_bwd_bf16", e); } diff --git a/liger_cute_kernels/test/test_moe_cuda_graph.py b/liger_cute_kernels/test/test_moe_cuda_graph.py index 44b826de..493a15e4 100644 --- a/liger_cute_kernels/test/test_moe_cuda_graph.py +++ b/liger_cute_kernels/test/test_moe_cuda_graph.py @@ -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\d+)_TN1-(?P\d+)/(?P\d+)/(?P\d+)/EC(?P\d+)" + r"_TN2-(?P\d+)/(?P\d+)/(?P\d+)/EC(?P\d+)" + r"_ZB(?P\d+)_CS(?P\d+)" +) +_BWD_CONFIG_RE = re.compile( + r"BWD=NS2-(?P\d+)_TN1-(?P\d+)/(?P\d+)/(?P\d+)" + r"_TM3-(?P\d+)_TN3-(?P\d+)/(?P\d+)/(?P\d+)" + r"_EN1-(?P\d+)_EN25-(?P\d+)_EN34-(?P\d+)" + r"_CS(?P\d+)_TM(?P\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) diff --git a/liger_cute_kernels/tests/cpp/test_mlp1_fused.cu b/liger_cute_kernels/tests/cpp/test_mlp1_fused.cu index 02c6b700..0139ee75 100644 --- a/liger_cute_kernels/tests/cpp/test_mlp1_fused.cu +++ b/liger_cute_kernels/tests/cpp/test_mlp1_fused.cu @@ -56,7 +56,8 @@ using Element = cutlass::bfloat16_t; using TraitsFused = Mlp1Traits; using TraitsAct = Mlp1Traits; + /*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(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(); - 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() + : PipeState{}; + state.advance(pipe_count); if (is_producer) { liger::mlp1_fused_act_producer( - 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( - 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( - 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 X, B, C; // bf16-rounded host copies std::vector 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); + size_t smem_size = Compute == 100 + ? static_cast(232000) + : sizeof(Mlp1ActKernelSmem); auto kernel = mlp1_act_test_kernel; CUDA_OK(cudaFuncSetAttribute(kernel, cudaFuncAttributeMaxDynamicSharedMemorySize, smem_size)); - dim3 grid(in.num_m_tiles, 1); - 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); - 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<<>>( + 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 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 diff --git a/liger_cute_kernels/tests/cpp/test_mlp2_t_fused.cu b/liger_cute_kernels/tests/cpp/test_mlp2_t_fused.cu index 3b9de49d..d0e45077 100644 --- a/liger_cute_kernels/tests/cpp/test_mlp2_t_fused.cu +++ b/liger_cute_kernels/tests/cpp/test_mlp2_t_fused.cu @@ -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; #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( + liger::mlp2_t_fused_producer( 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 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 static auto make_tma_y(Element* dY, int padded, const Mlp2Shape& s) { @@ -389,7 +383,7 @@ template 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(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 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) diff --git a/liger_cute_kernels/tests/cpp/test_moe_api_dispatch.cpp b/liger_cute_kernels/tests/cpp/test_moe_api_dispatch.cpp index 89b29a96..0086d54c 100644 --- a/liger_cute_kernels/tests/cpp/test_moe_api_dispatch.cpp +++ b/liger_cute_kernels/tests/cpp/test_moe_api_dispatch.cpp @@ -6,15 +6,20 @@ #include #include +#include #include +#include #include #include +#include #include #include +#include #include #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 copy_bf16(const DeviceBuffer& buffer) { + std::vector 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& 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(value) << 16; + float result; + std::memcpy(&result, &bits, sizeof(result)); + return result; +} + +bool mean_relative_close( + const std::vector& actual, + const std::vector& 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 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 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, 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, 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();