#evaluation #implicit #surfaces #tape #jit #jit-compiler #complex

fidget

复杂闭式隐式表面的基础设施

16个不稳定版本 (3个破坏性)

0.3.1 2024年6月4日
0.2.7 2024年5月18日
0.2.2 2024年3月21日
0.1.4 2023年3月24日
0.0.1 2022年11月3日

#57 in 图形API

Download history 93/week @ 2024-05-09 188/week @ 2024-05-16 99/week @ 2024-05-23 142/week @ 2024-05-30 38/week @ 2024-06-06 5/week @ 2024-06-13 1/week @ 2024-07-04

1,117 每月下载量
用于 fidget_math

MPL-2.0 许可证

1MB
19K SLoC

Fidget

» Crate » Docs » CI » MPL-2.0

Fidget是复杂闭式隐式表面的实验性基础设施。

目前,它是安静公开的:它在GitHub上可用,并发布到crates.io,但在做出更大公告之前,我希望您不要将其发布到Hacker News / Twitter /等等;我计划写一篇概述博客文章,并准备一些演示应用程序。如果您有强烈的愿望谈论它,请直接联系我

该库包含各种数据结构和算法,例如

  • 数学表达式的操作和去重
  • 将图转换为用于评估的直线代码("磁带")
  • 基于区间评估结果进行磁带简化
  • 一个非常快的JIT编译器,有手写的aarch64x86_64例程
    • 点评估(f32
    • 区间评估([lower, upper]
    • SIMD评估(ARM上的f32 x 4,x86上的f32 x 8
    • 梯度评估(相对于x,y和z的偏导数)
  • 2D隐式表面的位图渲染(具有各种渲染模式)和3D(生成高度图和法线)
  • 网格化(使用我们自己的双流形轮廓算法实现)

如果这一切听起来很熟悉,那是因为你阅读过《复杂闭式隐式表面的大规模并行渲染》。Fidget 包含了该论文中的所有构建块,但更侧重于在 CPU 上(本地)评估,而不是在 GPU 上(解释性)评估。

该库拥有详细的文档,包括 crate 级别文档中的 API 高级概述;这是一个很好的入门地方!

目前,它具有类似于乐高积木但无说明书的感觉:有许多单独记录的功能,但将它们组合成有用的东西则留给读者去练习。可能也有一些缺失的部件,API 的缝隙可能不在正确的位置;如果你要使用该库进行严肃的工作,请期待需要分叉它并进行本地修改。

欢迎提出问题和 PR,尽管我可能不会合并任何增加大量维护负担的更改。这是一个个人规模的实验性项目,所以请相应调整你的期望。

演示应用程序

Github 上的仓库中,有两个演示应用程序

  • demo 从命令行进行位图渲染和网格处理
  • viewer 是一个用于交互式探索的最小 GUI

这些故意没有发布到 https://crates.io,因为它们是演示应用程序,而不是完整的最终用户工具。

WebAssembly 演示

wasm-demo 子目录中嵌入 Fidget 到一个网络应用程序中。构建此演示需要主机系统上安装 wasm-pack

在文件夹中,用以下方式运行它:

npm install
npm run serve

或者使用以下方式打包文件进行分发:

npm run build

支持矩阵

目前,Fidget 支持有限的平台数量

平台 JIT 支持 CI 支持
aarch64-apple-darwin ✅ 已测试 ⭐️ 第 0 级
x86_64-unknown-linux-gnu ✅ 已测试 🥇 第 1 级
x86_64-pc-windows-msvc ✅ 已测试 🥈 第 2 级
aarch64-unknown-linux-gnu ⚠️ 已检查 🥇 第 1 级
aarch64-pc-windows-msvc ⚠️ 已检查 🥉 第 3 级
wasm32-unknown-unknown ⚠️ 已检查 🥇 第 1 级

键说明

CI 描述
✅ 已测试 cargo test 在指定的目标上运行
⚠️ 已检查 cargo check 在指定的目标上运行
等级 描述
⭐️ 第 0 级 维护者将该平台作为他们的日常驱动器
🥇 第 1 级 维护者可以访问此平台
🥈 第 2 级 维护者无法访问此平台,但在 CI 中进行了测试
🥉 第 3 级 维护者无法访问此平台,并且它未在 CI 中进行测试

支持等级代表维护者是否能够帮助解决特定平台的错误;例如,如果你发现了一个 aarch64-pc-windows-msvc 特定的错误,请期待你将做大部分的繁重工作。

CPU 要求

aarch64 平台需要 NEON 指令,而 x86_64 平台需要 AVX2 支持;这两个扩展都已有近十年历史,应该很普遍。

禁用 jit 功能允许跨平台渲染,使用解释器而不是 JIT 编译。这对于 wasm32-unknown-unknown 目标是强制性的,因为它无法生成“本地”代码。

类似项目

Fidget 与隐式建模空间中的多个项目重叠

*由同一作者撰写

(MPR论文还引用了许多与相关学术工作的参考文献)

与其他项目相比,Fidget的独特之处在于它具有本机JIT,并在执行带子简化时使用该JIT。将其置于同一作者的项目中——它们都使用大致相同的渲染策略——看起来就像这样

CPU GPU
解释器 libfive,Fidget MPR
JIT Fidget (请提供执行此操作的API)

Fidget的本机JIT使其变得非常快。例如,以下是针对三种不同实现进行光栅化此模型的大致基准测试

大小 libfive MPR Fidget(VM) Fidget(JIT)
1024³ 66.8 ms 22.6 ms 61.7 ms 23.6 ms
1536³ 127 ms 39.3 ms 112 ms 45.4 ms
2048³ 211 ms 60.6 ms 184 ms 77.4 ms

libfive和Fidget运行在M1 Max CPU上;MPR运行在GTX 1080 Ti GPU上。我们注意到Fidget的解释器比libfive略好,而Fidget的JIT几乎与基于GPU的MPR具有竞争力。

Fidget缺少更多成熟项目中存在的许多功能。例如,它只包含一个调试GUI,并且其网格化程度远不如libfive

许可证

© 2022-2024 Matthew Keeter
Mozilla公共许可证2.0下发布

依赖项

~8–44MB
~702K SLoC