首页
看点啥
插画图片
首页 科技看点 universal:实践指南

universal:实践指南

2026-09-10 0

工作中遇到相关需求时,universal值得先读说明,因为它主要用于大量数字系统,为 AI、机器学习、计算机视觉、信号处理、CAE、EDA、控制、优化、估计和近似的混合精度算法开发和优化提供自定义算术。在图像与视觉生产场景里,常见问题是风格、尺寸和资源格式容易偏离预期,这正是评估时需要盯住的地方。短测时我会拿一份明确的视觉参考完成小样,并保留构图、尺寸、资源可用性和导出质量的结果,方便团队复盘。如果团队属于需要可复现视觉结果的设计与内容团队,它有继续测试的理由;否则先看替代方案会更省时间。

Universal:自定义算术插件类型的仅头文件 C++ 模板库

系统 状态 更多信息
代码质量 代码质量评估
FOSSA 状态 开源许可证依赖性扫描器
GitHub 操作 最新的 Linux/MacOS/Windows 构建和回归测试
开发分公司 发展科
回归状态 回归状态
代码覆盖范围 代码覆盖率扫描仪
Docker 拉取 集装箱拉力
很棒的 C++ 很棒的 C++ 库
JOSS 降价 开源软件杂志论文
Zenodo Zenodo DOI 徽章
CodeRabbitAI CodeRabbit 徽章

通用数字库的目标是为混合精度算法开发和优化提供本地整数和浮点的替代方案。根据应用程序的精度和动态范围定制算术类型,可以将应用程序性能和能源效率提升到新的水平,这对于需要通过智能行为实现自治的嵌入式应用程序尤其有价值。

深度学习算法尤其提供了一个垂直的核心应用程序,其中替代格式和精度(例如半精度浮点和 bfloat16)可将速度提高两到三个数量级,从而使 AI 的快速创新成为可能。

通用库是一个即用型仅标头库,它提供了本机类型的插件替代品,并提供了一个低摩擦环境来探索 AI、DSP、HPC 和 HFT 算法中 IEEE-754 浮点的替代方案。

基本使用模式很简单:

// bring in the parameterized type of interest, in this case
// a fixed-sized, arbitrary configuration classic floating-point
#include 

// define your computational kernel parameterized by arithmitic type
template
Real MyKernel(const Real& a, const Real& b) {
    return a * b;  // replace this with your kernel computation
}

constexpr double pi = 3.14159265358979323846;

int main() {
    // if desired, create an application type alias to avoid errors
    using Real = sw::universal::half; // half-precision IEEE-754 floating-point  

    Real a = sqrt(2);
    Real b = pi;
    // finally, call your kernel with your desired arithmetic type
    std::cout << "Result: " << MyKernel(a, b) << std::endl;  
}

该库包含特殊 IEEE-754 格式的快速实现,这些格式没有跨 x86、ARM、POWER、RISC-V 和 GPUs 的通用硬件实现。提供了特殊格式,例如四分之一精度 quarter、半精度 half 和四精度 quad,以及特定于供应商的扩展,例如 NVIDIA TensorFloat、Google 的 Brain Float、 bfloat16,或 TI DSP 定点,fixpnt。除了这些常用的专业化之外,通用还支持静态和弹性整数、小数、定点、有理数、线性浮点数、锥形浮点数、对数、区间和自适应精度整数、有理数和浮点数。如果您想添加自己的数字系统框架,可以使用示例数字系统框架来快速入门。

沟通渠道

Bibtex 记录

@article{Quinlan:2024,
    author     = {James Quinlan, E. Theodore L. Omtzigt},
    title      = {Iterative Refinement with Low-Precision Posits},
    journal    = {arXiv:2408.13400},
    year       = {2024},
}

@article{omtzigt2023universal,
  title={Universal Numbers Library: Multi-format Variable Precision Arithmetic Library},
  author={Omtzigt, E Theodore L and Quinlan, James},
  journal={Journal of Open Source Software},
  volume={8},
  number={83},
  pages={5072},
  year={2023}
}

@inproceedings{Omtzigt:2022,
  title        = {Universal: Reliable, Reproducible, and Energy-Efficient Numerics},
  author       = {E. Theodore L. Omtzigt and James Quinlan},
  booktitle    = {Conference on Next Generation Arithmetic},
  pages        = {100--116},
  year         = {2022},
  organization = {Springer}
}

@article{Omtzigt2020,
    author     = {E. Theodore L. Omtzigt and Peter Gottschling and Mark Seligman and William Zorn},
    title      = {{Universal Numbers Library}: design and implementation of a high-performance reproducible number systems library},
    journal    = {arXiv:2012.11011},
    year       = {2020},
}

演讲和演讲

以下演示介绍了通用及其截至发布时所包含的数字系统。

FPTalks'21 演示文稿的幻灯片

演示:应用程序驱动的自定义编号系统

CoNGA'22 演示文稿的幻灯片

演示:通用:可靠、可重复且节能的数值

数字系统参数化结构的快速描述可以在这里找到 here。

快速启动

请遵循 如何运行-sanitizers.md 中的本地工作流程说明。

如果您只想试验 Universal 而无需克隆和构建源代码,可以使用一个预装了编译器、cmake 和库的 Docker 容器:

> docker pull stillwater/universal
> docker run -it --rm stillwater/universal bash
stillwater@container:~$ ieee 1.5
stillwater@container:~$ cat > hello.cpp << 'EOF'
#include 
#include 
int main() {
    sw::universal::posit<16,2> p = 1.5;
    std::cout << p << '\n';
}
EOF
stillwater@container:~$ g++ -std=c++20 -I/usr/local/include/sw -o hello hello.cpp && ./hello

这里 是命令行工具必须提供的功能的快速参考。

VS 代码开发容器

对于同时使用 GCC 和 Clang 的完整开发环境,请安装 Docker 和 开发容器 VS 代码扩展,然后打开存储库并选择 在容器中重新打开。 CMake 预设(gcc-debugclang-release 等)在 CMake 工具预设选择器中可用。

如何建造

如果您确实想使用代码,可以使用 cmake 版本 v4.2.1 构建通用数字软件库。 安装最新的 cmake。 有适用于 MacOS 和 Windows 的交互式安装程序。 对于 Linux,可移植的方法会下载 shell 存档并将其安装在 /usr/local 处:

> wget https://github.com/Kitware/CMake/releases/download/v4.2.1/cmake-4.2.1-Linux-x86_64.sh
> sudo sh cmake-4.2.1-Linux-x86_64.sh --prefix=/usr/local --exclude-subdir

对于 Ubuntu,snap 将安装最新的 cmake,并且是首选方法:

> sudo snap install cmake --classic

通用库是一个纯C++模板库,没有任何进一步的依赖项, 甚至回归测试套件也能实现无忧安装和使用。

克隆 GitHub 存储库,您就可以构建通用库的不同组件了。
该库包含使用整数、小数、定点、浮点数、正数、有效值和对数的工具 数字系统。它包括展示简单用例的教育计划,以供您熟悉 不同的数字系统和应用示例,强调使用其他数字系统来获得性能 或数值精度。最后,每个数字系统都提供自己的验证套件。

熟悉构建过程中所有选项的最简单方法是启动 CMake GUI(如果您使用的是无头服务器,则启动 ccmake)。 CMake 输出将总结已设置的选项。
输出将如下所示:

$ git clone https://github.com/stillwater-sc/universal
$ cd universal
$ mkdir build
$ cd build
$ cmake -DUNIVERSAL_BUILD_ALL=ON ..

 _____  _____  ____  _____  _____  ____   ____  ________  _______     ______        _       _____
|_   _||_   _||_   \|_   _||_   _||_  _| |_  _||_   __  ||_   __ \  .' ____ \      / \     |_   _|
  | |    | |    |   \ | |    | |    \ \   / /    | |_ \_|  | |__) | | (___ \_|    / _ \      | |
  | '    ' |    | |\ \| |    | |     \ \ / /     |  _| _   |  __ /   _.____`.    / ___ \     | |   _
   \ \__/ /    _| |_\   |_  _| |_     \ ' /     _| |__/ | _| |  \ \_| \____) | _/ /   \ \_  _| |__/ |
    `.__.'    |_____|\____||_____|     \_/     |________||____| |___|\______.'|____| |____||________|

-- Version from git tag v4.6.11: 4.6.11
-- The C compiler identification is GNU 13.3.0
-- The CXX compiler identification is GNU 13.3.0
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/cc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- No default build type specified: setting CMAKE_BUILD_TYPE=Release
-- C++20 has been enabled by default
-- UNIVERSAL_BUILD_REGRESSION_SANITY   ON
-- UNIVERSAL_BUILD_REGRESSION_LEVEL_1  ON
-- Performing Test COMPILER_HAS_SSE3_FLAG
-- Performing Test COMPILER_HAS_SSE3_FLAG - Success
-- Performing Test COMPILER_HAS_AVX_FLAG
-- Performing Test COMPILER_HAS_AVX_FLAG - Success
-- Performing Test COMPILER_HAS_AVX2_FLAG
-- Performing Test COMPILER_HAS_AVX2_FLAG - Success
--
-- PROJECT_NAME                = universal
-- PROJECT_NAME_NOSPACES       = universal
-- PROJECT_SOURCE_DIR          = /home/stillwater/dev/stillwater/clones/universal
-- PROJECT_VERSION             = 4.6.11.9a7c0243
-- CMAKE_C_COMPILER            = /usr/bin/cc
-- CMAKE_CXX_COMPILER          = /usr/bin/c++
-- CMAKE_CURRENT_SOURCE_DIR    = /home/stillwater/dev/stillwater/clones/universal
-- CMAKE_CURRENT_BINARY_DIR    = /home/stillwater/dev/stillwater/clones/universal/build
-- GIT_COMMIT_HASH             = 9a7c0243
-- GIT_BRANCH                  = main
-- include_install_dir         = include
-- include_install_dir_full    = include
-- config_install_dir          = share/universal
-- include_install_dir_postfix =
-- Add test multifile from source folder Applications/Environment/Multifile.
-- CMAKE_CXX_COMPILER ID is -GNU-
-- Adding regression suite for complex arithmetic using fixpnt
-- Adding regression suite for complex math functions using fixpnt
-- Removing regression suite for complex arithmetic using posit1
-- Removing regression suite for complex math functions using posit1
-- Removing regression suite for complex arithmetic using cfloats
-- Removing regression suite for complex math functions using cfloats
-- Adding regression suite for sw::universal::complex
-- adding rpoly test suite
-- ucalc: readline not found, using basic line input
-- Adding playground complex experiment
-- Adding playground concurrency experiment
-- TBB found: linking to concurrency experiment
-- Ignoring complex tests for application/performance
-- Found clang-format: /usr/bin/clang-format-18
--   Version: Ubuntu clang-format version 18.1.3 (1ubuntu1)
--   Files to format: 2017
-- Found clang-tidy: /usr/bin/clang-tidy-18
--   Version: Ubuntu LLVM version 18.1.3
  Optimized build.
--   Header files for analysis: 1008
--   Sample test files for analysis: 29
--
-- Clang-tidy targets configured:
--   make tidy-check         - Run clang-tidy on headers (read-only)
--   make tidy-check-samples - Run clang-tidy on sample test files
--   make tidy-fix           - Apply clang-tidy fixes to headers
--   make tidy-info          - Show detailed configuration
--   Script: /home/stillwater/dev/stillwater/clones/universal/build/run-clang-tidy.sh
--
-- ******************* Universal Arithmetic Library Configuration Summary *******************
-- General:
--   Version                                    :   4.6.11.9a7c0243
--   System                                     :   Linux
--   C++ Language Requirement                   :   C++20
--   C compiler                                 :   /usr/bin/cc
--   Release C flags                            :   -O3 -DNDEBUG -Wall -Wpedantic -Wno-narrowing -Wno-deprecated
--   Debug C flags                              :   -g -Wall -Wpedantic -Wno-narrowing -Wno-deprecated
--   C++ compiler                               :   /usr/bin/c++
--   Release CXX flags                          :   -O3 -DNDEBUG   -Wall -Wpedantic -Wno-narrowing -Wno-deprecated -Wall -Wpedantic -Wno-narrowing -Wno-deprecated
--   Debug CXX flags                            :   -g   -Wall -Wpedantic -Wno-narrowing -Wno-deprecated -Wall -Wpedantic -Wno-narrowing -Wno-deprecated
--   Build type                                 :   Release
--
--   UNIVERSAL_BUILD_ALL                        :   ON
--   UNIVERSAL_BUILD_CI                         :   OFF
--   UNIVERSAL_BUILD_CI_LITE                    :   OFF
--
--   UNIVERSAL_BUILD_DEMONSTRATION              :   ON
--   UNIVERSAL_BUILD_NUMBERS                    :   ON
--   UNIVERSAL_BUILD_NUMBER_CASCADES            :   ON
--   UNIVERSAL_BUILD_NUMERICS                   :   ON
--   UNIVERSAL_BUILD_BENCHMARKS                 :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_SDK         :   ON
--   UNIVERSAL_BUILD_COMPLEX                    :   ON
--   UNIVERSAL_BUILD_CONCURRENCY                :   ON
--   UNIVERSAL_BUILD_UTILITY                    :   ON
--
--   UNIVERSAL_BUILD_TOOLS_CMD_LINE             :   ON
--   UNIVERSAL_BUILD_TOOLS_UTILS                :   ON
--   UNIVERSAL_BUILD_TOOLS_CLOSURE              :   OFF
--   UNIVERSAL_BUILD_PLAYGROUND                 :   ON
--   UNIVERSAL_BUILD_EDUCATION                  :   ON
--   UNIVERSAL_BUILD_EDUCATION_INTERACTIVE      :   OFF
--   UNIVERSAL_BUILD_APPLICATIONS               :   ON
--   UNIVERSAL_BUILD_PAPERS                     :   ON
--
--   UNIVERSAL_BUILD_NUMERIC_FUNCTIONS          :   ON
--   UNIVERSAL_BUILD_NUMERIC_FAITHFUL           :   ON
--   UNIVERSAL_BUILD_NUMERIC_QUIRES             :   ON
--   UNIVERSAL_BUILD_NUMERIC_CHALLENGES         :   ON
--   UNIVERSAL_BUILD_NUMERIC_UTILS              :   ON
--   UNIVERSAL_BUILD_NUMERIC_FPBENCH            :   ON
--
--   UNIVERSAL_BUILD_LINEAR_ALGEBRA_BLAS        :   ON
--   UNIVERSAL_BUILD_LINEAR_ALGEBRA_VMATH       :   ON
--   UNIVERSAL_BUILD_LINEAR_ALGEBRA_DATA        :   ON
--
--   UNIVERSAL_BUILD_BENCHMARK_ERROR            :   ON
--   UNIVERSAL_BUILD_BENCHMARK_ACCURACY         :   ON
--   UNIVERSAL_BUILD_BENCHMARK_RANGE            :   ON
--   UNIVERSAL_BUILD_BENCHMARK_REPRODUCIBILITY  :   ON
--   UNIVERSAL_BUILD_BENCHMARK_PERFORMANCE      :   ON
--   UNIVERSAL_BUILD_BENCHMARK_ENERGY           :   ON
--
--   UNIVERSAL_BUILD_MIXEDPRECISION_ROOTS       :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_APPROXIMATE :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_INTEGRATE   :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_INTERPOLATE :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_OPTIMIZE    :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_TENSOR      :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_METHODOLOGY :   ON
--   UNIVERSAL_BUILD_MIXEDPRECISION_POP         :   ON
--
--   UNIVERSAL_BUILD_TYPE_HIERARCHY             :   ON
--   UNIVERSAL_BUILD_APP_ENVIRONMENT            :   ON
--
--   UNIVERSAL_BUILD_C_API_PURE_LIB             :   ON
--   UNIVERSAL_BUILD_C_API_SHIM_LIB             :   ON
--   UNIVERSAL_BUILD_C_API_LIB_PIC              :   ON
--
--   UNIVERSAL_BUILD_NUMBER_INTERNALS           :   ON
--   UNIVERSAL_BUILD_NUMBER_NATIVE_TYPES        :   ON
--
--   UNIVERSAL_BUILD_NUMBER_ELASTICS            :   ON
--   UNIVERSAL_BUILD_NUMBER_EINTEGERS           :   ON
--   UNIVERSAL_BUILD_NUMBER_EDECIMALS           :   ON
--   UNIVERSAL_BUILD_NUMBER_ERATIONALS          :   ON
--   UNIVERSAL_BUILD_NUMBER_EFLOATS             :   ON
--   UNIVERSAL_BUILD_NUMBER_EREALS              :   ON
--   UNIVERSAL_BUILD_NUMBER_ELREALS             :   OFF
--
--   UNIVERSAL_BUILD_NUMBER_STATICS             :   ON
--   UNIVERSAL_BUILD_NUMBER_INTEGERS            :   ON
--   UNIVERSAL_BUILD_NUMBER_DECIMALS            :   ON
--   UNIVERSAL_BUILD_NUMBER_RATIONALS           :   ON
--   UNIVERSAL_BUILD_NUMBER_FIXPNTS             :   ON
--   UNIVERSAL_BUILD_NUMBER_DFIXPNTS            :   ON
--   UNIVERSAL_BUILD_NUMBER_BFLOATS             :   ON
--   UNIVERSAL_BUILD_NUMBER_CFLOATS             :   ON
--   UNIVERSAL_BUILD_NUMBER_DFLOATS             :   ON
--   UNIVERSAL_BUILD_NUMBER_HFLOATS             :   ON
--   UNIVERSAL_BUILD_NUMBER_DOUBLE_DOUBLE       :   ON
--   UNIVERSAL_BUILD_NUMBER_QUAD_DOUBLE         :   ON
--   UNIVERSAL_BUILD_NUMBER_DD_CASCADE          :   ON
--   UNIVERSAL_BUILD_NUMBER_TD_CASCADE          :   ON
--   UNIVERSAL_BUILD_NUMBER_QD_CASCADE          :   ON
--   UNIVERSAL_BUILD_NUMBER_AREALS              :   ON
--   UNIVERSAL_BUILD_NUMBER_INTERVALS           :   ON
--   UNIVERSAL_BUILD_NUMBER_UNUM1S              :   ON
--   UNIVERSAL_BUILD_NUMBER_UNUM2S              :   ON
--   UNIVERSAL_BUILD_NUMBER_POSITS              :   ON
--   UNIVERSAL_BUILD_NUMBER_POSITOS             :   ON
--   UNIVERSAL_BUILD_NUMBER_VALIDS              :   ON
--   UNIVERSAL_BUILD_NUMBER_TAKUMS              :   ON
--   UNIVERSAL_BUILD_NUMBER_LNS                 :   ON
--   UNIVERSAL_BUILD_NUMBER_DBNS                :   ON
--   UNIVERSAL_BUILD_NUMBER_QUIRES              :   ON
--   UNIVERSAL_BUILD_NUMBER_SORNS               :   ON
--   UNIVERSAL_BUILD_NUMBER_MICROFLOATS         :   ON
--   UNIVERSAL_BUILD_NUMBER_E8M0                :   ON
--   UNIVERSAL_BUILD_NUMBER_MXFLOATS            :   ON
--   UNIVERSAL_BUILD_NUMBER_NVBLOCKS            :   ON
--   UNIVERSAL_BUILD_NUMBER_ZFPBLOCKS           :   ON
--
--   UNIVERSAL_BUILD_NUMBER_CONVERSIONS         :   ON
--
--   UNIVERSAL_BUILD_VALIDATION_MATH            :   OFF
--   UNIVERSAL_BUILD_VALIDATION_HW              :   ON
--
-- Regression Testing Level:
--   UNIVERSAL_BUILD_REGRESSION_SANITY          :   ON
--
-- Compiler Configuration:
--   Verbose build messages                     :
--                                        NO
--
-- Sanitizers (GCC/Clang only):
--   AddressSanitizer                           :
--                                        NO
--   UndefinedBehaviorSanitizer                 :
--                                        NO
--
-- Dependencies:
--   SSE3                                       :
--                                        NO
--   AVX                                        :
--                                        NO
--   AVX2                                       :
--                                        NO
--
-- Utilities:
--   Serializer                                 :
--                                        NO
--
-- Install:
--   Install path                               :   /usr/local
--

 _____  _____  ____  _____  _____  ____   ____  ________  _______     ______        _       _____
|_   _||_   _||_   \|_   _||_   _||_  _| |_  _||_   __  ||_   __ \  .' ____ \      / \     |_   _|
  | |    | |    |   \ | |    | |    \ \   / /    | |_ \_|  | |__) | | (___ \_|    / _ \      | |
  | '    ' |    | |\ \| |    | |     \ \ / /     |  _| _   |  __ /   _.____`.    / ___ \     | |   _
   \ \__/ /    _| |_\   |_  _| |_     \ ' /     _| |__/ | _| |  \ \_| \____) | _/ /   \ \_  _| |__/ |
    `.__.'    |_____|\____||_____|     \_/     |________||____| |___|\______.'|____| |____||________|

正如您在 cmake 输出中看到的,有许多构建目标。每个构建目标旨在提供 使用不同的数字系统时专注并快速构建周转。每个数系都有其 自己的构建目标允许快速高效的回归测试。

默认构建配置是构建 DEMONSTRATION 集,其中包含 CMD_LINE_TOOLS、UTILS、 EDUCATION、APPLICATIONS 和 PLAYGROUND。

构建选项为 enabled/disabled,如下所示:

> cmake -DUNIVERSAL_BUILD_EDUCATION=OFF -DUNIVERSAL_BUILD_NUMBER_POSITS=ON ..

构建后,发出命令 make test 运行所有已启用组件的完整测试套件, 作为修改源代码时的回归功能。这将触及代码的所有角落。

> git clone https://github.com/stillwater-sc/universal
> cd universal
> mkdir build
> cd build
> cmake ..
> make -j "$(nproc)"
> make test

对于 Windows 和 Visual Studio,有 CMakePredefinedTargets 可以完成相同的任务:

    - ALL_BUILD will compile all the projects
    - INSTALL   will install the Universal library
    - RUN_TESTS will run all tests

以下是Universal的V3.68中包含的所有项目的布局:

应用程序部分,您将找到演示 Universal 的使用的应用程序示例 算术类型来实现不同的数值目标,例如再现性、准确性、性能、 或精度。这些示例是满足您自己的应用程序需求的良好起点。

如何开发和扩展 通用

Universal 库包含数百个示例程序,用于演示算术类型的使用并使新开发人员能够快速上手。在每个数字系统类型的回归套件中,都有一个 api/api.cpp 记录所有调用和用例,以提供如何使用该类型的可执行示例。一般来说,回归测试的 api 部分包含如何使用不同库组件的代码示例,例如操纵器、属性、数字特征、异常和特殊情况。

education 构建目标 (BUILD_EDUCATION) 中,有单独的测试程序演示如何使用不同类型。

docs 目录包含 命令行工具 的描述、教程 解释 Universal 中算术类型的参数化设计、几个会议演示、FPTalks 和 CoNGA22,描述算术类型。 docs 目录还包含 AI 和 DSP 应用程序中感兴趣的许多关键小型算术类型的即用型值表和动态范围比较。

每个数字系统都配有完整的回归套件,用于验证赋值、转换、算术、逻辑、异常、数字特征和特殊情况的功能。这些回归套件针对每个 PR 运行或推送到版本分支。 通用 为此使用标准 GitHub 操作,因此将您的分支添加到工作流 cmake yaml 中以触发您自己的分支的 CI。

最简单的开始方法是选择并复制 ROOT/include/universal/number/skeleton_1paramROOT/include/universal/number/skeleton_2params 下的目录结构。它们被配置为让您获得通用风格的数字系统的所有组成部分。

安装与使用

克隆库、在您的环境中构建并测试它后,您可以通过以下方式安装它:

> cd universal/build
> cmake .. -DCMAKE_INSTALL_PREFIX:PATH=/your/installation/path
> cmake --build . --config Release --target install -- -j $(nproc)

或者通过构建目录中的 Makefile 目标手动:

> make -j $(nproc) install

Linux下默认安装目录为/usr/local。 还有一个_uninstall_命令:

> make uninstall

如果你想在自己的项目中使用Universal提供的数字系统, 您可以使用以下 CMakeLists.txt 结构:

project("my-numerical-experiment")

find_package(UNIVERSAL CONFIG REQUIRED)

add_executable(${PROJECT_NAME} src/mymain.cpp)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
target_link_libraries(${PROJECT_NAME} universal::universal)

控制构建以包含不同的组件

默认构建配置将构建命令行工具、游乐场、教育和 应用实例。如果您想构建跨所有数字系统的完整回归套件, 使用以下 cmake 命令:

cmake -DUNIVERSAL_BUILD_ALL=ON ..

为了提高性能,构建配置可以启用特定的 x86 指令集 (SSE/AVX/AVX2)。 例如,如果您的处理器支持 AVX2 指令集,您可以构建测试套件 以及打开 AVX2 标志的教育示例。这通常会带来 20% 的性能提升。

cmake -DUNIVERSAL_BUILD_ALL=on -DUSE_AVX2=ON ..

该库构建了一组有用的命令实用程序来检查本机 IEEE float/double/long double 类型,以及 Universal 提供的自定义数字系统。假设你已经构建并 安装了库后,可用的检查命令有:

    ieee           -- show the components of the full set of IEEE floating point values
    quarter        -- show the components and traits of a quarter precision floating-point value (FP8)
    half           -- show the components and traits of a half precision IEEE-754 value (FP16)
    single         -- show the components and traits of a single precision IEEE-754 value (FP32)
    double         -- show the components and traits of a double precision IEEE-754 value (FP64)
    longdouble     -- show the components and traits of a native long double IEEE-754 value
    quad           -- show the components and traits of a quad precision IEEE-754 value (FP128)

    signedint      -- show the components and traits of a signed integer value
    unsignedint    -- show the components and traits of an unsigned integer value
    fixpnt         -- show the components and traits of a fixed-point value
    posit          -- show the components and traits of a posit value
    lns            -- show the components and traits of a logarithmic number system value

    float2posit    -- show the conversion process of a Real value to a posit

    propenv        -- show the properties of the execution (==compiler) environment that built the library
    propp          -- show numerical properties of a posit environment including the associated quire
    propq          -- show numerical properties of a quire

例如:

$ ieee 1.234567890123456789012
compiler              : 7.5.0
float precision       : 23 bits
double precision      : 52 bits
long double precision : 63 bits

Decimal representations
input value:             1.23456789012
      float:                1.23456788
     double:        1.2345678901199999
long double:    1.23456789011999999999

Hex representations
input value:             1.23456789012
      float:                1.23456788    hex: 0.7f.1e0652
     double:        1.2345678901199999    hex: 0.3ff.3c0ca428c1d2b
long double:    1.23456789011999999999    hex: 0.3fff.1e06521460e95b9a

Binary representations:
      float:                1.23456788    bin: 0.01111111.00111100000011001010010
     double:        1.2345678901199999    bin: 0.01111111111.0011110000001100101001000010100011000001110100101011
long double:    1.23456789011999999999    bin: 0.011111111111111.001111000000110010100100001010001100000111010010101101110011010

Native triple representations (sign, scale, fraction):
      float:                1.23456788    triple: (+,0,00111100000011001010010)
     double:        1.2345678901199999    triple: (+,0,0011110000001100101001000010100011000001110100101011)
long double:    1.23456789011999999999    triple: (+,0,001111000000110010100100001010001100000111010010101101110011010)

Universal triple representation (sign, scale, fraction):
input value:             1.23456789012
      float:                1.23456788    triple: (+,0,00111100000011001010010)
     double:        1.2345678901199999    triple: (+,0,0011110000001100101001000010100011000001110100101011)
long double:    1.23456789011999999999    triple: (+,0,001111000000110010100100001010001100000111010010101101110011010)
      exact: TBD

ieee 命令非常方便,可以快速确定您的开发环境如何表示(截断)特定值。

具体命令_single_、_double_和_longdouble_分别关注float、double和long double表示。

还有一个命令 posit 可以帮助您可视化和比较给定值的 posit 组件字段,例如:

$ posit 1.234567890123456789012
posit< 8,0> = s0 r10 e f01000 qNE v1.25
posit< 8,1> = s0 r10 e0 f0100 qNE v1.25
posit< 8,2> = s0 r10 e00 f010 qNE v1.25
posit< 8,3> = s0 r10 e000 f01 qNE v1.25
posit<16,1> = s0 r10 e0 f001111000001 qNE v1.234619140625
posit<16,2> = s0 r10 e00 f00111100000 qNE v1.234375
posit<16,3> = s0 r10 e000 f0011110000 qNE v1.234375
posit<32,1> = s0 r10 e0 f0011110000001100101001000011 qNE v1.2345678918063641
posit<32,2> = s0 r10 e00 f001111000000110010100100001 qNE v1.2345678880810738
posit<32,3> = s0 r10 e000 f00111100000011001010010001 qNE v1.2345678955316544
posit<48,1> = s0 r10 e0 f00111100000011001010010000101000110001011010 qNE v1.2345678901234578
posit<48,2> = s0 r10 e00 f0011110000001100101001000010100011000101101 qNE v1.2345678901234578
posit<48,3> = s0 r10 e000 f001111000000110010100100001010001100010110 qNE v1.2345678901233441
posit<64,1> = s0 r10 e0 f001111000000110010100100001010001100010110011111101100000000 qNE v1.2345678901234567
posit<64,2> = s0 r10 e00 f00111100000011001010010000101000110001011001111110110000000 qNE v1.2345678901234567
posit<64,3> = s0 r10 e000 f0011110000001100101001000010100011000101100111111011000000 qNE v1.2345678901234567

这些字段以其第一个字符为前缀,例如“posit<16,2> = s0 r10 e00 f00111100000 qNE v1.234375”

字段值后跟象限描述符和十进制值表示形式:

一个命题的积极机制显示了一个非常具体的结构,如下图所示:

在您自己的混合精度算法研究中利用 通用 库

为了快速、稳健地引导任何新的混合精度算法开发和优化项目,可以使用 github 模板存储库,它将建立一个完整的工作开发环境,其中包含依赖库、开发容器、VS 代码集成和 Github CI 工作流程。模板存储库可以在 mpadao-template 中找到。

模板存储库是开始使用 Universal 进行混合精度算法开发的最简单方法。

动机

现代深度学习 AI 应用程序是要求非常苛刻的高性能应用程序。训练运行时间 模型以周为单位进行衡量,推理的目标延迟为 10-100 毫秒。标准型 双精度,甚至单精度 IEEE-754 浮点在寻址中使用起来太昂贵 AI 云和边缘应用程序的性能和功耗要求。 谷歌和微软都放弃了其 AI 云服务的传统浮点格式 以获得两个数量级的更好性能。同样,AI 移动和嵌入式应用 应用程序被重新量化为小整数,以适应其非常严格的功率预算。 AI 域 一直在研究更好的数字系统来满足功率和性能要求, 但所有这些努力都是孤立进行的,其结果很难重现。

AI 应用程序只是暴露传统硬件局限性的一些应用程序。数字存储和操作的低效率也限制了云规模、IoT、嵌入式和HPC应用程序。对新数字系统的简单更改可以将这些应用程序的规模和成本提高几个数量级。

当性能和功效是用例的差异化属性时,需要根据应用程序的需求定制的算术系统。

特别是,使用 IEEE-754 浮点格式时有两个问题:

更具体地说,

  1. 浪费的位模式 - 32 位 IEEE 浮点有大约八百万种方式来表示 NaN(非数字),而 64 位浮点有两个四万亿,更准确地说约为 2.251x10^15。 NaN 是一个异常值,表示未定义或无效结果,例如除以零的结果。
  2. 数学上不正确 - 该格式指定两个零,一个负零和一个正零,具有不同的行为。 - 由于每次运算后的舍入而导致结合律和分配律丢失。 这种关联和分配算术行为的丢失会导致使用 IEEE 浮点的并发程序产生不可重现的结果。 这对于嵌入式和控制应用来说尤其成问题。
  3. 上溢至 ± inf,下溢至 0 - 上溢到 ± inf 会使相对误差增加无限倍,而下溢到 0 会丢失符号信息。
  4. 未使用的动态范围 - 双精度浮点数的动态范围高达 2^2047,而大多数数值软件的架构都在 1.0 左右运行。
  5. 复杂的电路 - 非规范化浮点数有一个隐藏位 0 而不是 1。这会产生一系列特殊处理要求,使兼容的硬件实现变得复杂。
  6. 无逐渐溢出和固定精度 - 如果精度定义为有效数字位数,则 IEEE 浮点对于除非规范化数字之外的所有数字都具有固定精度,因为有效数字位数是固定的。 非规格化数的特征是,当由于隐藏位为零而导致值接近零时,有效数字会减少。 非规格化数字填充下溢间隙(i.e.,介于零和最小非零值之间)。 渐进下溢的对应部分是渐进上溢,这在 IEEE 浮点中不存在。

相比之下,posit 数字系统旨在克服这些负面因素:

  1. 经济 - 没有多余的位模式。 无穷大有一种表示形式,表示为 ± inf 和零。 所有其他位模式都是有效的不同非零实数。 ± inf 用作 NaN 的替代品。
  2. 保留数学属性 - 零只有一种表示形式,并且编码围绕 1.0 对称。 关联律和分配律通过 quire 的延迟舍入得到支持,从而在任何并发环境中实现可重现的线性代数算法。
  3. 锥形精度 - 锥形精度是指小指数的值具有更高的精度,而大指数的值具有更少的精度位数。 这个概念由 Morris (1971) 在他的论文“Tapered Floating Point: A New Floating-Point Representation”中首次提出。
  4. 参数化精度和动态范围 - 位置由大小 nbits 和指数位数 es 定义。这使得系统设计人员能够自由选择应用所需的正确精度和动态范围。 例如,我们可以为 AI 应用程序选择没有任何指数位的 5 位或 6 位位置来提高性能。 对于嵌入式 DSP 应用,例如 5G 基站,我们可以选择具有一个指数位的 16 位位置,以提高每瓦性能。
  5. 更简单的电路 - 只有两种例外情况:非实数和零。 没有非规范化数字、上溢或下溢。

然而,正如深度学习所证明的那样,优化算法和优化算法有许多不同的要求。 根据应用程序的需求进行定制。 Universal 将所有机器聚集在一起进行实验 在提交之前促进有效对比和比较不同的算术数字系统设计 到硬件。

图书馆的目标

通用 库最初是作为不断发展的 unum 类型 III 的位级算术参考实现 (正确和有效)标准。然而,支持数字系统的需求,例如自适应精度整数 解决大阶乘问题,自适应精度浮点数充当预言机,或者比较线性浮点数和锥形浮点数 提供了创建数值分析和计算数学的完整平台的机会。 借助这个通用平台,我们为优化算法以利用混合精度提供了新的方向 计算以最大限度地提高性能并最大限度地减少能源需求。能源效率将成为 嵌入式智能应用的关键差异化因素。

作为参考库,Universal 提供了广泛的测试基础设施来验证数字系统 算术运算,并且有许多实用程序可以检查内部编码和运算 不同的数字系统。

定制算术的设计空间是巨大的,任何对扩展算术能力的贡献 鼓励使用通用图书馆。

验证套件

通常,验证套件作为构建目录的 make test 命令的一部分运行。但是,可以运行特定的测试套件组件,例如,验证对更复杂的算术函数(例如平方根、指数、对数和三角函数)的算法更改。

这是一个例子:

>:~/dev/universal/build$  make posit_logarithm
[ 50%] Building CXX object static/posit/CMakeFiles/posit_logarithm.dir/math/logarithm.cpp.o
[100%] Linking CXX executable posit_logarithm
[100%] Built target posit_logarithm
>:~/dev/universal/build$ static/posit/posit_logarithm
posit logarithm function validation: results only
               4 -> log(4) =  1.3862943649292
0110000000000000 -> log(4) = 0100011000101110 (reference: 0100011000101110)   PASS

posit<2,0>                                                   log PASS
posit<3,0>                                                   log PASS
posit<3,1>                                                   log PASS
posit<4,0>                                                   log PASS
posit<4,1>                                                   log PASS
posit<5,0>                                                   log PASS
posit<5,1>                                                   log PASS
posit<5,2>                                                   log PASS
posit<8,4>                                                   log PASS
posit<8,4>                                                   log2 PASS
posit<8,4>                                                   log10 PASS
posit logarithm function validation: PASS

树的结构

通用库包含一组功能组来组织开发和验证 不同的数字系统。每个数字系统类型都有一个包含文件,该文件将 算术数字类型和 Universal 已标准化的所有扩展,以便 使用数字类型的工作效率更高。例如,用于数字特征的设施、 算术异常层次结构、数字系统属性、操纵器、 最后,专门针对该类型的数学库。

数字系统类型分为_静态_ 或_弹性_。静态类型是算术类型 有一个常量,即 static 大小,因此可用于共享复合数据结构, 例如矩阵和张量,介于通用 CPUs 和专用硬件加速I器之间。 弹性类型是在计算过程中可以增长和收缩的算术类型,通常是为了适应 无错误或封闭计算。

除了静态和弹性分类之外,我们还认识到数字的基数 系统是该类型的算术和数字特征的关键参数。特别是,树 将专门研究二进制和十进制形式的算术。

这是一个完整的列表:

_静态_固定大小的配置

_弹性_自适应精度配置

超级累加设施

每个功能组都有一个关联的测试套件,位于“.../universal/tests/...”

背景资料

万能数,简称unum,表示实数和实数范围。有两种操作模式可供程序员选择:posit 模式和_valid_ 模式。

posit 模式下,unum 的行为类似于固定大小的浮点数,如果计算结果无法精确表达,则四舍五入到最接近的可表达值。 与具有相同位数的浮点数相比,位置提供更高的精度和更宽的动态范围。

valid 模式下,unum 表示一系列实数,可用于严格限制答案,就像区间算术一样。

位置配置彼此之间具有特定的关系。当扩展一个位置时,新值落在较小位置的旧值“之间”。如果扩展位是分数位,则新值是两个数字的算术平均值;如果扩展位是政权或指数位,则新值是两个数字的几何平均值。 此 页面 显示了 posit<2,0>posit<7,1> 扩展的可视化:

文档

文档 目录包含 Universal 库类型的设计文档和教程。 已发布的文档站点位于 https://stillwater-sc.github.io/universal/. 对于本地 build/test/sanitize/coverage 工作流程,请参阅 how-to-run-sanitizers.md。

通用库计数(仅限 C/C++)

文件 代码 LOC 注释
include/(头库) 第998章 124,785 实际的库 - 仅标题数字系统
回归套件(静态/+弹性/+内部/+验证/) 716 src + 6 hdr 111,619 测试每种数字系统的每种类型的测试程序
应用/ 120 src + 20 HDR 14,576 按用例组织的工作示例
其余组件(工具/+教育/+游乐场/+基准/+混合精度/+linalg/+数字/+c_api/+...) 244 src + 22 hdr + 13 C 39,214 CLIs(ucalc、bisection、ieee...)、教程、混合精度 SDK、BLAS、基准测试、C 包装器

总计:

整个存储库中其他值得注意的类别:Markdown 文档的 44,760 LOC、CSV 数据表的 25,101 LOC、CMake 的 3,273 LOC 以及YAML/Python/TeX/etc。

构建目录、docs-site/(自动生成)、deprecated/、bin/、Testing/ 和 .git/ 被排除在外。

公共领域和社区资源

unum 格式是公共领域规范和网络资源的集合,用于使用 unum 管理信息和讨论。

定位中心

Unum-computing Google Group

利用职位的项目

矩阵模板库

矩阵模板库结合了现代 C++ 编程技术,为用户提供简单直观的界面,同时实现最佳性能。 MTL4 中的自然数学符号使所有工程师和科学家能够在最短的时间内实现他们的算法和模型。所有技术方面都封装在库中。对于应用程序,请将其视为 MATLAB。

G+SMO

G+Smo(几何+模拟模块,发音为“gismo”)是一个新的开源C++库,汇集了用于几何设计和数值模拟的数学工具。它主要由研究人员和PhD学生开发。它实现了相对较新的等几何分析范例,这建议在设计和分析流程中使用统一的框架。 G+Smo是一个面向对象、跨平台、模板C++库,遵循通用编程原则,注重效率和易用性。该库被划分为更小的实体,称为模块。可用模块的示例包括与维度无关的 NURBS 模块、数据拟合和实体分割模块、PDE 离散化模块和基于任意维度和多项式次数的分层样条的自适应样条模块。

FEniCS

FEniCS是一个流行的开源(LGPLv3)计算平台,用于求解偏微分方程(PDEs)。 FEniCS 使用户能够快速将科学模型转化为高效的有限元代码。通过 FEniCS 的高级 Python 和 C++ 接口,很容易上手,但 FEniCS 还为更有经验的程序员提供强大的功能。 FEniCS 可在从笔记本电脑到高性能集群的多种平台上运行。

ODEINT-v2

Odeint 是一个现代 C++ 库,用于数值求解常微分方程。它是使用模板元编程以通用方式开发的,从而在顶级性能下实现非凡的高灵活性。数值算法的实现独立于底层算术。这使得该库具有令人难以置信的适用性,特别是在非标准环境中。例如,odeint支持矩阵类型、任意精度算术,甚至可以轻松地在CUDA GPUs上运行。

多个 AI 和深度学习库正在重新设计,以支持使用假设进行训练和推理。它们将在发布时宣布。

喜欢(0)

上一篇

hand-drawn-video-prompts:实践指南

hand-drawn-video-prompts:实践指南

下一篇

android-material-design-Open-source-projects:实践指南

android-material-design-Open-source-projects:实践指南
猜你喜欢