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 仿真计算流程中。


posted @ 2025-05-09 23:44  江左子固  阅读(49)  评论(0)    收藏  举报