提交记录 124289


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_cc_v41_agg1 mmmd2k. 测测你的双精度矩阵乘法-2k Accepted 100 265.427 ms 88396 KB C++17 70.50 KB
提交时间 评测时间
2026-10-04 19:57:32 2026-10-04 19:57:36
// ===== 引用(按 RULES §3;本文件正文的继承引用链在下方原样保留) =====
// [0] duck.ac 用户 **saffah_cc_v41_agg1**(本账号),提交 **#124034**
//     <https://duck.ac/submission/124034> —— 本件正文 = 该提交正文的**逐字节副本**
//     (md5 1f78d841508ed65ebf2222c209bb0886),唯一改动 = 删除 `pending_prefetch()` 体内
//     4 条 **c 象限**预取(见下);上游链(#124029 / #124021 / #124011 / #123985 / #120577 /
//     #120514 / #119223 / #118747 等)在文件内原样保留,本席未改动其中任何一行。
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120514** <https://duck.ac/submission/120514>
//     (265.772622 ms = 本题榜 1 / 现 T)—— 仅作判读口径引用,未改动其中任何一行。
// [2] 本队台账 `problems/mmmd2k/notes.md`:延迟合并注入的在册语句级分解与价签
//     ((2190)/(2192) 21.523 M / 503 拍每事件 · (2883) `d2yu_` 池 39.2 M / 机制本体 36.5 M ·
//      (2892) `d2za_` 桥 90.7% 是真 C 累加工作、真簿记仅 7.0 拍/调用 · (2906) `d2zk_` `nopend`
//      使 DRAM 冷行 +1.089 M ⇒ 该机制是资产 · (2924) `d2zq_` 冷/首触税可兑现上界 0.64× 判死 ·
//      (2097) `d2xy_` 「删叶级预取」真删除板面 **+0.503 ms**)。
// [3] 量具:`problems/mmmd2k/work/d2zr__tmp/d2zr_gate_tail.inc` = 本队认证 harness
//     (判题机与本机双向复现锚 `7e1f2b18` (n=2048) / `f52f809d` (n=1024)),本席逐字节引用。
// 许可证:以上均为 duck.ac 公开提交,未见许可证声明;本文件按 RULES §3 逐项署名引用。
// 本席未复用任何第三方代码(器械、生成器、逐项定价 harness 均自写)。
//
// ===== [d2zr_ 席] 本次思路(`pending` 延迟合并注入的「簿记侧」逐项判题机定价) =====
// 【本轮做的是什么】把 `pending` 延迟合并注入的**簿记侧**(实现选择)从**义务侧**(真 C 累加 /
//   真数据搬运)里拆出来,逐项在判题机上给拍数与执行频率,并逐项找形态。本发是其中**唯一
//   正号**的一项:**`pending_prefetch()` 的 4 条 c 象限预取流**。
// 【判题机逐项定价(免费通道 · 原位 · 旋转/Latin-square 配对 · 每臂 ≥3 读数)】
//   · 频率证书(n=2048;本席器械计数器,逐位可复现):`pending_step` 调用 **79 744**
//     (其中 `rowlim` 拦下 **22 400 = 28.1%**)· 有效步 **57 344 = 7×8192 精确** ·
//     `pending_prefetch` 调用 **41 159**(拦下 11 319)· **实际发出 29 840 次 × 28 条 =
//     835 520 条 `prefetcht0`** · 排空(`pending_finish`)**仅 512 步 = 0.9%**(合并 99.1% 在
//     叶内与核体并行完成 ⇒ 不存在「环外串行排空」问题)。
//   · **7 条预取流逐条定价**(n=1024,3 轮 Latin square × 2 发镜像 ⇒ 每臂 6 读数、位置完全平衡;
//     **孪生臂**(同一份代码的第二个实例)读数 = −0.015% ⇒ 器械无布局赝影):
//     去掉 **m 面 3 条** = **+0.227%**(承重,勿动)· 去掉 **c 象限 4 条** = **−0.117%** ·
//     全去(nopf)= **+0.251%**(与两条之和自洽)。
//   · **n=2048 复核**(warmup + 镜像双臂、同位置配对):`pfC − base` = **−1 801 336 / −1 103 482 拍**
//     ⇒ 均值 **−1 452 409 拍 = −0.155% ≈ −0.403 ms**(与在册 NOPF 真删除板面 +0.503 ms 的
//     同向比例自洽)。
// 【改动(唯一一处,零算术改动)】删除 `pending_prefetch()` 体内 4 条 **c 象限**预取
//   (`c+t` / `c+BASE+t` / `c+BASE*ldc+t` / `c+BASE*ldc+BASE+t`),保留 **m 面 3 条**不变。
//   ★ 值中性论证:`_mm_prefetch` 是**提示**、不写任何架构状态(无寄存器/内存语义)⇒ 删除后
//   发出的 kernel 调用序列、顺序、参数、C 的每一位都不变(闸门:n=2048 = `7e1f2b18` 且
//   n=1024 = `f52f809d`;本机 gcc 9.3 与判题机免费通道双重复现 ✓)。
//   ★ 机理:c 象限是**读-改-写**流(合并读一次、写一次,且其产出自内核 `vmovntpd` 直达 DRAM)
//   ⇒ 把「马上要被写」的行预取进 L1/L2 只多付一次填充与逐出;m 面 3 条是**单触只读**流、
//   正是 DRAM 延迟暴露所在 ⇒ 承重。7 条流形式相同,但义务/簿记性质不同 —— 这是本发定价的分界。
// 【发放件 = 所量件】提交件 = 本头部 + 引擎正文;量测件 = 同一文件 + 追加 harness(只在文件尾,
//   不触碰引擎任何一行)。
// 【判据纪律】单发以在册同码散布 0.132741 ms 为带;本发预期 −0.403 ms(3.0× 散布)⇒ 真提交。
//   绝不设比 (T*0.99+1us) 更严的自设门槛(律 294)。
// ===== 引用(按 RULES §3;本文件正文的继承引用链在下方原样保留) =====
// [0] duck.ac 用户 **saffah_cc_v41_agg1**(本账号),提交 **#124021** <https://duck.ac/submission/124021>
//     —— 本件正文 = 该提交正文的**逐字节副本**(md5 09fda32909a3a03f07241b75c9cf2ac6),
//     唯一改动 = 本发参数族取值(见下);上游链(#124011 / #123985 / #120577 / #120514 /
//     #119223 / #118747 等)在文件内原样保留,本席未改动其中任何一行。
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120514** <https://duck.ac/submission/120514>
//     (265.772622 ms = 本题榜 1 / 现 T)—— 仅作判读口径引用,未改动其中任何一行。
// [2] 本队台账 `problems/mmmd2k/notes.md`:在册参数轴的扫描史与当时的量具
//     ((5091)/(5097) 别名向量阶梯 · (6306) lperm 14 发板面 · (9984) 板面散布实测 ·
//      (10239) 同码散布 0.132741 ms · (11397) MC 尖峰 · (7649) L6 未定价项)。
// [3] 量具:`problems/mmmd2k/work/d2zn__tmp/d2zn_refb.cpp` = 在役件逐字节 + 本队认证
//     harness(判题机与本机双向复现锚 `7e1f2b18` (n=2048) / `f52f809d` (n=1024))。
// 许可证:以上均为 duck.ac 公开提交,未见许可证声明;本文件按 RULES §3 逐项署名引用。
// 本席未复用任何第三方代码(生成器、值闸门、板面记录脚本均自写)。
//
// ===== [d2zn_ 席] 本次思路(参数搜索专项;引用区在上方) =====
// 【本轮扫的是哪个参数族、目的】本席只做**参数**(不做机理)。派单指出:在册「参数轴已
//   扫过、判负」的结论**大多由跨臂带 ±0.3~0.5% 的器械得出**,而本题缺口只有 0.872%
//   ⇒ 必须以**板面真值**重扫。本发扫的族 = **NT 存阈值 `SUMNT`(根层 `sum()` 的 9 张 8 MB 中间面板的存储类型)**:
//     现值 1024 ⇒ `sum(h=1024,…)` 走 `_mm256_stream_pd`(NT,绕过缓存);改成 **2048** ⇒ 同样 9 次调用改走**普通写**(进 L2/L3),而它们的消费者 `rec(1024,…)` 紧随其后。在册 `nst` 臂(#111931 = +2.184 ms)改的是 **`pre()` 的面板**、且是上一代底盘;**`sum()` 的 9 张面板从未在板面上定价**。
//   ★ 值中性论证:存储指令类型不参与任何算术;`sum` 的加数次序与 `combine` 的消费方式一字不动 ⇒ 逐位等价(闸门验证)。
//   ★ 闸门:本件在 n=2048 / n=1024 上的 C-哈希必须分别 = 在册锚 `7e1f2b18` / `f52f809d`
//     (本队认证 harness,逐位等价)—— 不过闸门不发。
// 【发放件 = 所量件】提交件 = 本头部 + 引擎正文;量测件 = 同一文件 + 追加 harness,
//   二者**逐 token 同**(harness 只在文件尾,不触碰引擎任何一行)。
// 【判据纪律】单发对比以在册板面同码散布 0.13 ms (0.05%) 为带;任何优于 265.431466 ms
//   的 Accepted 即为达标候选,立即上报。
//
// ===== [d2yn_ 席] 本次思路(试验性件;引用区在下方原样保留) =====
// 【改动(唯一一处,零算术改动)】leaf() 内 j/r 双循环按 **"flag 恒定区段"版本化**:
//   原文每次内核调用都做 3 个旗标测试:
//       if(pending.active && (++pending_tick%PERIOD)==0) {...}   if(pend2.active) {...}   if(d2lz_go && !pending.active) {...}
//   本发在**每个 ic 块入口做一次**三旗标的 OR 测试,把整个 j/r 双循环分成两个版本:
//     OR 为真 ⇒ 逐字节原版(逐调用测试,工作者一律不动);
//     OR 为假 ⇒ 同体去掉三条旗标块。
//   ★逐位等价的论证(三段):① `pending.active` 在叶内**只可能 true→false**(唯一的写入
//   点是 rec() 在叶调用之前武装、以及 pending_step() 走到 BASE² 时清 0)⇒ 块入口为假 ⇒
//   全块为假;② `pend2.active` 全文唯一的写入是其初始化器 `false`(只读不写,本席源码级复核);
//   ③ `d2lz_go` 由 `d2lz_arm_pass()` 在叶之前武装、由 `d2lz_step()` 在叶内清零 ⇒ 叶内同为
//   true→false。⇒ "为假"版本所跳过的三次测试,在原文里也都取假分支 ⇒ **两条路径发出同一串
//   kernel 调用、同一顺序、同一参数**(空臂自证:本席器械 n=1024 逐元素对拍 0 处不同、
//   板面标准基 FNV = 4861362855775799336 逐位同)。
// 【定价(判题机免费通道,同发内臂序轮转配对,3 发独立)】环括号 jr:−0.088%(三发
//   −0.076% / −0.115% / −0.050%,同二进制、同发、孪生臂抖动 0.033%)⇒ 约 −0.2 ms 板面。
// 【为什么值得发】把三次旗标测试从 7/8 的非 pending 块里移到每块一次;律 304 的"减条数
//   不兑现"在本发被量化到 −2.9 拍/调用(≈8~10 条 uop 只兑现 ~30%),仍是本席全账里
//   **唯一为正且逐位等价**的环内形态。★本席同时判死三条相邻形态(装置口径):把簿记/旗标
//   **移出内层**(连活一起搬)⇒ 总时 +1.4/+2.4/+3.5 M 更慢;删死计数器/死分支/叶级预取提示
//   ⇒ 全尺寸位置配对无正号;A 面板读址改 L1 常驻 ⇒ +0.066% 无收益。
//
// ===== 引用(按 RULES §3;本文件正文的继承引用链在下方原样保留) =====
// [0] duck.ac 用户 **saffah_cc_v41_agg1**(本账号),提交 **#124011** <https://duck.ac/submission/124011>
//     —— 本件正文 = 该提交正文的**逐字节副本** + 本发唯一改动(见上);上游链(#123985 → #123577 →
//     #120514 → #119223 → #118747 等)在文件内原样保留。
// [1] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120514** <https://duck.ac/submission/120514>
//     (265.772622 ms = 本题榜 1 / 现 T)—— 作为判读口径的 T 件引用(未改动其中任何一行)。
// [2] 本队台账 `problems/mmmd2k/notes.md`(含本席 `[d2yn_ 席]` 节):环价读数、剂量协议、
//     "括号内非核体池"的两席独立账(本席 142.9 拍/调用 ↔ `d2yo_` 分区证书推得 145.6 拍/调用)。
// 许可证:以上均为 duck.ac 公开提交,未见许可证声明;本文件按 RULES §3 逐项署名引用。
// 本席未复用任何第三方代码(器械、生成器、括号/剂量/harness 均自写)。
// ===== REFERENCES =====
// [0] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120514** <https://duck.ac/submission/120514>
//     (265.772622 ms = 本题榜 1 / 现 T)—— 本件正文 = 该提交正文的**逐字节副本**(上游链
//     #120514 → #119223 → #118747 原样保留在文件内,本席未改动其中任何一行)。
// [1] duck.ac 用户 **saffah_cc_v41_agg1**,提交 **#120577** <https://duck.ac/submission/120577>
//     (265.905363 ms = 本账号现役 mine)—— 本席的基座 = 该提交正文的逐字节副本
//     (`work/d2xx__tmp/d2xx_base.cpp`,md5 8a8f7368c063dd543a4b70a1569d26bb,开/收未改)。
// [2] 本队台账 `problems/mmmd2k/notes.md` 封条 **(2088) `d2xv_`**(复红后第 84 席)—— 本席改动
//     **唯一**的依据与定价来源:该席在判题机上用「单拷贝 × 运行期旋钮」仪器做了 `NOPF` 臂
//     (把叶级三条预取臂的调用拿掉),实测 **−0.44 ~ −0.79 M 拍 = 0.12~0.22 ms**(三发暖 base
//     937.110/937.305/937.459 为锚),且三趟 CK **逐位 = `16068241274265979343`**(值中性自证)。
// [3] 本队台账封条 **(2091) `d2xw_`**(复红后第 85 席)—— 把 `NOPF` 列为「在册唯一『判题机
//     实测为正 + 值中性』项」,并给出本席采用的发射判据:**X < 现 mine 即发**(不必达门槛),
//     因为任何降低 `mine` 的动作都**等比加宽被动窗** `T′ ∈ [(mine−1µs)/1.005, 265.772622)`。
// [4] 本队台账封条 **(2060) `d2xl_`** 与 **(2054) `d2xj_`**:本席据此**剔除**两个候选 ——
//     靶 C(根级标准 2 项操作数集)被 (2060) 以判题机在位单变量仪器**改判为 +1.2 M ≈ +0.35 ms
//     纯亏**;A/B/C 页单价残余被 (2054) 闭式钉死(100.66 MB ÷ 15.62 M = 6.44 B/拍,24,576 页
//     无一页可省)⇒ 本发**只发 NOPF 一项**。
// [5] 口径:`tools/exact.py mmmd2k`(mine 265.905363 #120577 · T 265.772622 #120514 ·
//     严支 0.99·T+1µs = 263.115896 ⇒ 缺 2.789467 ms);判题机 TSC 3.60047 GHz(`d2xt_` (2083))。
// 许可证:以上均为 duck.ac 公开提交,未见许可证声明;本文件按 RULES §3 逐项署名引用。
// [6] ★★★★ **本席自己的一发实测(提交 #123984,本文件的前一版 = NOPF 真删除)= 板面
//     266.408062 ms**,比 mine 265.905363 **慢 0.503 ms** ⇒ **在册价 (2088) 的「删掉更快」
//     在真删除下反转**(该价是「同一 `.text`、运行期跳过」读出的,删掉 112 条指令改变了布局与
//     流数)。★ 同批对照:姊妹账号 `saffah_cc_v41_260924` 在同底盘上连发 7 发,板面跨幅
//     **276.026~276.466 ms = 0.44 ms(0.16%)**(#123213..#123222)⇒ **本席 0.503 ms 的落差
//     就在"真删除回归"与"判题机散布"的分界上** ⇒ 本席据此**把 NOPF 剔除**(mandate:净负即剔)。
// ======================
// ===== 思路 =====
// 【d2xx_ 席 PF0 席 · 同一条叶级 `pending` 预取臂的**层级轴**(唯一未被扫过的轴):`_MM_HINT_T1`
//   (只填 L2)⇒ `_MM_HINT_T0`(填 L1)】
//   ★ 本席前一发的实测已否掉「删掉更便宜」的读法(见本头 [6])。
// 【改动(唯一一处,一个字的旋钮,零算术改动)】`pending_prefetch()` 体内 7 条
//   `_mm_prefetch(...,_MM_HINT_T1)` ⇒ `_MM_HINT_T0`。(▲ 下面 [1]~[3] 的形态清单是本席前一发
//   NOPF 的原文,保留作对照;本发**没有**删任何臂。)
//   ① `pending_prefetch()`(**活的**:`pending.active` 时每次调用发 28 条 `prefetcht1`);
//   ② `pend2_prefetch()`(**死的**:源码级取证 —— `pend2.active` 全文唯一的写入是其初始化器
//      `false`,`pend2_step()` 一次未执行,故该函数恒在首行 return);
//   ③ `d2lz_prefetch()`(**编译期死的**:`static constexpr int D2LZ_PF=0;` ⇒ `if(D2LZ_PF==0)return;`
//      之上再无活代码,GCC 早已整段删除)。
//   **依据(在册唯一的 hint 层级读数)**:同一引擎的**内核 B 面板**预取做过层级轴扫描 ——
//   T0 → T1 = **+50.2 M 拍(+5.33%)**,判词 =「B 的需求载入必须命中 L1,只填 L2 就买不回来」。
//   `pending_prefetch` 服务的 7 条流是**单触流**(`pending_step()` 每步只读一次),道理相同:
//   需求载入要的是 **L1 命中**,而现役写法是 T1(只填 L2)。本发只把这 7 条 `_MM_HINT_T1`
//   改成 `_MM_HINT_T0`,**一个字都不动算术**(`_mm_prefetch` 是提示、无语义)。
//   ★ 前车之鉴:本席前一发(NOPF,#123984)**真删**这条臂读到板面 **+0.503 ms(更慢)** ⇒
//   这条臂**不是零值**(删掉反而贵)⇒ 沿同一条臂**加强**它(T1→T0)是本席可发的唯一增量方向。
// 【闸门(值中性自证)】本机判题同款 `ref/gcc9/g9.sh` + 在册同款 harness 逐档对拍:在册件
//   n=1024 → `3315721237370438531`、n=2048 → `12850890239806342019`(A 仪器)与
//   `16068241274265979343`(B 仪器),本件四档(512/1024/2048/4096)**逐位与之相同**;
//   二进制点清 = `prefetcht0` 52→**108**、`prefetcht1` 112→**56**(只换层级、不增不减)。
// 【本发判据】方向依据 = 内核 B 面板同轴的 +50.2 M(**若同律成立,本发上限 ≈ 1.4 ms**);
//   下界 = 0(T0 可能同样只值噪声)。合体净 X 只要 < 现 mine 265.905363 即发((2091) 的发射
//   算术);本发**不达严支**(缺 2.789467 ms = 1.049%),价值 = **把被动窗下界
//   `(mine−1µs)/1.005` 下移 X/1.005**,窗宽 1.190 ms 随之等比加宽。
// ======================

// ===== [d2yh_] 增量刀 REFERENCES =====
// [0] 本队台账 `problems/mmmd2k/notes.md` 封条 **(2167) `d2y7_`**(复红后第 95 席)——
//     本件改动的**来源与定价**:该席在判题机上以同源自变臂实测"单负索引寄存器"重写
//     = 主路 −1.79 M / 主路+输送路 −1.60 M 拍(锚 `kl` = 885.336 M,四锚 CK 逐位全同);
//     其变换库 `work/d2y7__tmp/d2y7_c1.py`(本席直接调用,未改一字)。
//     该席以自设"买入门槛 0.9 ms"扣发 ⇒ 律 294 明令禁止自设比目标更严的提交门槛。
// [1] 本账号 saffah_cc_v41_agg1,提交 **#123985** <https://duck.ac/submission/123985>
//     (265.846623 ms = 本账号现役 mine)—— **本件底盘 = 该提交正文的逐字节副本**
//     (md5 b0d91ebdf501f101d9e864841921492b,本席只做下面「思路」列出的这一处改动)。
//     其上游链 #123985 → #120577 → #120514 → #119223 → #118747 的署名在本文件内原样保留。
// [2] 本队台账封条 **(2203) `d2yh_`**(本席)—— 独立佐证:同源双胞臂 + 真阴影对照实测
//     「环内每 +6 条 prefetch/迭代 ⇒ +451 kt」⇒ 边际价 ≈ 0.031 拍/uop ⇒ 删 3 条/迭代
//     ≈ −1.5 M 拍,与 (2167) 的 −1.60 M 同量级。
// [3] 律:**294**(不得自设更严门槛 · 正号 + 逐位等价即发);**299**(装置正号需真件口径);
//     **303**(改变数据落点的改动才须按冷跑定价 —— 本件是**纯代码**改动、不引入任何新页)。
// ===== 思路 =====
// 【改动(唯一一处)】热环循环控制:`add $64,%[a]` + `add $512,%[b]` + `sub $8,%[k]`
//   ⇒ 单条负索引寄存器 `add $64,%[i]`(`jnz` 保留)。每个内存操作数按恒等式
//   `8i = 512j − 32768`、`i = 64j − 4096` 重写为 `(D+32768)(%[b],%[i],8)` /
//   `%c[oN]+(K+4096)(%[a],%[i])` ⇒ **每条载入/乘加的有效地址逐字节不变**;
//   `i` 自 `-(n/8)*64` 递增、归零时 ZF 退出 ⇒ 与原 `sub $8,%[k]` 同迭代数。
//   改 `kernel_plain` 与 `kernel<SG>` 的活体分支各一处(`kernel2` 零调用、
//   `kernel_tail16`、算术/累加器/预取/NT 存/面板布局/根级调度:一字未动)。
// 【关于本文件体积】为过判题代码上限,引擎体内部的注释行已删除(**注释不参与编译**:
//   `.text` 与未删注释版**逐位同 md5**,本席 `objcopy` 自证);**上游署名链**
//   `#123985 → #120577 → #120514 → #119223 → #118747` 见本文件顶部 REFERENCES。
// 【值闸门】n = 512/1024/2048/4096 四档,与在役件同 harness 同数据逐位比对 C:
//   四档 fnv 全同(n=2048 = `16068241274265979343`,与在册常数逐位一致)。
// 【预期】−1.5 ~ −1.8 M 拍 = −0.42 ~ −0.50 ms(若成立 ⇒ mine 降至 ≈265.35 ms,
//   被动窗下端 `(mine−1µs)/1.005` 同步下移)。本件**不引入任何新页首触**,
//   故按冷跑口径无欠账(律 303)。
// ========================================================================


/* References:
[1] saffah_cc_v41_agg1, https://duck.ac/submission/119223.
Reused the2k FP64 recursion, deferred root accumulation and microkernels.
[2] saffah_cc_v41_agg1, https://duck.ac/submission/119315.
Copied its in-place packed-B sum helper and two-reuse leaf permutation.
Both public sources declare no separate license; inherited citations follow.
Idea: Transfer the1k engine's two packed-B reuse positions to every bottom
recursion of the2k engine. A pure quadrant already in the packed buffer can be
combined there with one other source, eliminating its second source traversal.
Purpose: Measure reduced operand-packing traffic across all seven bottom groups.
*/

































































































































































































































































































































































































































































#pragma GCC optimize("O3,no-strict-aliasing,reorder-blocks-and-partition,peel-loops")
#pragma GCC target("arch=skylake")
// ===== REFERENCES =====
// [0] duck.ac 用户 **saffah_cc_v41_agg1**(本账号),提交 **#124155**
//     <https://duck.ac/submission/124155> —— 本件正文 = 该提交正文的**逐字节副本**
//     (md5 50893eb117f9fbfa9021f3ac3c132872),本席未改动其中任何一行;本件对它的唯一
//     改动一律逐条列在下方「本次思路」的臂表里(每个臂恰好一处常数,且带出现次数断言)。
// [1] duck.ac 用户 **saffah_cc_v41_agg1**,提交 **#124034** <https://duck.ac/submission/124034>
//     —— `#124155` 的母本(把根层 `sum()` 的 9 张 8 MB 面板由 NT 直写改为缓存写,`SUMNT`
//     1024→2048);`#124155` 正文自带的继承引用链里已原样保留,本席未改。
// [2] duck.ac 用户 **saffah_codex_6a_agg3**,提交 **#120514** <https://duck.ac/submission/120514>
//     (265.772622 ms = 本题榜 1 = 现 T)—— 仅作判读口径引用,未改动其中任何一行。
// [3] 本队台账 `problems/mmmd2k/notes.md` 的**参数族**成封条((2911) `d2zn_` 主效应 21 发 ·
//     (2918) `d2zp_` 23 发 · (2931) `d2zu_` 交互 17 发)与**预取族新律**(2931):
//     「预取类改动必须用板面定价 —— 暖态器械会反号」。本席按该律只在板面判读。
// [4] 量具:`problems/mmmd2k/work/d2zx__tmp/d2zx_gate_tail.inc`(md5
//     245da34537cff03b65c3ec4eff803de2)= 本队认证 harness 的**四档**扩展
//     (`d2zb_/d2zn_/d2zr_/d2zu_` 逐字节引用件),本席逐字节引用,未改一字。
// [5] 参数表来源(只读):`problems/mmmd2k/work/d2zn__tmp/` · `d2zp__tmp/` · `d2zu__tmp/`
//     三席的 dol/notes(本席未改动其中任何文件);本席的臂表就是它们的**复原 + 换基座**。
// 许可证:以上均为 duck.ac 公开提交,未见许可证声明;本文件按 RULES §3 逐项署名引用。
// 本席未复用任何第三方代码(生成器、四档闸门、频次证书均自写)。

// ===== 思路 =====
// ===== [d2zz_ 席] 本次思路:**参数族在「新基座」上的板面重扫**(律 349/355 的直接兑现) =====
// 【本席角度(唯一)】本题所有的参数族扫描都建立在**旧基座**上:`d2zn_` 21 发在 `#124021`/
//   `#124034` 系、`d2zp_` 23 发在 `#124029`/`#124034`、`d2zu_` 17 发在 `#124034`。而**在役件已
//   换成 `#124155`** —— 它 = `#124034` 正文**删掉 `pending_prefetch()` 体内 4 条 c 象限预取流**
//   (7 流 → 3 流;该函数每次调用的预取条数 28 → 12,全是 `_mm_prefetch` 提示、零算术改动)。
//   ★ 律 349/355:**换母本不可外推**(同一变换在新旧母本上罚差 2.6~3 倍)⇒ 凡是
//   (a)旧读数距噪声门限近(≤1.1× 同码散布)、或(b)**与被改的那个函数/相位/字节数耦合**、
//   或(c)当时**只扫了单点**的参数,都必须在 `#124155` 上**重扫**。
// 【本发做的(每臂 = 在役件逐字节 + 恰好一处常数,带出现次数断言)】
//   A 族(与被删的 4 条流**同函数**:`pending_prefetch()` 的循环界与目标距离,以及 `pending_step`
//     的块长/节拍 —— 删除后该函数的指令预算掉了 57%,最优点可能移位):
//     · `PS4/PS16/PS32` 块内步长 `t+=8` → `4/16/32`(每块 3 流的条数 24/6/3;旧只测过 4 与 16,且旧基座)
//     · `PD1/PD2` **目标距离** 1 块 → 2 / 3 块(三流全部 +STEP / +2*STEP;**从未扫过**)
//     · `ST16/ST64` `STEP` 32 → 16 / 64(同时决定 `pending_step` 块长、`pos` 步进、预取循环界)
//     · `PE2` `PERIOD` 1 → 2(**从未上过板面**)
//   B 族(旧读数**贴噪声门限**、或旧值本身来自一条不可分辨的读数):
//     · `LP1088/LP1216/LP1280` `LEAF_PAD` 1152 → 1088 / 1216 / 1280(1216 旧读数 **+0.133 ms =
//       1.00× 同码散布**,正好压线;1088/1280 是旧从未扫的**非 4K 同余**格点)
//     · `UP14848/UP15360` `UPPER_PAGE_PAD` 15872 → 14848 / 15360(旧 −0.049 = 0.37×、+0.143 = 1.08×)
//     · `DS32/DS128` `D2LZ_STEP` 64 → 32 / 128(128 旧读数 +0.144 = 1.09× 贴门限)
//     · `SN1024` `SUMNT` 2048 → 1024(在役的 2048 本身就是靠一条 **0.46× 散布**的读数换来的)
// 【值中性论证】以上 16 个臂**全部只改一个整数常数的取值**:不动任何一次 `kernel` 的实参、不动
//   k 归约次序、不动任何 `Add`/`Mul` 的调用序列;预取类改动只改提示的**地址/条数**(`_mm_prefetch`
//   不写任何架构状态)。⇒ 4 档逐位等价闸门(n=512/1024/2048/4096)必须全过才允许上板面。
// 【量具纪律】判据**只认 duck.ac 判题机**(板面)。同码重掷散布 **0.132741 ms**;纯常数改动跨件
//   可复现 ≈ **3 µs**(`d2zu_` 17 发实测)⇒ 本席 A/B 两族的读数**不受 1.8 ms 级摆放散布支配**
//   (LEAF_PAD 那 3 支会改 `pending_work` 数组大小 ⇒ 属"该构建的真值",读数照记)。
//   **不得自设比 (T*0.99+1µs) 更严的门槛**(律 294);发前现读 `/status`(Pending>1 禁发)。

static constexpr int d2k_z7_p3 = (2 - 2);
#include <immintrin.h>
#define MD9_T2BASE 1
#include <stddef.h>
#include <sys/mman.h>
#ifndef BASE
#define BASE 512
#endif
#ifndef MC
#define MC (2+28)
#endif
#ifndef NTMIN
#define NTMIN 512
#endif
#ifndef UPPER_PAGE_PAD
#define UPPER_PAGE_PAD 15872
#endif
#ifndef LEAF_PAD
#define LEAF_PAD 1856
#endif
#ifndef SUMNT
#define SUMNT 2048

static int d2lz_root_last=0;
static const double *d2lz_acc=0;
#endif
static constexpr int MR=6,NR=8;
alignas(4096) static double workspace[48*1024*1024];
alignas(64) static double ap[(MC+MR)*(BASE+24)],ap2[(MC+MR)*(BASE+24)],bp[BASE*(BASE+24)];


alignas(64) static double pk_zero[BASE+8];
alignas(64) static double pk_mp[4]={0.0,0.0,0.0,0.0}, pk_mn[4]={-0.0,-0.0,-0.0,-0.0};
struct Mat { const double *x; int ld; const double *y=nullptr; int ly=0; int sign=0; };
static inline __m256d ld(Mat a,int i,int j) {
    __m256d x=_mm256_load_pd(a.x+(size_t)i*a.ld+j);
    if(a.sign) {
        __m256d y=_mm256_load_pd(a.y+(size_t)i*a.ly+j);
        x=a.sign>0?_mm256_add_pd(x,y):_mm256_sub_pd(x,y);
    }
    return x;
}
static inline double scalar(Mat a,int i,int k) {
    double x=a.x[(size_t)i*a.ld+k];
    if(a.sign)x+=a.sign>0?a.y[(size_t)i*a.ly+k]:-a.y[(size_t)i*a.ly+k];
    return x;
}
template<int SG> static __attribute__((always_inline)) inline void kernel(int n,const double *a,const double *b,double *c,int ldc,int rows,
        const double *pks,const double *pky,double *pkd) {
    double *out=c;
    ptrdiff_t stride=(ptrdiff_t)ldc*8;
    int k=n; long ip=-(long)(n/8)*64; (void)k;
    asm volatile (
        "vxorpd %%ymm0, %%ymm0, %%ymm0\n\t"
        "vxorpd %%ymm1, %%ymm1, %%ymm1\n\t"
        "vxorpd %%ymm2, %%ymm2, %%ymm2\n\t"
        "vxorpd %%ymm3, %%ymm3, %%ymm3\n\t"
        "vxorpd %%ymm4, %%ymm4, %%ymm4\n\t"
        "vxorpd %%ymm5, %%ymm5, %%ymm5\n\t"
        "vxorpd %%ymm6, %%ymm6, %%ymm6\n\t"
        "vxorpd %%ymm7, %%ymm7, %%ymm7\n\t"
        "vxorpd %%ymm8, %%ymm8, %%ymm8\n\t"
        "vxorpd %%ymm9, %%ymm9, %%ymm9\n\t"
        "vxorpd %%ymm10, %%ymm10, %%ymm10\n\t"
        "vxorpd %%ymm11, %%ymm11, %%ymm11\n\t"
        ".p2align 6\n\t"
        "1:\n\t"
        ".if %c[sg] != 0\n\t"
        "vmovapd 32768(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32800(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33280(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 32832(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32864(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33344(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 32896(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32928(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33408(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 32960(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32992(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33472(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33024(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33056(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33536(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33088(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33120(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33600(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33152(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33184(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33664(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33216(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33248(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33728(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovupd 0(%[pks]), %%ymm15\n\t"
        ".if %c[sg] == 1\n\t"
        "vaddpd 0(%[pky]), %%ymm15, %%ymm15\n\t"
        ".elseif %c[sg] == -1\n\t"
        "vsubpd 0(%[pky]), %%ymm15, %%ymm15\n\t"
        ".endif\n\t"
        "vmovupd %%ymm15, 0(%[pkd])\n\t"
        "add $32, %[pks]\n\t"
        "add $32, %[pky]\n\t"
        "add $32, %[pkd]\n\t"
        "add $64, %[i]\n\t"
        ".else\n\t"
        "prefetcht0 512(%[b])\n\t"
        "prefetcht0 576(%[b])\n\t"
        "prefetcht0 640(%[b])\n\t"
        "prefetcht0 704(%[b])\n\t"
        "vmovapd 0(%[b]), %%ymm12\n\t"
        "vmovapd 32(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd %c[o2]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 64(%[b]), %%ymm12\n\t"
        "vmovapd 96(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd %c[o2]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 128(%[b]), %%ymm12\n\t"
        "vmovapd 160(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd %c[o2]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 192(%[b]), %%ymm12\n\t"
        "vmovapd 224(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vbroadcastsd %c[o2]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "add $32, %[a]\n\t"
        "add $256, %[b]\n\t"
        "sub $4, %[k]\n\t"
        ".endif\n\t"
        "jnz 1b\n\t"
        "vmovntpd %%ymm0, (%[out])\n\t"
        "vmovntpd %%ymm1, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm2, (%[out])\n\t"
        "vmovntpd %%ymm3, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm4, (%[out])\n\t"
        "vmovntpd %%ymm5, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm6, (%[out])\n\t"
        "vmovntpd %%ymm7, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm8, (%[out])\n\t"
        "vmovntpd %%ymm9, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm10, (%[out])\n\t"
        "vmovntpd %%ymm11, 32(%[out])\n\t"
        : [a] "+&r"(a), [b] "+&r"(b), [out] "+&r"(out), [k] "+&r"(k), [i] "+&r"(ip),
          [pks] "+&r"(pks), [pky] "+&r"(pky), [pkd] "+&r"(pkd)
        : [stride] "r"(stride), [sg] "i"(SG), [o0] "i"(0*(BASE+24)*8), [o1] "i"(1*(BASE+24)*8), [o2] "i"(2*(BASE+24)*8), [o3] "i"(3*(BASE+24)*8), [o4] "i"(4*(BASE+24)*8), [o5] "i"(5*(BASE+24)*8)
        : "memory", "cc", "ymm0","ymm1","ymm2","ymm3","ymm4","ymm5","ymm6","ymm7","ymm8","ymm9","ymm10","ymm11","ymm12","ymm13","ymm14","ymm15");
}
static __attribute__((always_inline)) inline void kernel_plain(int n,const double *a,const double *b,double *c,int ldc,int rows) {
    double *out=c;
    ptrdiff_t stride=(ptrdiff_t)ldc*8;
    int k=n; long ip=-(long)(n/8)*64; (void)k;
    asm volatile (
        "vxorpd %%ymm0, %%ymm0, %%ymm0\n\t"
        "vxorpd %%ymm1, %%ymm1, %%ymm1\n\t"
        "vxorpd %%ymm2, %%ymm2, %%ymm2\n\t"
        "vxorpd %%ymm3, %%ymm3, %%ymm3\n\t"
        "vxorpd %%ymm4, %%ymm4, %%ymm4\n\t"
        "vxorpd %%ymm5, %%ymm5, %%ymm5\n\t"
        "vxorpd %%ymm6, %%ymm6, %%ymm6\n\t"
        "vxorpd %%ymm7, %%ymm7, %%ymm7\n\t"
        "vxorpd %%ymm8, %%ymm8, %%ymm8\n\t"
        "vxorpd %%ymm9, %%ymm9, %%ymm9\n\t"
        "vxorpd %%ymm10, %%ymm10, %%ymm10\n\t"
        "vxorpd %%ymm11, %%ymm11, %%ymm11\n\t"
        ".p2align 6\n\t"
        "1:\n\t"
        "vmovapd 32768(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32800(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33280(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4096(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 32832(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32864(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33344(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4104(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 32896(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32928(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33408(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4112(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 32960(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 32992(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33472(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4120(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33024(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33056(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33536(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4128(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33088(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33120(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33600(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4136(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33152(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33184(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33664(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4144(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "vmovapd 33216(%[b],%[i],8), %%ymm12\n\t"
        "vmovapd 33248(%[b],%[i],8), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "prefetcht0 33728(%[b],%[i],8)\n\t"
        "vbroadcastsd %c[o2]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm4\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm5\n\t"
        "vbroadcastsd %c[o3]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm6\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm7\n\t"
        "vbroadcastsd %c[o4]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm8\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm9\n\t"
        "vbroadcastsd %c[o5]+4152(%[a],%[i]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm10\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm11\n\t"
        "add $64, %[i]\n\t"
        "jnz 1b\n\t"
        "vmovntpd %%ymm0, (%[out])\n\t"
        "vmovntpd %%ymm1, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm2, (%[out])\n\t"
        "vmovntpd %%ymm3, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm4, (%[out])\n\t"
        "vmovntpd %%ymm5, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm6, (%[out])\n\t"
        "vmovntpd %%ymm7, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm8, (%[out])\n\t"
        "vmovntpd %%ymm9, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm10, (%[out])\n\t"
        "vmovntpd %%ymm11, 32(%[out])\n\t"
        : [a] "+&r"(a), [b] "+&r"(b), [out] "+&r"(out), [k] "+&r"(k), [i] "+&r"(ip)
        : [stride] "r"(stride), [o0] "i"(0*(BASE+24)*8), [o1] "i"(1*(BASE+24)*8), [o2] "i"(2*(BASE+24)*8), [o3] "i"(3*(BASE+24)*8), [o4] "i"(4*(BASE+24)*8), [o5] "i"(5*(BASE+24)*8)
        : "memory", "cc", "ymm0","ymm1","ymm2","ymm3","ymm4","ymm5","ymm6","ymm7","ymm8","ymm9","ymm10","ymm11","ymm12","ymm13","ymm14","ymm15");
}


struct Pend2 { double *c; int ldc; const double *m; const double *m2; const double *m3; int h; int pz; int pos; bool active; int i, j; };
static Pend2 pend2={0,0,0,0,0,0,0,0,false,0,0};
static constexpr int STEP2=16;
static inline void pend2_prefetch(void){
 if(!pend2.active)return;
 const int i=pend2.i, j=pend2.j;
 const double *c=pend2.c+(size_t)i*pend2.ldc+j;
 const double *m=pend2.m+pend2.pos;
 for(int t=0;t<STEP2;t+=8) {
  _mm_prefetch((const char*)(c+t),_MM_HINT_T1);
  _mm_prefetch((const char*)(c+pend2.h+t),_MM_HINT_T1);
  _mm_prefetch((const char*)(c+(size_t)pend2.h*pend2.ldc+t),_MM_HINT_T1);
  _mm_prefetch((const char*)(c+(size_t)pend2.h*pend2.ldc+pend2.h+t),_MM_HINT_T1);
  _mm_prefetch((const char*)(m+t),_MM_HINT_T1);
  _mm_prefetch((const char*)(pend2.m2+pend2.pos+t),_MM_HINT_T1);
  _mm_prefetch((const char*)(pend2.m3+pend2.pos+t),_MM_HINT_T1);
 }
}
static inline void pend2_step(void){
 const int i=pend2.i, j=pend2.j;
 for(int t=0;t<STEP2;t+=4) {
  double *c11=pend2.c+(size_t)i*pend2.ldc+j+t,*c12=c11+pend2.h,
   *c21=c11+(size_t)pend2.h*pend2.ldc,*c22=c21+pend2.h;
  const double *m=pend2.m+pend2.pos+t;
  __m256d m1=_mm256_load_pd(c11),m2=_mm256_load_pd(c21),
   m3=_mm256_load_pd(c12),m4=_mm256_load_pd(c22),
   m5=_mm256_load_pd(m),m6=_mm256_load_pd(pend2.m2+pend2.pos+t),m7=_mm256_load_pd(pend2.m3+pend2.pos+t);
  __m256d u2=_mm256_add_pd(m1,m6),u3=_mm256_add_pd(u2,m7),u4=_mm256_add_pd(u2,m5);
  __m256d r11=_mm256_add_pd(m1,m2),r12=_mm256_add_pd(u4,m3),
    r21=_mm256_sub_pd(u3,m4),r22=_mm256_add_pd(u3,m5);
  _mm256_store_pd(c11,r11);_mm256_store_pd(c12,r12);
  _mm256_store_pd(c21,r21);_mm256_store_pd(c22,r22);
 }
 pend2.pos+=STEP2;
 pend2.j+=STEP2; if(pend2.j>=pend2.h){pend2.j-=pend2.h;pend2.i++;}
 if(pend2.pos>=pend2.h*pend2.h)pend2.active=false;
}
static void pend2_finish(void){ while(pend2.active)pend2_step(); }
struct Pending { double *c; int ldc; const double *m; int pos=0; bool active=false; int rowlim=0; bool prog=false; };
static Pending pending;
alignas(4096) static double pending_work[3*(BASE*BASE+LEAF_PAD)+LEAF_PAD];
static unsigned pending_tick=0;
static constexpr int STEP=32, PERIOD=1;
static inline void pending_prefetch() {
 if(!pending.active)return;
 if(pending.prog && pending.pos/BASE>=pending.rowlim)return;
 int i=pending.pos/BASE,j=pending.pos%BASE;
 const double *c=pending.c+(size_t)i*pending.ldc+j;
 const double *m=pending.m+pending.pos;
 for(int t=0;t<STEP;t+=8) {
  _mm_prefetch((const char*)(m+t),_MM_HINT_T0);
  _mm_prefetch((const char*)(m+(BASE*BASE+LEAF_PAD)+t),_MM_HINT_T0);
  _mm_prefetch((const char*)(m+2*(BASE*BASE+LEAF_PAD)+t),_MM_HINT_T0);
 }
}
static inline void pending_step() {
 if(pending.prog && pending.pos/BASE>=pending.rowlim)return;
 int i=pending.pos/BASE,j=pending.pos%BASE;




 if(d2lz_acc){
  const double *A=d2lz_acc+(size_t)i*(2*BASE)+j;
  for(int t=0;t<STEP;t+=4) {
   double *c11=pending.c+(size_t)i*pending.ldc+j+t,
    *c12=c11+BASE,*c21=c11+(size_t)BASE*pending.ldc,*c22=c21+BASE;
   const double *m=pending.m+pending.pos+t;
   __m256d m1=_mm256_load_pd(c11),m2=_mm256_load_pd(c21),
    m3=_mm256_load_pd(c12),m4=_mm256_load_pd(c22),
    m5=_mm256_load_pd(m),m6=_mm256_load_pd(m+(BASE*BASE+LEAF_PAD)),m7=_mm256_load_pd(m+2*(BASE*BASE+LEAF_PAD));
   __m256d r11=_mm256_add_pd(_mm256_sub_pd(_mm256_add_pd(m1,m4),m5),m7),
    r12=_mm256_add_pd(m3,m5),r21=_mm256_add_pd(m2,m4),
    r22=_mm256_add_pd(_mm256_add_pd(_mm256_sub_pd(m1,m2),m3),m6);
   _mm256_store_pd(c11,_mm256_add_pd(r11,_mm256_load_pd(A+t)));
   _mm256_store_pd(c12,_mm256_add_pd(r12,_mm256_load_pd(A+BASE+t)));
   _mm256_store_pd(c21,_mm256_add_pd(r21,_mm256_load_pd(A+2*(size_t)BASE*BASE+t)));
   _mm256_store_pd(c22,_mm256_add_pd(r22,_mm256_load_pd(A+2*(size_t)BASE*BASE+BASE+t)));
  }
  pending.pos+=STEP;
  if(pending.pos==BASE*BASE)pending.active=false;
  return;
 }
 for(int t=0;t<STEP;t+=4) {
  double *c11=pending.c+(size_t)i*pending.ldc+j+t,
   *c12=c11+BASE,*c21=c11+(size_t)BASE*pending.ldc,*c22=c21+BASE;
  const double *m=pending.m+pending.pos+t;
  __m256d m1=_mm256_load_pd(c11),m2=_mm256_load_pd(c21),
   m3=_mm256_load_pd(c12),m4=_mm256_load_pd(c22),
   m5=_mm256_load_pd(m),m6=_mm256_load_pd(m+(BASE*BASE+LEAF_PAD)),m7=_mm256_load_pd(m+2*(BASE*BASE+LEAF_PAD));
  __m256d r11=_mm256_add_pd(_mm256_sub_pd(_mm256_add_pd(m1,m4),m5),m7),
   r12=_mm256_add_pd(m3,m5),r21=_mm256_add_pd(m2,m4),
   r22=_mm256_add_pd(_mm256_add_pd(_mm256_sub_pd(m1,m2),m3),m6);
  _mm256_store_pd(c11,r11);_mm256_store_pd(c12,r12);
  _mm256_store_pd(c21,r21);_mm256_store_pd(c22,r22);
 }
 pending.pos+=STEP;
 if(pending.pos==BASE*BASE)pending.active=false;
}
static void pending_finish() {
 pending.prog=false;
 while(pending.active)pending_step();
}
static __attribute__((always_inline)) inline void kernel2(int n,const double *a,const double *b,double *c,int ldc) {
    int k=n;
    double *out=c;
    ptrdiff_t stride=(ptrdiff_t)ldc*8;
    asm volatile (
        "vxorpd %%ymm0, %%ymm0, %%ymm0\n\t"
        "vxorpd %%ymm1, %%ymm1, %%ymm1\n\t"
        "vxorpd %%ymm2, %%ymm2, %%ymm2\n\t"
        "vxorpd %%ymm3, %%ymm3, %%ymm3\n\t"
        ".p2align 6\n\t" "1:\n\t"
        "prefetcht0 512(%[b])\n\t"
        "prefetcht0 576(%[b])\n\t"
        "prefetcht0 640(%[b])\n\t"
        "prefetcht0 704(%[b])\n\t"
        "vmovapd 0(%[b]), %%ymm12\n\t"
        "vmovapd 32(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+0(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vmovapd 64(%[b]), %%ymm12\n\t"
        "vmovapd 96(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+8(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vmovapd 128(%[b]), %%ymm12\n\t"
        "vmovapd 160(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+16(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "vmovapd 192(%[b]), %%ymm12\n\t"
        "vmovapd 224(%[b]), %%ymm13\n\t"
        "vbroadcastsd %c[o0]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm0\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm1\n\t"
        "vbroadcastsd %c[o1]+24(%[a]), %%ymm14\n\t"
        "vfmadd231pd %%ymm12, %%ymm14, %%ymm2\n\t"
        "vfmadd231pd %%ymm13, %%ymm14, %%ymm3\n\t"
        "add $32, %[a]\n\t"
        "add $256, %[b]\n\t"
        "sub $4, %[k]\n\t"
        "jnz 1b\n\t"
        "vmovntpd %%ymm0, (%[out])\n\t"
        "vmovntpd %%ymm1, 32(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm2, (%[out])\n\t"
        "vmovntpd %%ymm3, 32(%[out])\n\t"
        : [a] "+&r"(a), [b] "+&r"(b), [out] "+&r"(out), [k] "+&r"(k)
        : [stride] "r"(stride), [o0] "i"(0*(BASE+24)*8), [o1] "i"(1*(BASE+24)*8)
        : "memory", "cc", "ymm0","ymm1","ymm2","ymm3","ymm12","ymm13","ymm14");
}
static __attribute__((noinline)) void kernel_tail16(int n,const double *a,const double *b,double *out,int ldc) {
 const double *b1=b+8*(n+1);
 ptrdiff_t stride=(ptrdiff_t)ldc*8;
 int kk=n;
 asm volatile (
        "vxorpd %%ymm0, %%ymm0, %%ymm0\n\t"
        "vxorpd %%ymm1, %%ymm1, %%ymm1\n\t"
        "vxorpd %%ymm2, %%ymm2, %%ymm2\n\t"
        "vxorpd %%ymm3, %%ymm3, %%ymm3\n\t"
        "vxorpd %%ymm4, %%ymm4, %%ymm4\n\t"
        "vxorpd %%ymm5, %%ymm5, %%ymm5\n\t"
        "vxorpd %%ymm6, %%ymm6, %%ymm6\n\t"
        "vxorpd %%ymm7, %%ymm7, %%ymm7\n\t"
        ".p2align 6\n\t"
        "1:\n\t"
        "prefetcht0 512(%[b])\n\t"
        "prefetcht0 512(%[b1])\n\t"
        "vbroadcastsd %c[o0]+0(%[a]), %%ymm12\n\t"
        "vbroadcastsd %c[o1]+0(%[a]), %%ymm13\n\t"
        "vmovapd 0(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm0\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm4\n\t"
        "vmovapd 32(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm1\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm5\n\t"
        "vmovapd 0(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm2\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm6\n\t"
        "vmovapd 32(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm3\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm7\n\t"
        "prefetcht0 576(%[b])\n\t"
        "prefetcht0 576(%[b1])\n\t"
        "vbroadcastsd %c[o0]+8(%[a]), %%ymm12\n\t"
        "vbroadcastsd %c[o1]+8(%[a]), %%ymm13\n\t"
        "vmovapd 64(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm0\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm4\n\t"
        "vmovapd 96(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm1\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm5\n\t"
        "vmovapd 64(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm2\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm6\n\t"
        "vmovapd 96(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm3\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm7\n\t"
        "prefetcht0 640(%[b])\n\t"
        "prefetcht0 640(%[b1])\n\t"
        "vbroadcastsd %c[o0]+16(%[a]), %%ymm12\n\t"
        "vbroadcastsd %c[o1]+16(%[a]), %%ymm13\n\t"
        "vmovapd 128(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm0\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm4\n\t"
        "vmovapd 160(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm1\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm5\n\t"
        "vmovapd 128(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm2\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm6\n\t"
        "vmovapd 160(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm3\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm7\n\t"
        "prefetcht0 704(%[b])\n\t"
        "prefetcht0 704(%[b1])\n\t"
        "vbroadcastsd %c[o0]+24(%[a]), %%ymm12\n\t"
        "vbroadcastsd %c[o1]+24(%[a]), %%ymm13\n\t"
        "vmovapd 192(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm0\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm4\n\t"
        "vmovapd 224(%[b]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm1\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm5\n\t"
        "vmovapd 192(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm2\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm6\n\t"
        "vmovapd 224(%[b1]), %%ymm14\n\t"
        "vfmadd231pd %%ymm14, %%ymm12, %%ymm3\n\t"
        "vfmadd231pd %%ymm14, %%ymm13, %%ymm7\n\t"
        "add $32, %[a]\n\t"
        "add $256, %[b]\n\t"
        "add $256, %[b1]\n\t"
        "sub $4, %[kk]\n\t"
        "jnz 1b\n\t"
        "vmovntpd %%ymm0, 0(%[out])\n\t"
        "vmovntpd %%ymm1, 32(%[out])\n\t"
        "vmovntpd %%ymm2, 64(%[out])\n\t"
        "vmovntpd %%ymm3, 96(%[out])\n\t"
        "add %[stride], %[out]\n\t"
        "vmovntpd %%ymm4, 0(%[out])\n\t"
        "vmovntpd %%ymm5, 32(%[out])\n\t"
        "vmovntpd %%ymm6, 64(%[out])\n\t"
        "vmovntpd %%ymm7, 96(%[out])\n\t"
 : [a] "+&r"(a),[b] "+&r"(b),[b1] "+&r"(b1),[out] "+&r"(out),[kk] "+&r"(kk)
 : [stride] "r"(stride),[o0] "i"(0),[o1] "i"((BASE+24)*8)
 : "memory","cc","ymm0","ymm1","ymm2","ymm3","ymm4","ymm5","ymm6","ymm7","ymm8","ymm9","ymm10","ymm11","ymm12","ymm13","ymm14","ymm15");
}








static bool d2lz_go=false;
static double *d2lz_c; static int d2lz_ldc,d2lz_h;
static const double *d2lz_m1,*d2lz_m5,*d2lz_m6,*d2lz_m7; static int d2lz_m1p;
static int d2lz_pos,d2lz_i,d2lz_j;
static constexpr int D2LZ_STEP=64;
static constexpr int D2LZ_NT=1;
static constexpr int D2LZ_NTALL=0;
static inline void d2lz_arm_pass(double *c,int ldc,const double *m1,int m1p,const double *m5,
                                 const double *m6,const double *m7,int h){
  d2lz_c=c; d2lz_ldc=ldc; d2lz_m1=m1; d2lz_m1p=m1p; d2lz_m5=m5; d2lz_m6=m6; d2lz_m7=m7; d2lz_h=h;
  d2lz_pos=0; d2lz_i=0; d2lz_j=0; d2lz_go=true;
}
static constexpr int D2LZ_PF=0;
static inline void d2lz_prefetch(void){
  if(D2LZ_PF==0) return;
  if(!d2lz_go)return;
  const int i=d2lz_i,j=d2lz_j;
  const double *c=d2lz_c+(size_t)i*d2lz_ldc+j;
  const size_t off=(size_t)i*d2lz_h+j,off1=(size_t)i*d2lz_m1p+j;


  const int lead = (D2LZ_PF>=2)? D2LZ_STEP : 0;
  const _mm_hint hint = (D2LZ_PF==3)? _MM_HINT_NTA : _MM_HINT_T1;
  for(int t=lead;t<D2LZ_STEP+lead;t+=8){
    _mm_prefetch((const char*)(c+d2lz_h+t),hint);
    _mm_prefetch((const char*)(c+(size_t)d2lz_h*d2lz_ldc+t),hint);
    _mm_prefetch((const char*)(c+(size_t)d2lz_h*d2lz_ldc+d2lz_h+t),hint);
    _mm_prefetch((const char*)(d2lz_m1+off1+t),hint);
    _mm_prefetch((const char*)(d2lz_m5+off+t),hint);
    _mm_prefetch((const char*)(d2lz_m6+off+t),hint);
    _mm_prefetch((const char*)(d2lz_m7+off+t),hint);
  }
}
static inline void d2lz_step(void){
  if(!d2lz_go)return;
  const int i=d2lz_i,j=d2lz_j;
  for(int t=0;t<D2LZ_STEP;t+=4){
    double *c12=d2lz_c+(size_t)i*d2lz_ldc+d2lz_h+j+t,
      *c21=d2lz_c+(size_t)(d2lz_h+i)*d2lz_ldc+j+t,*c22=c21+d2lz_h;
    const size_t off=(size_t)i*d2lz_h+j+t,off1=(size_t)i*d2lz_m1p+j+t;
    __m256d m1=_mm256_load_pd(d2lz_m1+off1),m3=_mm256_load_pd(c12),m4=_mm256_load_pd(c22),
      m5=_mm256_load_pd(d2lz_m5+off),m6=_mm256_load_pd(d2lz_m6+off),m7=_mm256_load_pd(d2lz_m7+off);
    __m256d u2=_mm256_add_pd(m1,m6),u3=_mm256_add_pd(u2,m7),u4=_mm256_add_pd(u2,m5);
    if(D2LZ_NTALL){ _mm256_stream_pd(c12,_mm256_add_pd(u4,m3)); _mm256_stream_pd(c22,_mm256_add_pd(u3,m5)); }
    else { _mm256_store_pd(c12,_mm256_add_pd(u4,m3)); _mm256_store_pd(c22,_mm256_add_pd(u3,m5)); }
    if(D2LZ_NT) _mm256_stream_pd(c21,_mm256_sub_pd(u3,m4));
    else        _mm256_store_pd(c21,_mm256_sub_pd(u3,m4));
  }
  d2lz_pos+=D2LZ_STEP;
  d2lz_j+=D2LZ_STEP; if(d2lz_j>=d2lz_h){d2lz_j-=d2lz_h;d2lz_i++;}
  if(d2lz_pos>=d2lz_h*d2lz_h)d2lz_go=false;
}
static void d2lz_finish(void){ while(d2lz_go)d2lz_step(); }

static const int lperm[7]={4,0,1,3,2,5,6};
static int g_fuse_sd[7], g_fuse_sgn[7];
static int g_fuse_sd_cur=0, g_fuse_sgn_cur=0;
static const int d1a2_bi[7]={0,0,1,2,3,0,2}, d1a2_bj[7]={3,-1,3,0,-1,1,3}, d1a2_bs[7]={1,0,-1,-1,0,1,1};
static void d1a2_fuse_tab(void){
    for(int r=0;r<7;r++){g_fuse_sd[r]=0;g_fuse_sgn[r]=0;}
    for(int r=1;r<7;r++){
        int q=lperm[r], pq=lperm[r-1];
        if(d1a2_bs[pq]!=0) continue;
        if(d1a2_bj[q]==d1a2_bi[pq]){ g_fuse_sd[r]=1; g_fuse_sgn[r]=d1a2_bs[q]; }
        else if(d1a2_bi[q]==d1a2_bi[pq]){ g_fuse_sd[r]=2; g_fuse_sgn[r]=d1a2_bs[q]; }
    }
}
__attribute__((noinline)) static void pk_fuse(int n,Mat b,double *BP,int sgn,int side){
    const double *sx=b.x; const size_t sl=b.ld;
    for(int k=0;k<n;k+=2)for(int j=0;j<n;j+=8) {
        double *p=BP+(size_t)j*(n+1)+k*8;
        __m256d q0=_mm256_load_pd(p+0),q1=_mm256_load_pd(p+4);
        __m256d q2=_mm256_load_pd(p+8),q3=_mm256_load_pd(p+12);
        __m256d s0=_mm256_load_pd(sx+(size_t)(k+0)*sl+j),   s1=_mm256_load_pd(sx+(size_t)(k+0)*sl+j+4);
        __m256d s2=_mm256_load_pd(sx+(size_t)(k+1)*sl+j),   s3=_mm256_load_pd(sx+(size_t)(k+1)*sl+j+4);
        if(side==1){
            if(sgn>0){q0=_mm256_add_pd(s0,q0);q1=_mm256_add_pd(s1,q1);q2=_mm256_add_pd(s2,q2);q3=_mm256_add_pd(s3,q3);}
            else     {q0=_mm256_sub_pd(s0,q0);q1=_mm256_sub_pd(s1,q1);q2=_mm256_sub_pd(s2,q2);q3=_mm256_sub_pd(s3,q3);}
        } else {
            if(sgn>0){q0=_mm256_add_pd(q0,s0);q1=_mm256_add_pd(q1,s1);q2=_mm256_add_pd(q2,s2);q3=_mm256_add_pd(q3,s3);}
            else     {q0=_mm256_sub_pd(q0,s0);q1=_mm256_sub_pd(q1,s1);q2=_mm256_sub_pd(q2,s2);q3=_mm256_sub_pd(q3,s3);}
        }
        _mm256_store_pd(p+0,q0);_mm256_store_pd(p+4,q1);
        _mm256_store_pd(p+8,q2);_mm256_store_pd(p+12,q3);
    }
}
static void d1a2_pk(int n,Mat b,double *BP){
    if(g_fuse_sd_cur) pk_fuse(n,b,BP,g_fuse_sgn_cur,g_fuse_sd_cur);
    else for(int k=0;k<n;k+=2)for(int j=0;j<n;j+=8) {
        double *p=BP+(size_t)j*(n+1)+k*8;
        _mm256_store_pd(p+0,ld(b,k+0,j));_mm256_store_pd(p+4,ld(b,k+0,j+4));
        _mm256_store_pd(p+8,ld(b,k+1,j));_mm256_store_pd(p+12,ld(b,k+1,j+4));
    }
}

static void leaf(int n,Mat a,Mat b,double *c,int ldc) {
    d1a2_pk(n,b,bp);
    pending_prefetch();
    double *pkb[2]={ap,ap2};
    int cur=0;
    {
        int mc0=n<MC?n:MC;
        for(int r=0;r<mc0;r+=MR) {
            int rows=mc0-r<MR?mc0-r:MR;
            for(int i=0;i<rows;i++)for(int k=0;k<n;k+=4)
                _mm256_store_pd(pkb[0]+(size_t)(r+i)*(BASE+24)+k,ld(a,r+i,k));
            for(int i=rows;i<MR;i++)for(int k=0;k<n;k+=4)
                _mm256_store_pd(pkb[0]+(size_t)(r+i)*(BASE+24)+k,_mm256_setzero_pd());
        }
    }
    for(int ic=0;ic<n;) {
        int mc=n-ic<=MC+MR?n-ic:MC;
        if(mc==MC+2) {
            for(int j=0;j<n;j+=16) {
                for(int jj=j;jj<j+16;jj+=NR)for(int r=0;r<MC;r+=MR) {
                    kernel_plain(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)jj*(n+1),c+(size_t)(ic+r)*ldc+jj,ldc,MR);
                    if(pending.active && (++pending_tick%PERIOD)==0) {pending_step();if(pending.prog)pending_step();pending_prefetch();}
                    if(pend2.active) {pend2_step();pend2_prefetch();}
                    if(d2lz_go && !pending.active) {d2lz_step();d2lz_prefetch();}
                }
                kernel_tail16(n,pkb[cur]+(size_t)MC*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+MC)*ldc+j,ldc);
            }
            ic+=mc;
            if(pending.prog)pending.rowlim=ic;
            continue;
        }


        const int ic2=ic+mc;
        const int nxt=(ic2<n)?(n-ic2<=MC+MR?n-ic2:MC):0;
        const int rows2=((nxt+MR-1)/MR)*MR;
        const int nch=rows2*2;
        const int qd=n/2;
        int ck=0; int skip=(n/NR)*((mc+MR-1)/MR)-nch;
        if(pending.active||pend2.active||d2lz_go) {
for(int j=0;j<n;j+=NR)for(int r=0;r<mc;r+=MR) {
            if(mc-r==2) {
                kernel2(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc);
                continue;
            }
            const double *pks=pk_zero,*pky=pk_zero,*pkm=pk_mp;
            double *pkd=pk_zero;
            int pkc=0;
            if(ck<nch && --skip<0) {
                const int row=ck/2, off=(ck%2)*qd;
                if(row<nxt) {
                    pks=a.x+(size_t)(ic2+row)*a.ld+(size_t)off;
                    pky=a.sign?(a.y+(size_t)(ic2+row)*a.ly+(size_t)off):pk_zero;
                    pkm=a.sign>0?pk_mp:pk_mn;
                }
                pkd=pkb[cur^1]+(size_t)row*(BASE+24)+(size_t)off;
                pkc=8;
                ck++;
            }
            if(!pkc) kernel_plain(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR);
            else if(a.sign==0) kernel<2>(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR,pks,pky,pkd);
            else if(a.sign>0) kernel<1>(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR,pks,pky,pkd);
            else kernel<-1>(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR,pks,pky,pkd);
            if(pending.active && (++pending_tick%PERIOD)==0) {
                pending_step(); if(pending.prog)pending_step(); pending_prefetch();
            }
            if(pend2.active) { pend2_step(); pend2_prefetch(); }
            if(d2lz_go && !pending.active) { d2lz_step(); d2lz_prefetch(); }

        }
        } else {
for(int j=0;j<n;j+=NR)for(int r=0;r<mc;r+=MR) {
            if(mc-r==2) {
                kernel2(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc);
                continue;
            }
            const double *pks=pk_zero,*pky=pk_zero,*pkm=pk_mp;
            double *pkd=pk_zero;
            int pkc=0;
            if(ck<nch && --skip<0) {
                const int row=ck/2, off=(ck%2)*qd;
                if(row<nxt) {
                    pks=a.x+(size_t)(ic2+row)*a.ld+(size_t)off;
                    pky=a.sign?(a.y+(size_t)(ic2+row)*a.ly+(size_t)off):pk_zero;
                    pkm=a.sign>0?pk_mp:pk_mn;
                }
                pkd=pkb[cur^1]+(size_t)row*(BASE+24)+(size_t)off;
                pkc=8;
                ck++;
            }
            if(!pkc) kernel_plain(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR);
            else if(a.sign==0) kernel<2>(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR,pks,pky,pkd);
            else if(a.sign>0) kernel<1>(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR,pks,pky,pkd);
            else kernel<-1>(n,pkb[cur]+(size_t)r*(BASE+24),bp+(size_t)j*(n+1),c+(size_t)(ic+r)*ldc+j,ldc,mc-r<MR?mc-r:MR,pks,pky,pkd);
        }
        }

        for(int cc=ck;cc<nch;cc++) {
            const int row=cc/2, off=(cc%2)*qd;
            if(row<nxt) {
                for(int k=off;k<off+qd;k+=4)
                    _mm256_store_pd(pkb[cur^1]+(size_t)row*(BASE+24)+k, ld(a,ic2+row,k));
            } else {
                for(int k=off;k<off+qd;k+=4)
                    _mm256_store_pd(pkb[cur^1]+(size_t)row*(BASE+24)+k, _mm256_setzero_pd());
            }
        }
        cur^=1;
        ic+=mc;
        if(pending.prog)pending.rowlim=ic;
    }
    if(n>=NTMIN)_mm_sfence();
}
static void sum(int h,double *dst,Mat a,Mat b,int sign) {
    for(int i=0;i<h;i++)for(int j=0;j<h;j+=8) {
        __m256d v=sign>0?_mm256_add_pd(ld(a,i,j),ld(b,i,j)):_mm256_sub_pd(ld(a,i,j),ld(b,i,j));
        __m256d w=sign>0?_mm256_add_pd(ld(a,i,j+4),ld(b,i,j+4)):_mm256_sub_pd(ld(a,i,j+4),ld(b,i,j+4));
        asm volatile("" : "+x"(v), "+x"(w) : : "memory");
        if(h>=SUMNT) {
          _mm256_stream_pd(dst+(size_t)i*h+j,v);_mm256_stream_pd(dst+(size_t)i*h+j+4,w);
        } else {
          _mm256_store_pd(dst+(size_t)i*h+j,v);_mm256_store_pd(dst+(size_t)i*h+j+4,w);
        }
    }
    if(h>=SUMNT)_mm_sfence();
}
static void combine(int h,double *c,int ldc,const double *m,bool wino=false) {
    size_t z=(size_t)h*h+(wino?UPPER_PAGE_PAD:0);
    for(int i=0;i<h;i++)for(int j=0;j<h;j+=4) {
        size_t t=(size_t)i*h+j;
        double *c11=c+(size_t)i*ldc+j,*c12=c11+h,*c21=c+(size_t)(i+h)*ldc+j,*c22=c21+h;
        __m256d m1=_mm256_load_pd(c11),m2=_mm256_load_pd(c21),m3=_mm256_load_pd(c12),m4=_mm256_load_pd(c22),
          m5=_mm256_load_pd(m+t),m6=_mm256_load_pd(m+z+t),m7=_mm256_load_pd(m+2*z+t);
        __m256d r11,r12,r21,r22;
        if(wino) {
            __m256d u2=_mm256_add_pd(m1,m6),u3=_mm256_add_pd(u2,m7),u4=_mm256_add_pd(u2,m5);
            r11=_mm256_add_pd(m1,m2);r12=_mm256_add_pd(u4,m3);r21=_mm256_sub_pd(u3,m4);r22=_mm256_add_pd(u3,m5);
        } else {
            r11=_mm256_add_pd(_mm256_sub_pd(_mm256_add_pd(m1,m4),m5),m7);r12=_mm256_add_pd(m3,m5);r21=_mm256_add_pd(m2,m4);
            r22=_mm256_add_pd(_mm256_add_pd(_mm256_sub_pd(m1,m2),m3),m6);
        }
        _mm256_store_pd(c11,r11);_mm256_store_pd(c12,r12);_mm256_store_pd(c21,r21);_mm256_store_pd(c22,r22);
    }
}

static void pre(int h,Mat a,double *s1,double *s2,double *s4,double *s3,int ld3,int ld12,int ld4,bool right) {
 for(int i=0;i<h;i++)for(int j=0;j<h;j+=8) {
  __m256d a0=ld(a,i,j),a1=ld(a,i,j+4),b0=ld(a,i,j+h),b1=ld(a,i,j+h+4),
   c0=ld(a,i+h,j),c1=ld(a,i+h,j+4),d0=ld(a,i+h,j+h),d1=ld(a,i+h,j+h+4);
  __m256d p0,p1,q0,q1,r0,r1,t0,t1;
  if(!right) {
   p0=_mm256_add_pd(c0,d0);p1=_mm256_add_pd(c1,d1);
   q0=_mm256_sub_pd(p0,a0);q1=_mm256_sub_pd(p1,a1);
   r0=_mm256_sub_pd(b0,q0);r1=_mm256_sub_pd(b1,q1);
   t0=_mm256_sub_pd(a0,c0);t1=_mm256_sub_pd(a1,c1);
  }else {
   p0=_mm256_sub_pd(b0,a0);p1=_mm256_sub_pd(b1,a1);
   q0=_mm256_sub_pd(d0,p0);q1=_mm256_sub_pd(d1,p1);
   r0=_mm256_sub_pd(q0,c0);r1=_mm256_sub_pd(q1,c1);
   t0=_mm256_sub_pd(d0,b0);t1=_mm256_sub_pd(d1,b1);
  }
  size_t off=(size_t)i*ld12+j,off4=(size_t)i*ld4+j,off3=(size_t)i*ld3+j;
  _mm256_stream_pd(s1+off,p0);_mm256_stream_pd(s1+off+4,p1);
  _mm256_stream_pd(s2+off,q0);_mm256_stream_pd(s2+off+4,q1);
  _mm256_stream_pd(s4+off4,r0);_mm256_stream_pd(s4+off4+4,r1);
  _mm256_stream_pd(s3+off3,t0);_mm256_stream_pd(s3+off3+4,t1);
 }
 _mm_sfence();
}

static void rec(int n,Mat a,Mat b,double *c,int ldc,double *work) {
    if(n<=BASE){leaf(n,a,b,c,ldc);return;}
    int h=n/2;size_t z=(size_t)h*h;
    Mat aa[4]={{a.x,a.ld},{a.x+h,a.ld},{a.x+(size_t)h*a.ld,a.ld},{a.x+(size_t)h*a.ld+h,a.ld}};
    Mat bb[4]={{b.x,b.ld},{b.x+h,b.ld},{b.x+(size_t)h*b.ld,b.ld},{b.x+(size_t)h*b.ld+h,b.ld}};
    double *m=n==2*BASE?work+LEAF_PAD:work;
    if(n==2*BASE && pending.active && pending.m==m)m=pending_work+LEAF_PAD;
    size_t pz=z+(n==2*BASE?LEAF_PAD:UPPER_PAGE_PAD);
    double *p=work+3*z,*q=p+z,*sub=q+z;
    double *out[7]={c,c+(size_t)h*ldc,c+h,c+(size_t)h*ldc+h,m,m+pz,m+2*pz};
    if(n>BASE*2) {
        pending_finish();
        double *pa0=m+3*pz,*pa1=pa0+pz,*pb0=pa1+pz,*pb1=pb0+pz,*pb2=pb1+pz;




        double *pa2=c+(size_t)h*ldc+h;
        sub=pb2+pz;
        pre(h,a,pa0,pa1,pa2,c,ldc,h,ldc,false);
        pre(h,b,pb0,pb1,pb2,c+(size_t)h*ldc,ldc,h,h,true);





        rec(h,{pa2,ldc},bb[3],out[2],ldc,sub);
        rec(h,aa[3],{pb2,h},out[3],ldc,sub);
        pend2_finish();
        rec(h,{pa0,h},{pb0,h},pb2,h,sub);
        rec(h,{pa1,h},{pb1,h},pa0,h,sub);
        rec(h,{c,ldc},{c+(size_t)h*ldc,ldc},pa1,h,sub);





        rec(h,aa[0],bb[0],pb0,h,sub);
        d2lz_arm_pass(c,ldc,pb0,h,pb2,pa0,pa1,h);
        d2lz_root_last=1;
        rec(h,aa[1],bb[2],c,ldc,sub);
        d2lz_root_last=0;
        d2lz_finish();
        pending_finish();
        pend2_finish();
        d2lz_acc=0;
        return;
    }
    const int ai[7]={0,2,0,3,0,2,1},aj[7]={3,3,-1,-1,1,0,3},as[7]={1,1,0,0,1,-1,-1};
    const int bi[7]={0,0,1,2,3,0,2},bj[7]={3,-1,3,0,-1,1,3},bs[7]={1,0,-1,-1,0,1,1};
    for(int r=0;r<7;r++) {
        Mat x=aa[ai[r]],y=bb[bi[r]];
        if(h<=BASE) {


            const int q=lperm[r];
            g_fuse_sd_cur=g_fuse_sd[r];g_fuse_sgn_cur=g_fuse_sgn[r];
            Mat x=aa[ai[q]],y=bb[bi[q]];
            if(as[q]){x.y=aa[aj[q]].x;x.ly=a.ld;x.sign=as[q];}
            if(bs[q]){y.y=bb[bj[q]].x;y.ly=b.ld;y.sign=bs[q];}
            if(r==6) {
                pending_finish();
                pending={c,ldc,m,0,true,0,true};
                if(d2lz_root_last) d2lz_acc=d2lz_m1;
                leaf(h,x,y,out[q],q<4?ldc:h);
                pending.prog=false;
            } else leaf(h,x,y,out[q],q<4?ldc:h);
        } else {
            if(as[r]){sum(h,p,x,aa[aj[r]],as[r]);x={p,h};}
            if(bs[r]){sum(h,q,y,bb[bj[r]],bs[r]);y={q,h};}
            rec(h,x,y,out[r],r<4?ldc:h,sub);
        }
    }
    if(h==BASE) {

    } else {
        pending_finish();
        combine(h,c,ldc,m);
    }
}




static void d2z6_thp(void *p,size_t bytes){
    if(!p||!bytes) return;
    unsigned long long pg=4096, a=(unsigned long long)p & ~(pg-1);
    unsigned long long e=(unsigned long long)p+bytes;


    if(madvise((void*)a,(size_t)(((e+pg-1)&~(pg-1))-a),MADV_HUGEPAGE))
        madvise((void*)a,(size_t)((e&~(pg-1))-a),MADV_HUGEPAGE);
}
static bool d2z6_thp_done=false;
static void d2z6_thp_all(const double*A,const double*B,double*C,int n){
    if(d2z6_thp_done) return; d2z6_thp_done=true;
    size_t nn=(size_t)n*(size_t)n*8;
    d2z6_thp((void*)A,nn); d2z6_thp((void*)B,nn); d2z6_thp((void*)C,nn);
    d2z6_thp((void*)workspace,sizeof(workspace));
    d2z6_thp((void*)pending_work,sizeof(pending_work));
}

static_assert(sizeof(char*)==8,"z6anc2");
void matrix_multiply(int n,const double *a,const double *b,double *c) {
  d2z6_thp_all(a,b,c,n);d1a2_fuse_tab();
    rec(n,{a,n},{b,n},c,n,workspace);
    pending_finish();
    pend2_finish();
    _mm_sfence();
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #1265.427 ms86 MB + 332 KBAcceptedScore: 100


Judge Duck Online | 评测鸭在线
Server Time: 2026-10-15 06:01:19 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠