1.3d稀疏卷积——spconv源码剖析(三)
2.性价比爆棚!源码doopoo X3 8K媒体播放器试用评测
3d稀疏卷积——spconv源码剖析(三)
构建Rulebook
下面看ops.get_indice_pairs,源码位于:spconv/ops.py
构建Rulebook由ops.get_indice_pairs接口完成
get_indice_pairs函数具体实现:
主要就是源码完成了一些参数的校验和预处理。首先,源码对于3d普通稀疏卷积,源码根据输入shape大小,源码vc挖矿源码kernel size,源码stride等参数计算出输出输出shape,源码子流行稀疏卷积就不必计算了,源码输出shape和输入shape一样大小
准备好参数之后就进入最核心的源码get_indice_pairs函数。因为spconv通过torch.ops.load_library加载.so文件注册,源码所以这里通torch.ops.spconv.get_indice_pairs这种方式来调用该函数。
算子注册:在src/spconv/all.cc文件中通过Pytorch提供的源码审批流设计源码OP Register(算子注册的方式)对底层c++ api进行了注册,可以python接口形式调用c++算子
同C++ extension方式一样,源码OP Register也是源码Pytorch提供的一种底层扩展算子注册的方式。注册的源码算子可以通过 torch.xxx或者 tensor.xxx的方式进行调用,该方式同样与pytorch源码解耦,增加和修改算子不需要重新编译pytorch源码。用该方式注册一个新的算子,流程非常简单:先编写C++相关的算子实现,然后通过pytorch底层的注册接口(torch::RegisterOperators),将该算子注册即可。
构建Rulebook实际通过python接口get_indice_pairs调用src/spconv/spconv_ops.cc文件种的getIndicePairs函数
代码位于:src/spconv/spconv_ops.cc
分析getIndicePairs直接将重心锁定在GPU逻辑部分,并且子流行3d稀疏卷积和正常3d稀疏卷积分开讨论,阿奇源码论坛优先子流行3d稀疏卷积。
代码中最重要的3个变量分别为:indicePairs,indiceNum和gridOut,其建立过程如下:
indicePairs代表了稀疏卷积输入输出的映射规则,即Input Hash Table 和 Output Hash Table。这里分配理论最大的内存,它的shape为{ 2,kernelVolume,numAct},2表示输入和输出两个方向,kernelVolume为卷积核的volume size。例如一个3x3x3的卷积核,其volume size就是信息资料管理源码(3*3*3)。numAct表示输入有效(active)特征的数量。indiceNum用于保存卷积核每一个位置上的总的计算的次数,indiceNum对应中的count
代码中关于gpu建立rulebook调用create_submconv_indice_pair_cuda函数来完成,下面具体分析下create_submconv_indice_pair_cuda函数
子流线稀疏卷积
子流线稀疏卷积是调用create_submconv_indice_pair_cuda函数来构建rulebook
在create_submconv_indice_pair_cuda大可不必深究以下动态分发机制的运行原理。
直接将重心锁定在核函数:
prepareSubMGridKernel核函数中grid_size和block_size实则都是用的整形变量。其中block_size为tv::cuda::CUDA_NUM_THREADS,在include/tensorview/cuda_utils.h文件中定义,大小为。而grid_size大小通过tv::cuda::getBlocks(numActIn)计算得到,其中numActIn表示有效(active)输入数据的数量。
prepareSubMGridKernel作用:建立输出张量坐标(通过index表示)到输出序号之间的一张哈希表
见:include/spconv/indice.cu.h
这里计算index换了一种模板加递归的写法,看起来比较复杂而已。令:new_indicesIn = indicesIn.data(),eclipse 调试源码设置可以推导得出index为:
ArrayIndexRowMajor位于include/tensorview/tensorview.h,其递归调用写法如下:
接着看核函数getSubMIndicePairsKernel3:
位于:include/spconv/indice.cu.h
看:
上述写法类似我们函数中常见的循环的写法,具体可以查看include/tensorview/kernel_utils.h
NumILP按默认值等于1的话,其stride也是gridDim.x*blockDim.x。索引最大值要小于该线程块的线程上限索引blockDim.x * gridDim.x,功能与下面代码类似:
参考: blog.csdn.net/ChuiGeDaQ...
性价比爆棚!doopoo X3 8K媒体播放器试用评测
继上文的硬核拆解评测后,doopoo X3的软件实力成为今天的焦点。作为一款专业级媒体播放器,doopoo X3不仅支持大容量硬盘,可搭配NAS或硬盘盒,形成真正的硬盘播放机形态,而且在硬件和软件之间实现了无缝衔接。
TB的存储空间足以容纳海量**,通过USB3.0与X3连接,5GBPS的理论传输速度确保了8K**的流畅播放。全铝合金外壳不仅美观,还强化了散热性能。doopoo X3的FunplayUI系统更新迅速,极简设计让人一见倾心,4K分辨率的界面无模糊或锯齿,操作流畅如旗舰手机,满足了强迫症用户的需求。
系统设置简单易懂,自动适应设备,只需选择“自动”模式,播放机就能优化显示效果。图像参数虽然可自定义,但推荐优先校准投影机。音频设置上,推荐使用“源码”模式,确保声音质量。多播功能是其独特亮点,支持文件管理和自动海报墙,为家庭影院系统提供了便捷的选片和管理方式,特别是对于不熟悉数码产品的家庭成员来说,体验极佳。
doopoo X3并非传统电视盒,它拥有硬解8K的能力,兼容多种视频格式,自研的多播功能更是使其超越了普通播放机,成为一个功能丰富的硬盘播放机。内置的多播文件管理器和音乐播放器,支持高清无损音乐播放,极大地提升了观影和音乐欣赏体验。
对于寻找片源,用户可以选择组建NAS或购买doopoo提供的影牛牛影库系统,以获得高质量的环绕声资源。而网盘挂载功能,如CloudDrive2,让获取和播放片源变得更加简单。配合高端的投影和音响系统,doopoo X3在音画效果上也表现出色,与高端蓝光机相比,性价比极高,无疑是一款值得关注的高性价比产品。