c++ 向量化_使用向量化、矩阵化、cuda等不同方法加速python程序

使用向量化、矩阵化、cuda等不同方法加速python程序

第一次写知乎文章,本文中如有错误请不吝赐教,各位大大多多包涵。

本文是一次实验室组会的分享内容,对于机器视觉各类问题中经常需要处理大量计算任务的情况,以一个计算点云距离的例子来观察不同处理方法在python编程中对速度的影响。运行程序的电脑CPU型号:i9-9900X,GPU型号:RTX 2080 Ti ,python版本3.8.1 ,使用Jupyter lab编写。

问题描述:
在python中,使用普通方法、向量化、矩阵化、cuda等方法加速计算两组点云间各点的距离

# 初始化数据
  • 普通方法
    通过嵌套的循环,计算所有点的距离,距离计算公式为:
# 普通计算距离
普通计算时间: 950.3101623058319 s
common_result 
  • 向量化方法
    将数据A以重复m次的方式扩展,数据B以复制的方式扩展,实现A中任一点对B中所有点的对应关系。即:

然后将距离计算公式

改写为向量计算式子

# 向量化计算
向量化计算时间: 7.28899621963501 s
  • 矩阵化方法
    将距离计算公式中差的平方和展开,可得:

重新排列各元素:

可以发现,重新排列后的各元素具有“积的和”的性质,则距离计算公式可以改写为矩阵计算。
首先计算第一个括号,发现其为元素自己的平方,则令矩阵A为

再观察第二个括号,令矩阵B为

由于第三个括号的元素是两组点的乘积和,故令矩阵C为

将矩阵A扩展m列,矩阵B扩展n行,则距离矩阵D为

可以发现,矩阵D中第i行第j列元素值表示点云A中第i个点到点云B中第j个点的距离值。

# 矩阵化计算
矩阵化计算时间: 2.1971452236175537 s
  • 使用cuda计算
    使用cuda计算的难点是设计多线程函数,由向量化和矩阵化方法可知,各线程需要计算点云A中第i个点到点云B中第j个点的距离值,每个线程的编号是累加1的,由此2个特点,使用取整方法计算i实现一个周期内重复m次相同的数,使用取余的方法计算j实现一个周期内循环0~m, 总共重复n个周期。设线程编号为idx,点云A有n个点,点云B有m个点,则

from 
GPU计算时间: 0.2234182357788086 s

不同方法的结果对比

# 输出点云A中第2个点到点云B中第14995至15000个点的距离

使用一般方法计算的时间与结果:
950.3101623058319 s
[0.24945065 0.78931863 0.46593733 0.29889308 0.5607863 ]
向量化计算的时间与结果:
7.28899621963501 s
[0.24945065 0.78931863 0.46593733 0.29889308 0.5607863 ]
矩阵化计算的时间与结果:
2.1971452236175537 s
[0.24945065 0.78931863 0.46593733 0.29889308 0.5607863 ]
使用cuda计算的时间与结果:
0.2234182357788086 s
[0.24945065 0.78931863 0.46593733 0.29889308 0.5607863 ]

你可能感兴趣的:(c++,向量化)