2025年4月22日星期二

尝试了一下 SIMD everywhere

前段时间在折腾数独,看了一下比较快的几个实现,基本都要靠 SIMD,最后选中的是 tdoku,不过里面的 SIMD 都是 x86 上的,我现在主力机已经变成了 M1 Ultra Mac Studio,于是开始折腾 SIMD everywhere

使用方法还是很简单的,引入 SIMDe 的头文件,然后把 _mm_blabla 都加上 simde 的前缀变成 simde_mm_blabla,然后对应修改一下宏开关和 CMake 文件就好。当然也有一些调用没法翻译,例如 _mm_cmpeq_epi8_mask,用宏开关回退处理一下就好。

然后跑了一下性能测试,以下结果是默认包含更早的指令集的,比如 AVX512 默认就开启了所有 SSE 以及 AVX2 AVX1 等。

AVX512

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    441192.3 |         2.3 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    145510.3 |         6.9 |      47.7% |           1.13 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    134246.9 |         7.4 |      78.7% |           0.61 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     48798.4 |        20.5 |       7.9% |           9.05 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     10001.8 |       100.0 |       0.0% |          55.00 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      8302.0 |       120.5 |       0.0% |          65.00 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      5304.0 |       188.5 |       0.0% |         113.19 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    185128.5 |         5.4 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   1767598.2 |         0.6 |      97.4% |           0.28 |

AVX2

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    457427.4 |         2.2 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    153541.9 |         6.5 |      47.4% |           1.13 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    140428.5 |         7.1 |      78.7% |           0.61 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     51233.8 |        19.5 |       7.9% |           9.06 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     10519.0 |        95.1 |       0.0% |          55.03 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      8706.3 |       114.9 |       0.0% |          64.97 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      5442.9 |       183.7 |       0.0% |         113.07 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    191109.5 |         5.2 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   1814562.8 |         0.6 |      97.4% |           0.28 |

AVX

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    644955.6 |         1.6 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    218633.8 |         4.6 |      47.6% |           1.13 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    198852.5 |         5.0 |      78.6% |           0.62 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     72522.9 |        13.8 |       7.9% |           9.06 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     14989.6 |        66.7 |       0.0% |          54.92 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     12312.2 |        81.2 |       0.0% |          64.97 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      7976.6 |       125.4 |       0.0% |         113.19 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    271330.8 |         3.7 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   2201973.6 |         0.5 |      97.4% |           0.32 |

SSE 4.2

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    649117.3 |         1.5 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    214462.4 |         4.7 |      47.5% |           1.13 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    194553.9 |         5.1 |      78.7% |           0.61 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     70727.5 |        14.1 |       7.9% |           9.06 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     14585.9 |        68.6 |       0.0% |          54.94 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     11865.1 |        84.3 |       0.0% |          64.99 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      7667.1 |       130.4 |       0.0% |         113.12 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    268004.8 |         3.7 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   2327193.4 |         0.4 |      97.4% |           0.28 |

SSE 4.1

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    630080.5 |         1.6 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    209809.2 |         4.8 |      47.4% |           1.13 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    192380.4 |         5.2 |      78.7% |           0.61 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     70330.4 |        14.2 |       7.9% |           9.06 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     14396.9 |        69.5 |       0.0% |          54.96 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     12090.5 |        82.7 |       0.0% |          64.96 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      7959.7 |       125.6 |       0.0% |         113.17 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    255759.0 |         3.9 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   2227786.9 |         0.4 |      97.4% |           0.28 |

SSSE 3

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    636460.5 |         1.6 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    211631.3 |         4.7 |      47.9% |           1.12 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    192110.1 |         5.2 |      78.7% |           0.62 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     71057.8 |        14.1 |       7.9% |           9.05 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     14736.9 |        67.9 |       0.0% |          54.96 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     12656.2 |        79.0 |       0.0% |          64.95 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      8108.5 |       123.3 |       0.0% |         113.09 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    279108.4 |         3.6 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   2416115.4 |         0.4 |      97.5% |           0.27 |

SSE 2

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    276657.1 |         3.6 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     92831.1 |        10.8 |      47.4% |           1.12 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     84223.8 |        11.9 |      78.7% |           0.62 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     30532.7 |        32.8 |       7.9% |           9.04 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      6300.4 |       158.7 |       0.0% |          54.85 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      5162.1 |       193.7 |       0.0% |          64.99 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      3302.7 |       302.8 |       0.0% |         113.13 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    112815.9 |         8.9 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   1169978.6 |         0.9 |      97.4% |           0.28 |

None

|data/puzzles0_kaggle                  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    273777.6 |         3.7 |     100.0% |           0.00 |

|data/puzzles1_unbiased                |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     89851.1 |        11.1 |      47.3% |           1.13 |

|data/puzzles2_17_clue                 |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     80658.1 |        12.4 |      78.7% |           0.62 |

|data/puzzles3_magictour_top1465       |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|     29483.5 |        33.9 |       7.9% |           9.06 |

|data/puzzles4_forum_hardest_1905      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      6055.2 |       165.1 |       0.0% |          55.05 |

|data/puzzles5_forum_hardest_1905_11+  |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      5052.6 |       197.9 |       0.0% |          64.90 |

|data/puzzles6_forum_hardest_1106      |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|      3295.0 |       303.5 |       0.0% |         113.23 |

|data/puzzles7_serg_benchmark          |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|    111730.9 |         9.0 |       0.0% |           7.13 |

|data/puzzles8_gen_puzzles             |  puzzles/sec|  usec/puzzle|   %no_guess|  guesses/puzzle|
|--------------------------------------|------------:|------------:|-----------:|---------------:|
|tdoku                      T/shrc+./m+|   1176020.0 |         0.9 |      97.4% |           0.28 |

SSSE 3AVX 性能都差不多,相比于 x86 的原生性能,差距还是比较明显的,只能说 neon 这玩意儿坑略多。

Apple 在 M 处理器上还有 AMX,支持类似 AVX 512 的 512 的位宽,不过是有点类似后门的玩意儿,只能通过阿婆自己的 Accelerate 库间接调用,也有人做了逆向。以后有空再折腾吧。

2025年4月10日星期四

VTX Intro S100

现在键盘市场虽然很卷,但是很神奇的是标准配列的键盘很少人去做,而且不知道为啥,前高一个二个都做得贼高,感觉买回去也不是为了打字的,就是为了听个声、摸摸铝坨坨,整个就一大号手办。

所以 S100 出来的时候就预定了,选择确实不多。但是运过来就比较波折了,先是 FR4 定位板要返工,先发了一张铝定过来,但是我又很不喜欢铝定的手感,于是选择了等。好不容易等到了转了海运,这段时间由于众所周知的原因,入关比较困难,于是这个包裹在海上漂了两个月,终于才落地。



总体外观还是不错的,就是太重了,如果可以去掉配重又不影响配重块下面的电池的放置就好了。我也不知道是谁开启了这个风气,往键盘里面塞配重,多想不开。

电路板为了支持多布局,右 Enter 的卫星轴螺丝没法放垫片。另外热插拔版只支持 103 不能用 104。支持了欧版但是不支持 104 也是很匪夷所思的设计。



轴的话还是例行黄玉。键帽配合键盘的共生紫配色,弄了 Domikey 的雷史莱姆。



键盘只支持 103 的弊端就出来了。本来支持 103 的键帽就少,适合 Mac 的 opt/cmd 互换的键帽也少,既要支持 103 的 1.5U 又要有 Mac 字符的,那就真没有了。另外这个键盘一些功能是需要 Fn 的,正好放右边,我就搞不明白这个 103 的意义在哪里。

不过现在全尺寸的键盘这么少,似乎也没什么好抱怨的。