【Rust日报】2026-09-17 尝试让循环自动向量化
内容提要
本期Rust社区通讯介绍四篇文章:Rust编译器因浮点加法不满足结合律而无法自动向量化循环,需手动分块或使用algebraic运算;体素MMO游戏Veloren基于ECS的非常规工程设计与rtsim全图仿真;代码行数统计工具mezura,支持多语言识别与MCP调用;CO3方案用纯Rust声明实现Rust与C ABI双向FFI接口。
延伸解读
浮点自动向量化的限制与应对
Rust编译器因IEEE 754浮点加法不满足结合律,无法自动将标量累加重排为向量累加,导致点积等循环在opt-level=3下仍使用标量指令。即使启用AVX2+FMA,也只是换成VEX编码的标量指令。手动分块(如as_chunks::<4>())或使用Rust 1.98稳定的algebraic运算(如algebraic_add)可生成向量化代码,但后者允许代数等价重排,可能改变部分输入的精确结果。
Veloren的ECS架构与全图仿真
Veloren基于ECS设计,在48线程服务器上达到约50%核心利用率,支撑500名以上玩家与数以万计实体。玩家与NPC共用物理、输入、技能等系统,NPC由agent决策树控制。地形使用chonk结构平衡压缩与随机访问,启动时低分辨率预生成,靠近时补细节。rtsim在NPC离开视距后并入全图仿真,继续推进任务、势力与经济,避免隐形墙,保持玩法在同一物理空间。
mezura的计数模型与性能表现
mezura按文件内容识别语言,处理扩展名冲突,跳过minified/生成文件,支持自定义关键字计数(不计字符串与注释内出现),并能分语言统计HTML/Vue/Svelte/Astro内嵌脚本样式。默认按行内容判定,也可用--counting region对齐区域模型。提供JSON输出与MCP,便于编程助手调用。linebench对比中,作者称其比scc/tokei更快,具体倍数以仓库表格为准。
CO3的FFI声明与泛型处理
CO3旨在用纯Rust声明覆盖Rust与C ABI双向接口,包括函数、静态项、方法、不透明类型及sized/DST、niche、trap value、所有权传递等细节。通过ffi!、ReprC将类型降为C兼容表示。针对C ABI无泛型,提供静态单态化与运行时tag分发(dyn(Tag))两套路径,并可配置符号命名与失败处理。配套disjoint_impls与rust-spec,已有较完整测试,rs-odbc为完整用例,后续计划与cbindgen类工具集成。
Q&A
为什么 Rust 编译器不能自动向量化浮点循环?
因为 IEEE 754 浮点加法不满足结合律,编译器不能把标量累加重排成按 4/8 路向量累加再水平求和,否则可能改变部分输入的精确结果。
如何让 Rust 浮点循环实现自动向量化?
可以手动分块,例如使用 as_chunks::<4>(),或者使用 Rust 1.98 稳定的浮点 algebraic 运算(如 algebraic_add / algebraic_mul),在允许代数等价重排的前提下得到向量化代码。
Veloren 的 ECS 架构有什么特别之处?
Veloren 基于 ECS,在 48 线程服务器上可达到约 50% 核心利用率,同时支撑 500 名以上在线玩家与数以万计实体交互。玩家与 NPC 尽量共用同一套物理、Controller 输入、技能与经验系统,NPC 控制来自 agent 决策树。
mezura 是什么?它有什么特点?
mezura 是用 Rust 写的代码行数统计工具(CLI / 库 / MCP server),强调在速度之外给出可解释、可配置的计数。它按文件内容识别语言,跳过 minified/生成文件,支持自定义关键字计数、内嵌脚本样式分语言统计、按 module 分组、日志历史与 git revision diff,并提供 JSON 输出与 MCP。
CO3 是什么?它解决了什么问题?
CO3 是一套面向 Rust 与 C ABI 双向接口的 FFI 方案,目标是尽量用纯 Rust 声明导入/导出,并覆盖函数、静态项、方法、不透明类型,以及 sized/DST、niche、trap value、所有权传递与 #[soft] 写回等细节。它针对 C ABI 上不存在泛型的问题,提供静态单态化与运行时 tag 分发两套路径。
Veloren 的 rtsim 是什么?
rtsim 是 Veloren 的 Real Time SIMulation,当 NPC 离开玩家视距后并入全图仿真,继续推进任务、势力与部分经济行为。