Matt Godbolt's blog2 months agohttp://xania.org/202512/20-simd-city?utm_source=feed&utm_medium=rssSIMD允许CPU用单条指令处理多个数据点,从而提升数组密集型计算的性能。编译器可通过-O3和-march=skylake等标志自动向量化循环,但需要合适的数据布局(例如整数数组)。条件更新(如取最大值)可使用掩码移动向量化,或改写为无条件的操作,映射到vpmaxsd等SIMD指令。编译器会添加数组重叠的运行时检查以确保向量化正确性,通常会生成一个回退的标量循环。
Matt Godbolt's blog2 months agohttp://xania.org/202512/21-vectorising-floats?utm_source=feed&utm_medium=rssSIMD自动向量化对整数求和效率很高,每次循环迭代处理8个整数,然后通过修正代码将8个部分和相加。由于舍入,浮点加法不满足结合律,因此编译器无法安全地以相同方式重新分组加法,导致即使每次迭代处理8个浮点数,也仍进行标量逐元素加法。解决办法包括使用-Ofast或-funsafe-math-optimizations(全局,有风险)或使用GCC属性为特定函数假设结合律;使用无序执行策略的std::reduce在测试中无效。
Matt Godbolt's blog2 months agohttp://xania.org/202512/22-memory-cunningness?utm_source=feed&utm_medium=rss编译器通过重叠内存读取和按位异或操作,优化字符串与编译时常量的比较。对于不同长度的常量字符串,编译器内联比较,并使用高效技术,如先检查长度,然后执行字节或字级比较。比较7个字符的字符串时,使用两次重叠的32位读取和异或操作,避免逐字节检查,利用相同值异或为零的特性。现代编译器(如Clang)会自动从简单代码(如`sv == "ABCDEFG"sv`)应用此类优化(如无分支条件、未对齐读取),使开发者能专注于代码清晰性。编译器之间存在差异:例如,对于相似的字符串比较,GCC可能生成更直接但优化较少的代码,而Clang则更高效。
Ghostty Devlog 0062 months agohttps://mitchellh.com/writing/ghostty-devlog-006Focus on IO throughput speed improvements in Ghostty terminal emulator.SIMD optimization for plain text processing: 7.3x faster ASCII, 16.6x faster UTF-8 decode.Precomputed lookup tables for codepoint width: 2.8x faster ASCII, 5x faster random UTF-8.Optimized grapheme break detection using small lookup table, nearly 8x faster.CSI sequence fast-path parser improved throughput by 1.4-2x in control-heavy workloads.Real-world results: cat'ing large files 2-5x faster, outperforming other terminals even with grapheme clustering.Community contributions and future plans to further improve performance.
SIMD for Collision2 months agohttps://box2d.org/posts/2026/07/simd-for-collision/作者通过同时处理多个边-边测试,将“宽SIMD”应用于碰撞检测,类似于先前在接触求解器上的工作。“宽SIMD”一次处理多个工作单元(如4条边),与“窄SIMD”不同,后者对单个3向量操作进行向量化。三维凸包碰撞的分隔轴测试(SAT)具有二次复杂度,尤其是对于复杂凸包占主导地位的边-边测试。对于具有许多边(例如,一块巨石凸包中有89条边)的情况,使用SSE2的SIMD在完整模拟中获得了超过2倍的速度提升。该优化主要受益于复杂凸包;对箱体-箱体碰撞的效果微不足道。Box3D使用SAT而不是GJK+EPA,避免了碰撞容差和数值不稳定性。
Everyone Should Know SIMD2 months agohttps://mitchellh.com/writing/everyone-should-know-simdSIMD使CPU能够并行处理多个值,常用于加速大数据集上的循环。常见的SIMD代码遵循五个步骤:广播常量、循环处理向量宽度大小的块、执行并行操作、归约结果,以及用标量尾部处理剩余部分。一个真实示例(搜索控制字符)展示了标量循环如何被向量化,实现4倍到16倍的加速。编译器可以自动向量化简单循环,但往往受限;手动SIMD提供了明确且可预测的性能。每个开发者都应该理解SIMD基础知识,并毫无畏惧地识别向量化的机会。
Static search trees: 40x faster than binary search (2024)2 months agohttps://curiouscoding.nl/posts/static-search-tree/该帖子实现了一种优化的静态搜索树(S+树),用于对已排序的32位无符号整数进行高吞吐量搜索,重点关注以每秒查询数为衡量标准的吞吐量。关键优化包括使用SIMD指令进行节点搜索、批处理查询以并行化内存访问、预取数据以减少延迟,以及通过指针算术简化操作。探索了分支因子为16或17的S+树等树形结构,结合交错查询来平衡CPU和内存受限的工作负载,对于4GB数据,实现了从1150纳秒/查询到27纳秒/查询的超过40倍加速。尝试了按高位进行前缀分区的方法,但增加了复杂性且速度提升有限,特别是在人类基因组k-mers等倾斜的真实数据上,使得该方法不如交错查询实用。未来工作建议包括针对可变迭代次数的分支搜索、通过插值搜索减少RAM访问、将数据打包到16位、支持范围查询、对查询进行排序以实现缓存重用,以及应用于后缀数组搜索。