Newton 引擎按形状排序软接触候选对:确定性接触排序的设计、实现与性能权衡

发布时间:2026/9/18 1:16:13

Newton 引擎按形状排序软接触候选对:确定性接触排序的设计、实现与性能权衡 Newton 引擎按形状排序软接触候选对确定性接触排序的设计、实现与性能权衡【免费下载链接】newtonAn open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers.项目地址: https://gitcode.com/GitHub_Trending/newton9/newton本文围绕 Newton 物理引擎 changelog 片段 4141.changed.1.md 所记录的核心变更展开软接触soft contact候选对开始在每一个设备CPU / CUDA上按形状shape排序。文章将深入其底层实现——64 位接触排序键的位布局、基于 Warp 基数排序的ContactSorter、软接触流的接入方式并解析该变更带来的行为影响与性能权衡。读完本文你将理解 Newton 接触管线中确定性排序的完整链路以及为什么此类排序变更会在浮点容差和容量溢出时产生可观察的结果差异。一、变更记录解读一条 changelog 背后的三层信息4141.changed.1.md 的原文只有一句话Sort soft-contact candidate pairs by shape on every device. Results can shift within floating-point tolerance, and when contact capacity overflows the retained subset can differ. Faster on scenes with many shapes or worlds; a little slower on small dense-contact scenes.这条记录事实上包含三层工程信息变更内容软接触候选对在窄相narrow phase之后按形状索引排序且该行为在所有设备上统一生效on every device结果语义排序会重排接触数组因此浮点计算本身不变但结果可在浮点容差范围内发生偏移当接触数量超出预分配容量capacity overflow时被保留的接触子集会因排序而不同性能特性在形状多、world 多的场景中更快在形状少、接触密集的小场景中略慢。这三点均可在仓库源码中得到印证。变更对应的接触排序机制是本文的核心其实现分布在newton/_src/geometry/下的contact_sort.py、contact_data.py以及窄相与软接触管线中。二、排序键如何把按形状排序编码进一个 int64按形状排序在实现上并不是直接比较两个 shape 索引而是为每个接触构造一个64 位字典序排序键再对键做基数排序。键的构造定义在 contact_data.pyCONTACT_SORT_SUB_KEY_BITS 23 CONTACT_SORT_MAX_SHAPE_INDEX_BITS 20 wp.func def make_contact_sort_key(shape_a, shape_b, sort_sub_key, shape_index_bits) - wp.int64: ...其位布局来自源码 docstring为[22 2b : 23 b] shape_a (b bits) [22 b : 23] shape_b (b bits) [22 : 0] sort_sub_key (23 bits, 最大 8,388,607)其中b contact_sort_shape_index_bits(shape_count)即按模型实际形状数量动态计算的位宽最多 20 位对应 1,048,575 个形状索引上限。位 63 恒为 0保证 int64 的字典序与 uint64 一致。超过位宽的取值会被静默掩码mask因此各接触路径必须保证其子键不超限网格三角形接触(tri_idx 1) | 1约 22 有效位SDF 接触(edge_idx 2) | (mode 1)约 21 有效位流体静力学hydroelastic接触((voxel_idx * 5 face_idx) 1) | source约 21 有效位。sort_sub_key编码边/三角形/顶点索引等细分信息保证同一个形状对内部也能得到稳定顺序。这一位布局的正确性由 test_contact_reduction_global.py 中的test_sort_key_bit_layout、test_sort_key_shape_index_bits、test_sort_key_overflow_masking等测试直接验证。三、排序执行器ContactSorter与 Warp 基数排序拿到排序键后真正的排序工作由 contact_sort.py 中的ContactSorter完成。它的设计要点如下源码 docstring 均有明确说明3.1 整体机制backup → radix sort → gather 三步每次排序固定执行三步_backup_simple_kernel/_backup_full_kernel把有效接触从live 数组拷贝进预分配的 scratch 缓冲并写入排序键与初始索引wp.utils.radix_sort_pairs(keys, indices, n, end_bit...)对键做基数排序得到排列perm_gather_simple_kernel/_gather_full_kernel按perm把接触字段从 scratch 写回 live 数组。关键实现细节哨兵键sentinel排序始终覆盖完整容量缓冲0x7FFFFFFFFFFFFFFF作为哨兵填到队尾这是为了 CUDA graph 捕获兼容两次 kernel launch 取代 N 次拷贝每个接触布局用一个wp.struct同时持有 live 数组与 scratch 数组将原先N 次 wp.copy N 次 kernel launch压缩为固定 2 次 launch与接触字段数量无关无主机同步、可被 CUDA graph 捕获这是引擎与wp.ScopedDevice、CUDA graph 录制兼容的关键约束key_bit_count参数限制基数排序只扫描被占用的低若干位取值范围 [1, 64]超出会抛ValueError减少基数排序趟数而不改变全容量捕获行为。3.2 两套 APIsort_simple与sort_fullContactSorter对外提供两条排序路径对应两种接触布局方法对应管线排序字段sort_simple简化窄相写入器NarrowPhase.launchpair、position、normal、penetration、可选tangent、可选match_indexsort_full完整碰撞管线CollisionPipeline.collideshape0、shape1、point0、point1、offset0、offset1、normal、margin0、margin1、tids、可选stiffness/damping/friction、可选match_indexmatch_index由 contact_match.py 中的ContactMatcher提供排序时随其他接触字段一并置换从而保证跨帧接触匹配与排序结果一致。ContactSorter还暴露sorted_keys_view排序后的键视图以及两个供ContactMatcher复用的 scratch 缓冲scratch_pos_world/scratch_normal仅在两帧之间的空闲窗口可用源码注释明确警告在窗口外写入会破坏下一次排序。四、接入点软接触流如何被按形状排序4.1 软接触流的产出soft_contacts_sdf.py软接触软体/布料粒子与形状的接触由 soft_contacts_sdf.py 与 kernels.py 中的create_soft_contacts写出。这些写入器通过原子计数器把记录追加进统一软接触流其数组包括soft_contact_count、soft_contact_tids、soft_contact_particle、soft_contact_indices、soft_contact_barycentric、soft_contact_shape、soft_contact_body_pos、soft_contact_body_vel、soft_contact_normal等。其中soft_contact_shape记录的正是每个接触所属的形状索引——这就是按形状排序排序键中的shape_a字段的来源。由于 GPU 线程调度顺序不确定写入流的原始顺序与线程执行顺序相关这正是引入确定性排序的动机。4.2 排序键的写入narrow_phase.py与collide.py两个写入路径都会为每个接触生成排序键简化路径在 narrow_phase.py 的_write_contact_simple_at_index中调用make_contact_sort_key_with_bits(shape_a, shape_b, sort_sub_key, shape_index_bits, sub_key_bits)写入contact_sort_key完整路径在 collide.py 中写入out_sort_key。两个管线各自持有ContactSorter实例见narrow_phase.py第 2634 行与collide.py第 1833 行附近的构造并在帧内调用sort_simple/sort_full如narrow_phase.py第 3606 行附近。整体调用顺序在 contact_match.py 的文档中有明确约定ContactMatcher.match(...)必须在ContactSorter.sort_full(...)之前执行随后match_index会随接触一起被排序置换。五、行为影响浮点容差、容量溢出与性能权衡changelog 中提到的三点影响对应如下工程解释1. 结果可在浮点容差范围内偏移。排序只改变接触数组的存储顺序不改变每个接触的几何与力学数值但求解器按顺序处理接触时浮点累加顺序变化会使结果在浮点容差内轻微偏移。这属于正常现象而非回归。2. 容量溢出时保留子集可能不同。接触数组按capacity预分配超出容量后的记录会被丢弃源码中write_contact_simple对index contact_max直接返回。由于溢出时哪些接触被丢弃取决于写入顺序而写入顺序此前依赖 GPU 线程调度排序后写入顺序变为按形状确定的顺序因此被保留的子集与未排序版本可能不同。这正是 changelog 提醒用户注意的行为语义。3. 性能特性。排序本身有开销但在形状多、world 多的场景中按形状聚合的接触顺序能改善后续接触约简contact_reduction_global.py 中以(shape_a, shape_b, bin_id)为哈希键、接触匹配与求解器的访存局部性因此整体更快而小规模高密度接触场景中排序开销占比相对更高会略有变慢。这是典型的以排序开销换取确定性 访存亲和的工程权衡。六、变更的工程形态Towncrier changelog 片段该文件是 Towncrier 格式的 changelog 片段见 changelog/README.md以4141作为 issue 编号标识符、.changed表示变更类别、.1用于同 issue 下的多片段区分。这类片段在发布分支上由 Towncrier 合并进CHANGELOG.md因此它本身是简短的一句话但其技术语义由上述源码链完整支撑。同目录下的 4141.changed.md 记录的是同一 issue 中SolverVBD刚柔接触与可变形弹性的 CUDA 加速两者共同构成该 issue 的完整变更集。七、小结与验证路径Newton 的按形状排序软接触候选对是一次典型的确定性工程改造用ContactData的sort_sub_key与形状索引构造 64 位排序键由ContactSorter以backup → 基数排序 → gather两步 kernel 的方式在 CUDA graph 可捕获、无主机同步的前提下完成全量确定性排序并统一作用于简化与完整两条接触管线及软接触流。其正确性由位布局、溢出掩码、形状位宽等单元测试newton/tests/test_contact_reduction_global.py保障。如需深入验证建议按以下路径阅读源码排序键位布局与常量contact_data.py排序执行器与哨兵机制contact_sort.py软接触流产出soft_contacts_sdf.py、kernels.py排序键写入与排序调用narrow_phase.py、collide.py确定性校验测试test_contact_reduction_global.py。在升级使用该变更的版本时请记住两条注意事项对结果做逐位比对时应放宽到浮点容差依赖容量溢出后保留哪些接触的仿真其行为可能与旧版本略有不同。【免费下载链接】newtonAn open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers.项目地址: https://gitcode.com/GitHub_Trending/newton9/newton创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/18 1:11:12

DOSBox汇编环境搭建与MASM编译链接全流程指南

搞汇编的人,多少都有过被“环境配置”卡住的时候。明明代码在书上看懂了,一到自己机器上就是跑不起来。这几年我帮新生调试课程设计,发现很大一部分问题,根本不是汇编逻辑的问题,而是DOSBox没装好、ASM文件没走到编译那…

2026/9/18 1:11:12

MySQL误删数据怎么办?从备份到binlog的完整恢复与防护指南

"删库跑路"这四个字,几乎每隔几天就会出现在技术群、微博、短视频评论区里。段子里的人把数据库一删,深藏功与名;段子外的我们,对着终端笑一笑,然后继续加班。说真的,我干后端和数据库运维这些年…

2026/9/18 1:11:12

删库跑路?数据库误删恢复与权限管控实战指南

后台经常有人私信问我“删库跑路”到底有没有“技巧”,每次看到这种消息我都哭笑不得。这个词在技术圈流传了好多年,说起来挺幽默,实际上它背后对应的是一次次生产事故、凌晨三点的硬盘回滚、熬夜抢修的救火现场,还有一些人职业生…

2026/9/18 2:16:15

安装视频不是教程,而是用户行为工程学

1. 为什么“软件安装教程视频”不是技术文档,而是一门用户行为工程学“软件安装教程视频”这七个字,表面看是操作指南,实则藏着一套完整的用户行为干预系统。我做过三年应用分发平台的用户增长顾问,也带团队拍过2700条安装类视频&…

2026/9/18 2:16:15

excel表格内存过大怎么缩减?教你5个方法轻松给表格瘦身

Excel文件为什么会变得越来越大? 你有没有遇到过这种情况——辛辛苦苦做完一份Excel报表,准备通过邮件发给同事或客户,结果系统提示"附件超出大小限制",怎么都发不出去。尤其是市场部、财务部这类经常需要处理大量数据…

2026/9/18 2:16:15

Excel转HTML怎么弄?四个转换方法分享给你

前阵子部门要做内部数据看板,领导丢过来一句话:把那些Excel报表全转成网页,挂到内网上去。我当时心想,这能有多难? 结果折腾到晚上十一点多,试了不下五遍,踩了好几个坑。 所以今天这篇文章&am…

2026/9/18 2:16:15

Blender布线本质:模型的神经与骨骼系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 2:16:15

Perl在ASIC设计中的文本处理与自动化应用

1. Perl在ASIC设计中的独特价值作为一名在ASIC设计领域工作多年的工程师,我深刻体会到Perl语言在这个领域的不可替代性。Perl以其强大的文本处理能力和灵活的语法特性,成为了ASIC设计流程中不可或缺的"瑞士军刀"。在ASIC设计流程中&#xff0c…

2026/9/18 2:11:15

Uncloud CLI `uc version` 命令完全指南:查看版本与构建信息

Uncloud CLI uc version 命令完全指南:查看版本与构建信息 【免费下载链接】uncloud A lightweight tool for deploying and managing containerised applications across a network of Docker hosts. Bridging the gap between Docker and Kubernetes ✨ 项目地址…

2026/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码