本技能用于在 dotnet/runtime 仓库内编写或评审 SIMD 与硬件内联(hardware intrinsics)代码。通用背景可先看 .NET 官方文档“Use SIMD and hardware intrinsics in .NET”,仓库特定细节见 docs/coding-guidelines/vectorization-guidelines.md。
用途:向量化标量算法、编写或复核向量化改动。核心原则是优先使用已向量化的高层 API,如 Span<T>/string 方法、TensorPrimitives、tensor 类型,以及可被向量化的 LINQ 运算符(Sum、Max、Min、Average 等),不要手写已优化且经过测试的逻辑。一般从 Vector128<T> 起步,它覆盖面最广;只有实测热点才扩展到 Vector256/512 或平台内联。跨平台 API 优先,仅当特定指令实测更优时下探到 X86/Arm/Wasm,并用 IsSupported 保护。
必要用法要点:IsHardwareAccelerated 与 Count 是 JIT 期常量,应直接读取、不要缓存为局部变量。优先用运算符,注意 a & b == c 会解析为 a & (b == c)。结构上先处理最宽宽度,再逐级降级到标量回退;用 IsHardwareAccelerated 与 Vector128<T>.IsSupported 守卫,并比较长度与 Count。加载存储优先基于 span 的 Vector128.Create(span)/CopyTo,避免显式 pin 与指针运算;逐个元素访问时用 LoadUnsafe/StoreUnsafe 的元素偏移重载。空缓冲区起始引用用 MemoryMarshal.GetReference 或 GetArrayDataReference,不要用 ref span[0]。Vector128<T> 不支持 char/bool,需用 MemoryMarshal.Cast 或 As<TFrom,TTo> 重解释,并自行保证位模式合法。偏移量用无符号 nuint,先检查长度避免下溢。必须处理余数:幂等操作直接折叠重叠,非幂等操作(如求和)用 ConditionalSelect 掩码到单位元。反向迭代不能让中间 ref 越出缓冲区,以免产生 GC hole。跨缓冲区读写要考虑重叠。
测试:覆盖 Vector256、Vector128 与标量三条路径,输入同时包含够大与过小的情形;用环境变量切换加速(DOTNET_EnableAVX2=0、DOTNET_EnableHWIntrinsic=0);用 BoundedMemory 防止越界读取(Browser/WASI 与 .NET Framework 上无保护)。基准测试用 BenchmarkDotNet,同一轮比较标量/Vector128/Vector256,注意大输入收益更明显、加速比通常低于理论值、内存对齐会影响结果稳定性。评审时按优先级检查:正确性(含符号零、NaN、溢出、字节序)、是否可复用高层 API、余数处理、内存安全、跨平台一致性、测试覆盖与性能数字是否有据。缺失信息:该技能的具体安装或调用命令资料暂未提供。