新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何为 Spirula Studio 添加一个新内核:CUDA+Slang+Parity 三件套完整指南

发布时间:2026/9/29 22:18:21来源:尧图网络
如何为 Spirula Studio 添加一个新内核:CUDA+Slang+Parity 三件套完整指南
如何为 Spirula Studio 添加一个新内核CUDASlangParity 三件套完整指南【免费下载链接】spirula-studioCross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA.项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studioSpirula Studio 是一款跨 GPU 厂商的 3D Gaussian Splatting 训练器——从照片/视频到 splat 再到带纹理网格全部在单个自包含二进制中完成支持 NVIDIA、AMD、Intel 和 Apple GPU。它的训练引擎同时拥有CUDA和VulkanSlang两套实现而项目铁律是任何一个内核级改动都必须交付三件套——CUDA 实现、Slang 实现加启动器、以及一个跑两边并比对的 parity对等性测试。本文带你完整走一遍添加新内核的全流程。 先看懂两后端架构为什么要三件套Spirula Studio 的引擎层src/engine/是 CUDA-free 的它只通过backend/api/下生成的启动声明调用内核。也就是说CUDA 后端内核在src/kernels/**/*.cu模板实例化由src/instantiations/111 个生成文件承担Vulkan 后端内核是 Slang 着色器src/backend/vulkan/shaders/*.slang C 启动器src/backend/vulkan/kernels/*.cpp共享设备数学src/shaders/*.slang会被编译两次——一次进src/generated/*.cuh供 CUDA 用一次进 SPIR-V供 Vulkan 用。这套设计的意义是同一份引擎代码驱动两套硬件后端任何一边悄悄改动、另一边没跟上就会编译通过但结果不同。parity 测试就是为此而生的防线。 架构图与职责分布详见 docs/architecture.md后端边界的最权威文档是 src/backend/README.md 和 src/backend/vulkan/README.md。 第一件CUDA 内核src/kernels/family/Kernel.cu每个内核家族一个目录projection、raster、pixelwise、densify……目录里是三兄弟文件角色Name.cu主机端启动器 设备端 kernelName.cuh生成的启动函数声明头引擎侧引用Name_kernel.cuh设备端函数体供模板实例化器读取关键点只有一个导出标记。想让某个启动函数暴露给引擎就在它的定义上方放一行/*[AutoHeaderGeneratorExport]*/然后重跑代码生成。以 densify 家族为例DensifyScoring.cu 中的densify_launch_*函数正是这样逐个导出的。⚠️ 两条硬规则.cuh里有一条分隔线/* AUTO HEADER GENERATOR - DO NOT EDIT THIS LINE... */分隔线以上手写以下只能由生成器重写手工改会被覆盖。一个新的内核家族需要在 tools/codegen/generate_headers.py 的HEADER_SOURCES表里登记哪些.cu向哪个头文件贡献声明——表里列了不存在的文件会直接报错所以重命名不可能悄悄丢掉声明。另外声明区必须保持无 CUDA include要用 src/backend/api/BackendTypes.h 的向量类型因为它要在没有 CUDA 工具链的 Vulkan 构建下也能解析。 第二件Slang 实现 Vulkan 启动器Vulkan 侧对应交付两个文件Slang 着色器src/backend/vulkan/shaders/Name.slang声明 SPIR-V 入口点复用src/shaders/里共享的设备数学函数C 启动器src/backend/vulkan/kernels/Name.cpp创建 pipeline、准备 buffer、派发 dispatch。两个容易踩的坑共享 Slang 不能分叉。src/shaders/下改任何东西都必须重新跑 Slang→SPIR-V 编译CMake 会做但纯手工改src/generated/*.cuh会直接导致两后端计算结果不同网格维度上限。CUDA 的gridDim.y/z上限是 65535Vulkan 任何派发维度都封顶 65535——每图一个槽位的轴要折叠参考 src/kernels/tile/IntersectTile.cu 和vkk::fold_1d的用法。如果 Vulkan 侧暂时没准备好也别硬撑tools/codegen/generate_vulkan_stubs.py会对未移植的内核生成抛异常的空实现让可移植引擎先能链接。这是刻意的 TODO 标记不是完成态。 第三件Parity 测试src/backend/tests/src/backend/tests/ 下每个*_parity.cpp都是一个独立可执行程序同一份源码在 CUDA 和 Vulkan 两种构建下都能编译典型用法是dump 参考值 → compare 对比值# CUDA 构建跑出参考结果 ./densify_parity dump ref.bin # Vulkan 构建逐设备对比 ./densify_parity compare ref.bin以 densify_parity.cpp 为例它体现了 parity 测试的三个精髓分级容差确定性输出走严格 float 通道逐位比较依赖随机数的下游输出走宽松通道只限制违反比例上限跨后端的浮点舍入可能翻转极个别边界样本量化数据按整数码比较量化 packed cell 允许 ±1 个量化步的偏差构造可对比的输入涉及原子压缩、调度依赖的路径用恰好只有一个操作对象的配置把比较退化为逐元素多对象并发由确定性路径覆盖。构建与运行方式详见 docs/testing.mdbash build_develop.bash -DSS_BACKENDcuda -DSS_BUILD_BACKEND_TESTSON ./build_cuda/test_name dump ref.bin bash build_develop.bash -DSS_BACKENDvulkan -DSS_BUILD_BACKEND_TESTSON ./build_vulkan/test_name compare ref.bin⚙️ 收尾代码生成与自检清单改完三件套后从仓库根目录依次跑生成器输出已提交进仓库所以新克隆无需 Python 也能构建见 docs/codegen.md生成器读什么写什么generate_headers.py.cu里的导出标记对应.cuh的声明区generate_kernel_instantiation.py*_kernel.cuh里的 kernel 声明src/instantiations/*.cugenerate_backend_api.py各内核.cuhsrc/backend/api/*.h转发头generate_vulkan_stubs.pyVulkan 构建的链接探测未移植内核的抛异常桩自查清单✅启动函数上方有/*[AutoHeaderGeneratorExport]*/标记新家族已登记进HEADER_SOURCES.cuh声明区无 CUDA includeVulkan 宏下可解析Slang 入口点 src/backend/vulkan/kernels/启动器齐活parity 测试在两个后端下都通过注释符合预算文件头 ≤10 行、块注释 ≤3 行超限会构建失败规则见 AGENTS.md 延伸阅读构建矩阵与各平台说明docs/build.md后端移植风险清单64 位排序键、浮点原子、子组宽度src/backend/README.mdVulkan 设备能力、变体与内存模型src/backend/vulkan/README.md内核家族内部约定示例src/kernels/densify/DensifyCommon.cuh三句话总结标记导出 CUDA 侧、Slang 补齐 Vulkan 侧、parity 测试锁死两边一致——做到这三点你的新内核就是 Spirula Studio 双后端架构的一等公民。【免费下载链接】spirula-studioCross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA.项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

告别繁杂环境配置,FlyEnv 一站式全栈开发工具箱,让本地开发一键起飞:TaoToken 统一 Key 接入 settings.json 配置骨架 2026/9/29 23:12:49

告别繁杂环境配置,FlyEnv 一站式全栈开发工具箱,让本地开发一键起飞:TaoToken 统一 Key 接入 settings.json 配置骨架

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

阅读更多 →
从“玩具项目“到实战高手:我的Agent开发进阶之路(附面试必备知识体系) 2026/9/29 23:12:49

从“玩具项目“到实战高手:我的Agent开发进阶之路(附面试必备知识体系)

作者分享个人Agent开发学习历程,从最初接触"玩具项目"到逐步完善为实用开发路线。核心内容围绕Agent基本概念(AgentHarnessLLM)、Harness关键模块(Prompt/内存/工具调用等)、主流框架(LangGraph/…

阅读更多 →
公寓报修管理系统-springboot + vue 2026/9/29 23:12:49

公寓报修管理系统-springboot + vue

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于springboot vue的公寓报修管理系统 登录网址: http://localhost:8081/ 管理员…

阅读更多 →
忘不掉的背单词软件品牌:我用30天实测了复习间隔的对抗节奏 2026/9/29 23:12:49

忘不掉的背单词软件品牌:我用30天实测了复习间隔的对抗节奏

为什么背过的词总在第三天集体消失 先看一组我去年在三个班做的实测数据。让62名初二学生用同一份包含80个新词的清单,A组连续三天每天背一遍,B组第一天背完后隔一天再背,然后隔两天背第三次。七天后测试,A组平均记住29个&#xf…

阅读更多 →
事务里 catch 住异常继续提交:Spring Boot 3 批处理脏数据的复现与取舍 2026/9/29 23:12:48

事务里 catch 住异常继续提交:Spring Boot 3 批处理脏数据的复现与取舍

本文摘要:批处理单行失败时 catch 异常继续提交,常见结果是整批回滚或部分行脏写。三个最小复现拆开吞异常、自调用绕代理与 checked 异常不回滚三类成因。 一、问题与结论 两万行对账导入的写法是单事务内循环 INSERT,catch (RuntimeExcept…

阅读更多 →
数据平台数据清洗全攻略:工具选型、实战流程与避坑指南 2026/9/29 23:12:42

数据平台数据清洗全攻略:工具选型、实战流程与避坑指南

做数据平台的数据清洗,说实话是这个行业里最不受待见、但价值密度最高的活儿。你去看那些搜索热词,头歌flume部署、pandas数据处理、MapReduce招聘清洗、网约车Spark清洗、农产品价格清洗……表面上是五花八门的工具和场景,实际上全是同一件事…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉