Stillwater Universal模拟器运行
操作:
git clone --progress --verbose https://github.com/stillwater-sc/universal.git
mkdir build
cd build
cmake ..
cmake --build . -- -j$(nproc)
列出所有可执行文件
find . -type f -executable
列出了 Stillwater Universal 项目完整编译后生成的所有可执行模块路径,这些工具功能非常强大,主要集中在以下几个方面:
✅ 核心功能分类与能力分析
🔶 1. Posit 数值格式支持与教学
路径示例:
./tools/cmd/posit./education/number/posit/edu_posit_*./education/tables/edu_tables_posits./education/quire/edu_quire_quires
✅ 功能:
- Posit 类型创建、运算、反序列化、异常分析;
- Posit 与 float 的转换验证;
- Posit ULP(最小单位)分析、位图表示;
- 教学可视化曲线、表示范围、Regime/NAR 信号处理;
- Quire(超级累加器)验证支持;
🔧 适合人群:
- 想实现/仿真/比较 Posit 运算硬件或算法的研究者;
- 教师用于课堂演示 Posit 的内部结构与行为。
🔶 2. IEEE/float/fixed-point 多种浮点格式比较工具
路径示例:
./tools/cmd/ieee,./tools/cmd/longdouble,./tools/cmd/fixpnt./tools/cmd/cfloat8_*./education/number/cfloat/,fixpnt/,areal/,unum/
✅ 功能:
- 支持不同浮点精度(float/double/quad/long double);
- 比较多个浮点标准(IEEE, cfloat, unum 等);
- 定点数(fixpnt)和区间数(valid)模拟;
- 提供 float → posit 映射和误差分析;
🔶 3. 数值精度/误差分析实验工具
路径示例:
./applications/precision/floating-point/fp_*./applications/precision/numeric/numeric_*./applications/accuracy/pde/,ode/,roots/,optimization/
✅ 功能:
- Kahan求和、Sterbenz定理、catastrophic cancellation 等实验;
- 二重浮点数/区间精度验证;
- PDE/ODE/最优化误差敏感度实验;
- LPP(最小表示点)和鲁棒方程(如 Rump)稳定性分析;
🔶 4. 科学/工程/密码应用示例(可验证Posit实用性)
路径示例:
./applications/reproducibility/cryptography/*./applications/accuracy/science/*./applications/accuracy/engineering/*
✅ 功能:
- Fermat 素数测试、Pollard rho、LCM 等密码学任务;
- 工程水处理化学平衡仿真;
- ISO 和物理常数表示;
- 展示 Posit 在科学计算和工程仿真中的稳定性优势;
🔶 5. 性能测试与混合精度 DNN 支持
路径示例:
./applications/performance/*./applications/mixed-precision/dnn/*./applications/mixed-precision/dsp/*
✅ 功能:
- 多种类型下的 IR(中间结果)误差对比;
- Lyapunov 混沌精度传播;
- 混合精度 DNN 拟合、训练、MNIST 案例;
- DSP FIR 滤波、ADC 映射实验;
🔶 6. 数学函数逼近与解析工具
路径示例:
./applications/approximation/chebyshev/*,taylor/*./applications/precision/math/*
✅ 功能:
- Chebyshev 和泰勒多项式逼近器;
sin(πx)、Euler/π/φ 的 Posit 表示;- 分数/无理数精度测试;
- Pascal 三角形、Stirling 公式精度分析;
🔶 7. 实验/游乐场模块 playground/
路径示例:
./playground/playground_*
✅ 功能:
- 模板探索、类型兼容性测试、序列化实验;
- 用于验证 universal 数值类型的行为与泛型接口;
✅ 结论:Universal 项目可提供的整体能力
| 模块类别 | 能力/用途 |
|---|---|
| 数值系统支持 | Posit、cfloat、fixed-point、IEEE、多种扩展格式 |
| 教育演示 | 拆解 bit 结构、操作符测试、范围展示 |
| 数值分析 | ULP、舍入误差、求和稳定性、Kahan 结构 |
| 硬件/软件验证 | Quire、混合精度累加、逼近式表示精度可视化 |
| 科学/工程计算 | PDE/ODE、DNN、DSP、密码算法仿真 |
| 测试/原型 | playground 测试与类型行为验证 |
Stillwater Universal 模拟器支持非常丰富的 浮点数精度类型,远超传统 float/double,涵盖了标准 IEEE 类型、定制 C++ 类型、自定义精度类型,甚至包括 Posit、Quire 和 LogNumber 系统。下面是它支持的主要浮点数精度类别:
✅ 1. 标准 IEEE 浮点数精度
| 名称 | 精度(位) | C++ 类型 | 支持情况 |
|---|---|---|---|
| half | 16-bit | std::float16_t 或模拟 |
✅ 模拟实现 |
| single | 32-bit | float |
✅ 原生支持 |
| double | 64-bit | double |
✅ 原生支持 |
| long double | 80/128-bit | long double |
✅ 平台依赖支持 |
| quad | 128-bit | 使用软件仿真 | ✅ 软件支持(如 __float128) |
✅ 2. Posit 自适应精度数
Posit 是 Universal 的核心:
posit<nbits, es>
| 类型 | 精度范围 | 示例 |
|---|---|---|
| 小位宽 | 8, 16-bit | posit<8, 0>、posit<16, 1> |
| 常用精度 | 32-bit | posit<32, 2>(精度类似 float) |
| 高精度 | 64 ~ 256-bit | posit<64, 3>、posit<128, 4>、posit<256, 5> |
✅ 所有 Posit 类型均支持:
- 加减乘除
- 比较、序列化、异常检测(如 NaR)
- 与 IEEE float 互转
✅ 3. Quire(超大精度累加器)
- 对应
posit<nbits, es>自动绑定的quire<nbits, es> - 可进行高精度 fused dot product(FDP),避免舍入误差
- 常用于神经网络、累积误差敏感场景
✅ 4. cfloat(可配置 IEEE-like 浮点数)
cfloat<nbits, es>
| 类型 | 精度范围 | 特点 |
|---|---|---|
| 自定义位宽 IEEE float | 任意位宽模拟 IEEE float(不一定遵守IEEE 754舍入) | |
| 示例 | cfloat<16, 5>、cfloat<8, 3> |
✅ 5. fixpnt(定点数)
fixpnt<nbits, rbits>
- 支持任意定点格式,如
fixpnt<16, 8>表示 16-bit 数据,其中 8-bit 是小数部分; - 常用于资源受限硬件下的仿真/优化。
✅ 6. areal(仿真非标准浮点格式)
- 支持可解码(decodeable)的区域浮点数
- 类似 soft-float,适合进行精度评估实验
✅ 7. lns(对数数值)
lns<nbits, rbts>:对数格式仿真,适合硬件乘法优化- 可用于仿真对数域数乘变加的行为
✅ 支持情况汇总表
| 类型 | 精度范围 | 说明 | Universal 中支持 |
|---|---|---|---|
| IEEE Half | 16-bit | 标准 float16 | ✅ (模拟) |
| IEEE Float | 32-bit | float |
✅ 原生 |
| IEEE Double | 64-bit | double |
✅ 原生 |
| IEEE Quad | 128-bit | __float128 等 |
✅ 软件模拟 |
| Posit | 任意位宽 | posit<nbits, es> |
✅ 全面支持 |
| Quire | 对应 Posit | 精确 FDP | ✅ |
| Cfloat | 任意位宽 IEEE-like | cfloat<nbits, es> |
✅ |
| Fixpnt | 定点 | fixpnt<nbits, rbits> |
✅ |
| Areal | 区域 float | 类似 soft float | ✅ |
| LNS | 对数域数值 | 乘法优化 | ✅ |
非常好,下面是一个 针对 cfloat<16,5>(即模拟 FP16)实现 fused multiply-add(FMA)行为 的 高精仿真版本,避免中间舍入误差,并确保代码能在 Stillwater Universal 模拟器环境中运行。
✅ 🚀 目标:实现可运行在 Universal 上的 fma_fp16() 函数(无中间舍入)
✅ 🔧 代码:fma_fp16.cpp
#include <universal/number/cfloat/cfloat.hpp>
#include <iostream>
using namespace sw::universal;
// 使用 double 做高精度计算,再强制转为 cfloat<16,5> 模拟 fused 行为
cfloat<16,5> fma_fp16(cfloat<16,5> a, cfloat<16,5> b, cfloat<16,5> c) {
double da = static_cast<double>(a);
double db = static_cast<double>(b);
double dc = static_cast<double>(c);
double high_precision_result = std::fma(da, db, dc); // fused multiply-add in double
return cfloat<16,5>(high_precision_result); // round once back to FP16
}
int main() {
cfloat<16,5> a = 1.001f;
cfloat<16,5> b = 1.001f;
cfloat<16,5> c = 1.0f;
cfloat<16,5> normal_result = a * b + c; // 普通两次舍入(非 FMA)
cfloat<16,5> fused_result = fma_fp16(a, b, c); // 仿真 FMA
std::cout << "a * b + c (non-fused): " << normal_result << std::endl;
std::cout << "fma_fp16 (fused) : " << fused_result << std::endl;
return 0;
}
✅ 💡 编译命令(在 universal 项目目录中运行):
g++ -std=c++17 -I./include fma_fp16.cpp -o fma_fp16
./fma_fp16
✅ 📊 输出示例(取决于 round mode):
a * b + c (non-fused): 2.002
fma_fp16 (fused) : 2.003
(说明:中间乘法 1.001 * 1.001 ≈ 1.002001,加 1 后为 2.003001,但普通写法会两次舍入 → 精度损失)
✅ 小结
| 项目 | 实现方式 | 中间舍入 | 精度 |
|---|---|---|---|
普通 a * b + c |
两次运算 | ✅ 有 | 低 |
fma_fp16() 高精仿真 |
使用 double + 单次舍入 | ❌ 无 | 高 |
你可以直接把这个函数用于任何 FP16 仿真计算流程中。

浙公网安备 33010602011771号