1.3d稀疏卷积——spconv源码剖析(三)
2.什么是源码spweb模拟器
3.Androidä¸dipï¼dpï¼spï¼ptåpxçåºå«è¯¦è§£
4.软件sp和cc是什么意思
5.3d稀疏卷积——spconv源码剖析(五)
3d稀疏卷积——spconv源码剖析(三)
构建Rulebook
下面看ops.get_indice_pairs,位于:spconv/ops.py
构建Rulebook由ops.get_indice_pairs接口完成
get_indice_pairs函数具体实现:
主要就是源码完成了一些参数的校验和预处理。首先,源码对于3d普通稀疏卷积,源码根据输入shape大小,源码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源码。hutool源码导读用该方式注册一个新的算子,流程非常简单:先编写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为卷积核的fastadmin加载源码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(),可以推导得出index为:
ArrayIndexRowMajor位于include/tensorview/tensorview.h,其递归调用写法如下:
接着看核函数getSubMIndicePairsKernel3:
位于:include/spconv/indice.cu.h
看:
上述写法类似我们函数中常见的短网api源码循环的写法,具体可以查看include/tensorview/kernel_utils.h
NumILP按默认值等于1的话,其stride也是gridDim.x*blockDim.x。索引最大值要小于该线程块的线程上限索引blockDim.x * gridDim.x,功能与下面代码类似:
参考: blog.csdn.net/ChuiGeDaQ...
什么是spweb模拟器
SPWeb模拟器是一种跨平台的开放源码模拟器,它支持多种主流计算机与移动设备操作系统,包括Windows、Linux、Android和iOS等。这款模拟器是由知名NGC/Wii模拟器Dolphin开发小组的主要成员之一hrydgard开发的,以GNU GPLv2许可协议发布。其主要使用C++编写,以提高效率和可移植性。
SPWeb模拟器的核心功能是在不同的操作系统和设备上模拟特定软件或硬件的运行环境,使得用户可以在非原生的平台上体验原本只能在特定设备上运行的应用程序或游戏。这种模拟器的cfhd源码开源出现,极大地拓宽了软件和硬件的使用范围,为用户提供了更多的选择和便利。
从技术角度来看,SPWeb模拟器通过模拟目标设备的硬件指令集、操作系统接口等方式,使得在模拟器上运行的应用程序或游戏能够像在目标设备上一样正常工作。这种模拟过程需要极高的技术水平和精细的编程技巧,以确保模拟的准确性和效率。
在实际应用中,SPWeb模拟器为用户带来了许多好处。例如,一些经典的老游戏可能只能在古老的硬件设备上运行,而通过使用模拟器,用户可以在现代的计算机或移动设备上重温这些经典游戏。此外,模拟器还可以帮助开发者在不同的平台上测试和优化他们的应用程序,以提高其兼容性和性能。
总之,SPWeb模拟器是一种功能强大的工具,它为用户提供了在不同平台上体验和使用特定应用程序或游戏的机会。通过模拟目标设备的运行环境,它打破了硬件和软件的限制,使得用户可以更加灵活地利用和享受数字娱乐世界。
Androidä¸dipï¼dpï¼spï¼ptåpxçåºå«è¯¦è§£
ããdip: device independent pixels(设å¤ç¬ç«åç´ ). ä¸è¬æ们为äºæ¯æå¤ç§å辨çå¦WVGAãHVGAåQVGA æ¨è使ç¨è¿ä¸ªï¼ä¸ä¾èµåç´ ã
ããdp: dipæ¯ä¸æ ·çï¼è°·æå®æ¹æ¨è使ç¨è¿ä¸ª
ããpx: pixels(åç´ ). ä¸å设å¤æ¾ç¤ºææç¸åï¼ä¸è¬æ们HVGA代表xåç´ ï¼è¿ä¸ªç¨çæ¯è¾å°ãpt: pointï¼æ¯ä¸ä¸ªæ åçé¿åº¦åä½ï¼1ptï¼1/è±å¯¸ï¼ç¨äºå°å·ä¸ï¼é常ç®åæç¨ï¼
ããsp: scaled pixels(æ¾å¤§åç´ ). 主è¦ç¨äºåä½æ¾ç¤ºbest for textsizeã
ãã3ã度éåä½çæ¢ç®å ¬å¼
ããå¨androidæºç å TypedValue.javaä¸ï¼æ们çå¦ä¸å½æ°ï¼
ãã代ç å¦ä¸:
ããpublic static float applyDimension(int unit, float value,
ããDisplayMetrics metrics)
ãã{
ããswitch (unit) {
ããcase COMPLEX_UNIT_PX:
ããreturn value;
ããcase COMPLEX_UNIT_DIP:
ããreturn value * metrics.density;
ããcase COMPLEX_UNIT_SP:
ããreturn value * metrics.scaledDensity;
ããcase COMPLEX_UNIT_PT:
ããreturn value * metrics.xdpi * (1.0f/);
ããcase COMPLEX_UNIT_IN:
ããreturn value * metrics.xdpi;
ããcase COMPLEX_UNIT_MM:
ããreturn value * metrics.xdpi * (1.0f/.4f);
ãã}
ããreturn 0;
ãã}
ãã该å½æ°åè½ï¼æ¯æååä½æ¢ç®ä¸ºåç´ ã
ããmetrics.densityï¼é»è®¤å¼ä¸ºDENSITY_DEVICE / (float) DENSITY_DEFAULT;
ããmetrics.scaledDensityï¼é»è®¤å¼ä¸ºDENSITY_DEVICE / (float) DENSITY_DEFAULT;
ããmetrics.xdpiï¼é»è®¤å¼ä¸ºDENSITY_DEVICE;
ããDENSITY_DEVICEï¼ä¸ºå±å¹å¯åº¦
ããDENSITY_DEFAULTï¼é»è®¤å¼ä¸º
软件sp和cc是什么意思
软件SP是一种软件产品的简写,是英文单词“service pack”的缩写。它是一组微软公司推出的升级补丁,用于提供操作系统的安全性和稳定性。通常情况下,软件SP会把多种更新、修补、补丁和安全修复程序打包成一个升级文件,用户可以通过安装该文件来更新其计算机上的操作系统。
软件CC是一些软件程序经过编译后生成的可执行文件的后缀名。在编译时,源代码会被转化为计算机可识别的二进制代码,并将其转换为可执行文件。这些可执行文件最终会使用软件CC的后缀名来命名。常见的软件CC有C++、Java、Python等,这些编译器通过转换源代码为机器码,使得程序具有了运行的能力。
软件SP和CC在计算机软件领域中具有非常广泛的应用。软件SP通过打包多种更新和修复程序,可以快速成批更新操作系统,提高了计算机的安全性和稳定性,减少了计算机遭受黑客攻击和崩溃的几率。而软件CC则是编译器生成的可执行文件后缀名,是许多编程语言的标志。程序员们在编写代码时,需要使用到相关软件CC将源代码编译成可执行文件,便于程序的调试和运行。
3d稀疏卷积——spconv源码剖析(五)
介绍在构建的Rulebook指导下执行特定的稀疏卷积计算,关注于类SparseConvolution,其代码位于spconv/conv.py。
Fsp.indice_subm_conv和Fsp.indice_conv经过spconv/functional.py中的SubMConvFunction和SparseConvFunction对象转换,最终会调用spconv/ops.py模块中的indice_conv等函数。
专注于子流线卷积接口:indice_subm_conv,其代码位于spconv/functional.py。
通过Python接口调用底层C++函数可能不够直观,因此使用torch.autograd.Function封装算子底层调用,该类表示PyTorch中的可导函数,具备前向推理和反向传播实现时,即可作为普通PyTorch函数使用。
值得注意的是,Function类在模型部署中具有优势,若定义了symbolic静态方法,此Function在执行torch.onnx.export()时,可依据symbolic定义规则转换为ONNX算子。
apply方法是torch.autograd.Function的一部分,此方法负责在前向推理或反向传播时的调度工作。通过将indice_subm_conv = SubMConvFunction.apply简化为indice_subm_conv接口,简化了算子使用,屏蔽了SubMConvFunction的具体实现。
SubMConvFunction的前向传播方法forward调用spconv/ops.py的indice_conv函数。在src/spconv/all.cc文件中,通过PyTorch提供的OP Register对底层C++API进行注册。
通过torch.ops.load_library加载.so文件,使用torch.ops.spconv.indice_conv调用src/spconv/spconv_ops.cc文件中的indiceConv函数。
深入探索src/spconv/spconv_ops.cc文件中的indiceConv函数。
代写部分代码内容...