首页 > 其他分享 >Gaussian Splatting CUDA结构

Gaussian Splatting CUDA结构

时间:2024-03-22 21:55:23浏览次数:15  
标签:rasterization Splatting rasterize gaussian Gaussian CUDA forward backward gaussi

给自己记录一下,不一定对。每次去重写的时候又要忘记。

1.python部分

gaussian_renderer/__init__.py里面调用cuda写的rasterization,语句为:

from diff_gaussian_rasterization import GaussianRasterizationSettings, GaussianRasterizer

其中GaussianRasterizationSettings定义了初始化一个类的参数,GaussianRasterizer是这个类,直接对应的是./submodules/diff-gaussian-rasterization/diff_gaussian_rasterization/__init__.py中两个python类,class GaussianRasterizationSettings(NamedTuple)class GaussianRasterizer(nn.Module)

GaussianRasterizer是一个正常的python class(继承nn.Module),包括了forward和自动backward,到这里都是熟悉的东西。

forward中调用了rasterize_gaussiansrasterize_gaussians又调用了_RasterizeGaussians_RasterizeGaussians继承自torch.autograd.Function,要求自己写forward和backward,所以这个类下面开始有backward函数。backward函数和forward函数输入输出需要相对应,比如foward函数输出了color, radii,则backward输入ctx, grad_out_color, _也就是上下文信息和两个forward输出的变量的grad;forward输入了除ctx外9个变量,则backward返回9个梯度,不需要梯度的变量用None占位。

2.python和C++的桥梁

forward和backward中调用了_C.rasterize_gaussians_C.rasterize_gaussians_backward,这是C函数,其桥梁在文件./submodules/diff-gaussian-rasterization/ext.cpp中定义:

点击查看代码
#include <torch/extension.h>
#include "rasterize_points.h"

PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
  m.def("rasterize_gaussians", &RasterizeGaussiansCUDA);
  m.def("rasterize_gaussians_backward", &RasterizeGaussiansBackwardCUDA);
  m.def("mark_visible", &markVisible);
}

意思是_C.rasterize_gaussians_backward和rasterize_points.h中的C函数RasterizeGaussiansBackwardCUDA绑定,另外两对同理。

3.C++和CUDA部分(我分不清)

./submodules/diff-gaussian-rasterization/rasterize_points.cu以及其.h文件定义了这三个C函数,做了一些变量初始化之类的工作,然后在RasterizeGaussiansCUDA和RasterizeGaussiansBackwardCUDA中分别使用了CudaRasterizer::Rasterizer的forward和backward函数,这是一个CUDA类(写法和C++一样我写博客的时候所以没有区分)。

这个类在./submodules/diff-gaussian-rasterization/cuda_rasterizer/rasterizer.h和同目录下的rasterizer_impl.h以及rasterizer_impl.cu中定义。核心是在backward和forward中分别使用的BACKWARD::renderFORWARD::render。以后者为例,是定义在同目录下forward.h和forward.cu。

FORWARD::render中使用renderCUDA<NUM_CHANNELS> << <grid, block >> > ,这里开始才进入了CUDA并行计算。将image分为多个block,每个block分配一个进程;每个block里面的pixel分配一个进程。对于每个block只排序一次,认为block里面的pixel都被block中的所有gaussian影响且顺序一样。

在forward中,沿camray从前往后遍历gaussian,计算颜色累计值和透明度累计值,直到透明度累计超过1或者遍历完成,然后用背景色和颜色累计值和透明度累计值计算这个pixel的最终颜色。在backward中,遍历顺序与forward相反,从(之前记录下来的)最终透明度累计值和其对应的最后一个gaussian开始,从后往前算梯度。

./submodules/diff-gaussian-rasterization/cuda_rasterizer/config.h中记录了render的颜色通道数和BLOCK的长宽。所以其实要render多种信息(比如深度,normal,透明度etc.)只要修改颜色通道数就可以并行render了,不用花串行那个时间,说的就是GaussianShader,很蠢。

4.其他

其它记录一下的小点:
1.只是修改常数值or函数头,也可以还有其他一些,总之如果不修改函数体的话,重新编译可能并不会有效。可以随便在函数体里面加一句printf("haha")之类的,编译然后再删掉然后再编译,才能起效果。比如修改config.h的颜色通道数就需要这样重新编译。(或者可能有强制重新编译的命令,只是我不知道,比较蠢)
2.TBA

其他很多应该也很有意思的,比如preprocess在做啥,比如排序在哪里怎么排的,因为还没用到所以还没读,等需要用读到的时候再更新(逃

标签:rasterization,Splatting,rasterize,gaussian,Gaussian,CUDA,forward,backward,gaussi
From: https://www.cnblogs.com/zyx45889/p/18090482

相关文章

  • ubuntu安装cuda和cudnn,并测试tensorflow和pytorch库的与cuda的兼容性(2023年版)
    lspci|grep-invidia查看nvidia设备,看到GPUgcc--version检查是否安装上gcc软件包根据官方文档指示,pipinstalltorch==1.13.1+cu117-fhttps://download.pytorch.org/whl/torch_stable.html,pipinstalltorchaudio==0.13.1+cu117-fhttps://download.pytorch.org/whl/torch......
  • cuda 内存模型
    cuda内存模型其实概括来说就是下面两张图双箭头代表可读可写,单箭头代表只读1.localmemory#include<iostream>#include"cuda_runtime.h"#include"device_launch_parameters.h"#defineBLOCK_SIZE256__global__voidtest_kernal(){ intarray[3]; floatvalu......
  • 本地搭建深度学习训练环境(配置conda环境 cuda pytorch...)
    目录简介Nvidia驱动和cudatoolKit简介首先我们要下载的东西包括:anaconda(虚拟环境管理)pycharm(代码项目编辑器)Nvidia驱动和cudatoolKitpytorch(最好使用wheel)其中,anaconda和pycharm的下载比较简单,这里不在赘述。主要讲解后两个:Nvidia驱动和cudatoolKitNvidia驱动是向......
  • 地形 SplattingMap 采样 HLSL Demo
    地形SplattingMap采样HLSLDemoFetchingsplattingindexTranslateitintoalocalcacheindexSampleallthepbrtexturesfromthecache使用ChatGPT写一个hlsl脚本来实现这三个步骤。这个示例假设已经有了splattingindex纹理和一组PBR(Physically-BasedR......
  • cuda的简单加法例子
    CMakeLists.txt的写法CMakeLists.txtcmake_minimum_required(VERSION3.9)#Cmake最低版本#project(demoLANGUAGESCXXCUDA)#这个写法也是可以的project(demo)enable_language(CUDA)#激活CUDA语言支持,使用第一个写法时要进行注释#设置语言标准set(CMAKE_CXX_STANDARD11......
  • 安装CUDA
    1.下载CUDA根据cmd的命令,看你的CUDA版本,找到匹配的安装CUDAToolkitArchive|NVIDIADeveloper点击进入点击exe文件安装即可精简安装会安装CUDA相关组件,同时也会将显卡驱动重新安装,如果不想重新安装显卡驱动,可以选择自定义安装,我选择自定义安装,如下图:安装完毕......
  • cuda规约运算
    归:递归约:减小对于一个矩阵做求和运算若串行求和的话需要o(n)的复杂度但若向下图这样,俩俩并行相加,只需要o(logn)的复杂度__global__voidreduceNeighbored(int*g_idata,int*g_odata,unsignedintn)//g_idata是待求和数组,g_odata存放的是每个线程块求和的结果{ un......
  • cuda从入门到精通(六)共享内存和循环分块实现CUDA矩阵乘
    本文系转载,出处:https://mp.weixin.qq.com/s/1w1WFPoUEvVECsurqmvJDw在CUDA编程中,共享内存和循环分块(looptiling)是两种常见的优化策略,它们可以帮助我们提高矩阵乘法的性能。共享内存(SharedMemory):在GPU中,每个线程块(block)都有自己的共享内存。与全局内存相比,共享内存的访问......
  • DreamGaussian: Generative Gaussian Splatting for Efficient 3D Content Creation解
    文章目录前言一、基本介绍二、方法原理1.DreamGaussian方法2.分数蒸馏抽样(SDS)总结前言太卷啦,太卷啦,视觉太卷啦,赶紧跑路吧~_~介绍DreamGaussian:GenerativeGaussianSplattingforEfficient3DContentCreation论文方法,解释原理,本文不是机械翻译,而是尝试讲解方......
  • cuda 加速矩阵乘法
    对于一个m*n的矩阵a和一个n*k的矩阵b因为最后得到一个m*k的矩阵c,那么我们可以分配m*k个线程。在线程(i,j)里矩阵a的第i行和矩阵b的第j列进行点积运算得到c[i][j]#include<iostream>#include"cuda_runtime.h"#include"device_launch_parameters.h"#defineBLOCK_......