【c expression 源码】【照妖镜网站源码】【封包过滤源码】递归分析源码_递归代码案例

时间:2024-12-22 20:27:12 来源:laravel ioc源码分析 分类:综合

1.�ݹ����Դ��
2.3d稀疏卷积——spconv源码剖析(三)
3.想问下大神python的递归递归代码背包问题的源代码(最好玩也有伪代码,请用递归法实现),分析因为只学过递归法,源码所

递归分析源码_递归代码案例

�ݹ����Դ��

       辗转相除法求最大公约数

       递归代码和运行结果如下:

       可见正确输出了和的案例最大公约数6

       附源码:

       #include <stdio.h>

       int f(int a, int b) {

           if (b == 0)

               return a;

           else

               return f(b, a % b);

       }

       int main() {

           int a, b;

           scanf("%d%d", &a, &b);

           printf("%d\n", f(a, b));

           return 0;

       }

3d稀疏卷积——spconv源码剖析(三)

       构建Rulebook

       下面看ops.get_indice_pairs,位于:spconv/ops.py

       构建Rulebook由ops.get_indice_pairs接口完成

       get_indice_pairs函数具体实现:

       主要就是递归递归代码完成了一些参数的校验和预处理。首先,分析c expression 源码对于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源码。用该方式注册一个新的算子,流程非常简单:先编写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代表了稀疏卷积输入输出的psv源码公开映射规则,即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(),可以推导得出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...

想问下大神python的背包问题的源代码(最好玩也有伪代码,请用递归法实现),因为只学过递归法,所

       递归有层数限制,所以最好不要用,能不用就不用,没有想到什么好的算法,弄了个简单粗暴的,包容量除以最小质量的,就是最多可以装多少个,然后全排列一遍三种商品,并计算价值,取最大的一个价值,代码如下:

a, b, c = 2, 2.5, 3           # 三种商品质量

       A, B, C = 4, 5, 6             # 三种商品价值

       m =                        # 包容量

       ds = int( / min(a, b, c))  # 最小质量 取到最大数量

       mx = 0                        # 最大价值

       nl = []                       # 商品数量列表

       for i1 in range(0, ds + 1):   # 全排列

           for i2 in range(0, ds + 1 - i1):

               for i3 in range(0, ds + 1 - i1 - i2):

                   # 判断总质量 超出则舍弃

                   n = i1 * a + i2 * b + i3 * c

                   if n > m:

                       continue

                   # 计算总价值 取最高值及排列并存储

                   j = i1 * A + i2 * B + i3 * C

                   if mx < j:

                       mx = j

                       nl = [i1, i2, i3]

       # 输出最大价值和组合

       print(mx)

       print(nl)