首页/文章/ 详情

向量化编程(一)

4月前浏览1055

向量化是实现各种机器学习模型(尤其是深度学习算法)的关键技术。

向量化是一种并行计算范式。从硬件角度讲,它在单个数据处理单元(CPU或GPU)内对数字数组执行算术运算。SIMD是一种并行架构类型。在基于SIMD架构的计算机上有多个核心,在任意时间点上所有核心只用一个指令流处理不同的数据流,现在大多数计算机都采用了SIMD架构。SIMD本质上是采用一个控制器来控制多个处理器,同时对一组数据中的每一数据单元分别执行相同的操作,从而实现空间上的并行性的技术。比如,两个向量A=[1,2,3,4]B=[7,2,5,9]相加,可以在同一时刻由四个核心分别计算A[1]+B[1]A[2]+B[2]A[3]+B[3]A[4]+B[4]。对于SIMD指令来说,CPU只需执行一条指令,即可完成四个加法计算操作,四个加法计算操作并行执行。

现代CPU可以执行4到16个单精度(float32)并行计算,具体取决于指令类型。英特尔的AVX512,即高级矢量扩展指令集512,拥有512个寄存器,因此可以同时处理512位数据。这相当于执行16次单精度运算或8次双精度运算。

“向量化"一词也指将一次只能处理一个数据点的算法转换为可以同时计算一组数据的操作的过程。一个经典的例子是向量点积运算。假设我们要计算两个向量的内积,这两个向量分别由100万个数组成。使用for循环,我们通常会这样实现这个算法:

import timeit

def inner_product1 (n=1_000_000) :
    result = 0
    a = [1]*n
    b = [1]*n
    start = timeit.default_timer()
    for i in range (n) :
        result += a[i] * b[i]
    
    end = timeit.default_timer()
    print (f"普通方法所需的时间{str(end-start)}")

如果我们使用Numpy和向量化来实现该算法。可以对比一下二者的运行时间,显然,通过向量化,速度有明显提升。

import timeit
import numpy as np

def inner_product_vectorization (n=1_000_000) :
    a = np.random.rand (n)
    b = np.random.rand (n)
    start = timeit.default_timer()
    result = np.dot (a, b)    
    end = timeit.default_timer()
    print (f"向量化方法所需的时间{str(end-start)}")

向量化操作的内存占用

使用向量化操作时,我们需要权衡内存和速度。有时,向量化操作需要为中间步骤的结果分配更多内存。因此,这会影响程序的整体性能,即空间复杂度与时间复杂度之间的关系。例如,考虑一个函数,我们需要计算数组中元素的平方和。这可以用for循环来实现,遍历每个元素,计算其平方,然后再累加起来作为总和。或者,该函数也可以用向量化操作来实现:首先计算每个元素的平方,将结果存储在一个数组中,然后向量化求和。

import numpy as np
from memory_profiler import profile

# memory_profiler 分析内存占用
@profile
def sum_of_square_loop (vec) :
    res = 0
    for x in vec:
        res += x ** 2
    return res

@profile
def sum_of_square_vectorized (vec):
    x = np.asarray (vec)
    x_sq = np.square (x) # x ** 2
    res = x_sq.sum ()
    return res


if __name__ == '__main__':  
    a = [1] * 1_000_000
    sum_of_square_loop (a)
    sum_of_square_vectorized (a)

来源:数值分析与有限元编程

化学pythonUM理论控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-04-21
最近编辑:4月前
太白金星
本科 慢慢来
获赞 14粉丝 32文章 397课程 0
点赞
收藏
作者推荐

连续介质力学的变形与运动是不是一头雾水?

系统所有质点在给定时刻的位置的集合被称为系统在该时刻的构形。人们总是需要把某个时刻系统的构形作为衡量系统运动和变形的基准,这种构形被称为初始构型或参考构形,记为。某些情况下,尤其是在固体力学领域中,常把t=0时刻的构形选作参考构形。人们所研究的那个时刻系统的构形则被称为当前构型或即时构形,记为。系统从参考构形到即时构形的变换构成了系统的运动(图1)。▲图1原则上,应该在参考构形和即时构形上建立各自的坐标系,然后通过坐标系的变换来研究物体的运动和变形。为简单起见,可以让两个坐标系重合。然而,两种构形的坐标系仍有本质的差别。记系统某个质点P在参考构形中的坐标为,那么,就可以通过不同的来鉴别不同的质点,因此称为物质坐标。显然,是一个矢量。记P在即时构形中的位置为p,坐标为,显然,在不同的时刻,这一位置可能被不同的质点所占据,它仅仅代表空间中的一个点,因此称为空间坐标。这里,也是一个矢量。物体的运动有两种不同的描述方法。如果观察者紧紧地注视着质点的运动,时刻记录着质点的空间位置变化,那么就可以写出物质坐标为的质点P的空间坐标变化规律这样,对系统所有质点的这种描述就构成了对系统的运动和物理量变化的描述。这种描述方法被称为物质描述,或拉格朗日(Lagrange)描述。物质描述的数学特征是以物质坐标为自变量(自变量还可能包含时间)。▲图2写这篇的目的就在于公式(1),这个公式很抽象,目前的书籍资料也仅限于给出公式。找了很多英文书籍,终于发现关于这个公式的一个例子。如图2是一根长度为的杆拉伸到,从初始构型到当前构型的简单映射,两种构型共用一个坐标系雅可比(Jacobi)行列式这个假定的物理实质是,连续介质在变形过程中不会产生空隙或物质点重叠的情况。利用物质坐标和空间坐标,便可以表述质点的位移。位移的定义是在物质描述中,上式可写为对于图2,来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈