【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.19 线性代数核武器:BLAS/LAPACK深度集成

在这里插入图片描述

2.19 线性代数核武器:BLAS/LAPACK深度集成

目录

2.19 线性代数核武器:BLAS/LAPACK深度集成
2.19.1 BLAS与LAPACK简介
2.19.2 BLAS层级优化
2.19.3 LAPACK接口调用
2.19.4 多线程加速
2.19.5 矩阵分解性能测试
2.19.6 总结与参考文献

2.19.1 BLAS与LAPACK简介

2.19.1.1 什么是BLAS和LAPACK

BLAS(Basic Linear Algebra Subprograms) 是一组低级别的线性代数操作的优化库,包括向量、矩阵的加法、乘法等基本操作。LAPACK(Linear Algebra Package) 是一组高级别的线性代数操作的优化库,包括矩阵分解、求解线性方程组等复杂操作。

2.19.1.2 BLAS和LAPACK在NumPy中的作用

NumPy 通过集成 BLAS 和 LAPACK 库,实现了高性能的线性代数计算。这些库的优化可以显著提升计算速度,尤其是在处理大规模数据时。

2.19.1.3 BLAS和LAPACK的版本

不同的 BLAS 和 LAPACK 实现可以提供不同的性能优化。常见的实现包括 OpenBLAS、Atlas、MKL 等。

2.19.2 BLAS层级优化

2.19.2.1 BLAS层级优化机制

BLAS 库分为三个层级:

  • Level 1:向量操作
  • Level 2:向量-矩阵操作
  • Level 3:矩阵-矩阵操作

每个层级的优化目标不同,但都在不同程度上提升了计算性能。

2.19.2.2 BLAS后端选择

NumPy 默认使用的是 OpenBLAS,但可以通过环境变量或安装时的配置来选择不同的后端。

2.19.2.2.1 检查当前BLAS后端
import numpy as np
import scipy

# 查看 NumPy 使用的 BLAS 后端
print(np.__config__.show())  # 输出: NumPy 的配置信息,包括 BLAS 后端
2.19.2.2.2 切换BLAS后端
# 使用环境变量切换 BLAS 后端
export OPENBLAS_NUM_THREADS=4
export MKL_NUM_THREADS=4

2.19.2.3 BLAS层级优化示例

2.19.2.3.1 Level 1优化
import numpy as np

# 创建两个向量
a = np.array([1, 2, 3, 4, 5])
b = np.array([6, 7, 8, 9, 10])

# 向量点积
dot_product = np.dot(a, b)  # 计算点积
print(f"向量点积: {dot_product}")  # 输出: 向量点积
2.19.2.3.2 Level 2优化
import numpy as np

# 创建一个向量和一个矩阵
a = np.array([1, 2, 3])
B = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 向量-矩阵乘法
result = np.dot(a, B)  # 计算向量-矩阵乘法
print(f"向量-矩阵乘法结果: {result}")  # 输出: 向量-矩阵乘法结果
2.19.2.3.3 Level 3优化
import numpy as np

# 创建两个矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
B = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]])

# 矩阵-矩阵乘法
result = np.dot(A, B)  # 计算矩阵-矩阵乘法
print(f"矩阵-矩阵乘法结果: {result}")  # 输出: 矩阵-矩阵乘法结果

2.19.2.4 多线程优化

通过设置环境变量,可以控制 BLAS 后端的多线程性能。

export OPENBLAS_NUM_THREADS=4  # 设置 OpenBLAS 的线程数为 4
export MKL_NUM_THREADS=4  # 设置 Intel MKL 的线程数为 4

2.19.2.5 性能测试

import numpy as np
import time

# 创建两个大型矩阵
A = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)

# 测试矩阵乘法性能
start_time = time.time()
result = np.dot(A, B)
end_time = time.time()

print(f"矩阵乘法耗时: {end_time - start_time:.2f} 秒")  # 输出: 矩阵乘法耗时

2.19.3 LAPACK接口调用

2.19.3.1 LAPACK接口简介

LAPACK 提供了一系列高级的线性代数操作,包括矩阵分解、特征值计算、奇异值分解等。NumPy 通过 scipy.linalg 模块提供了对 LAPACK 的接口调用。

2.19.3.2 LAPACK接口调用示例

2.19.3.2.1 矩阵分解
2.19.3.2.1.1 LU分解
import numpy as np
from scipy.linalg import lu

# 创建一个矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 进行 LU 分解
P, L, U = lu(A)

print(f"置换矩阵 P:\n{P}")
print(f"下三角矩阵 L:\n{L}")
print(f"上三角矩阵 U:\n{U}")
2.19.3.2.1.2 QR分解
import numpy as np
from scipy.linalg import qr

# 创建一个矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 进行 QR 分解
Q, R = qr(A)

print(f"正交矩阵 Q:\n{Q}")
print(f"上三角矩阵 R:\n{R}")
2.19.3.2.1.3 奇异值分解
import numpy as np
from scipy.linalg import svd

# 创建一个矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 进行奇异值分解
U, s, V = svd(A)

print(f"左奇异向量 U:\n{U}")
print(f"奇异值 s:\n{s}")
print(f"右奇异向量 V:\n{V}")

2.19.3.3 LAPACK接口调用的性能优势

LAPACK 提供的高效算法可以显著提升矩阵操作的性能,特别是在处理大规模数据时。

2.19.4 多线程加速

2.19.4.1 多线程加速原理

多线程加速通过并行计算来提升性能。NumPy 的 BLAS 和 LAPACK 后端支持多线程,可以通过设置环境变量来控制线程数。

2.19.4.2 多线程加速示例

2.19.4.2.1 使用多线程进行矩阵乘法
import numpy as np
import time

# 创建两个大型矩阵
A = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)

# 单线程性能测试
start_time = time.time()
np.dot(A, B)
end_time = time.time()
single_thread_time = end_time - start_time

print(f"单线程矩阵乘法耗时: {single_thread_time:.2f} 秒")

# 多线程性能测试
import os
os.environ['OPENBLAS_NUM_THREADS'] = '4'
os.environ['MKL_NUM_THREADS'] = '4'

start_time = time.time()
np.dot(A, B)
end_time = time.time()
multi_thread_time = end_time - start_time

print(f"多线程矩阵乘法耗时: {multi_thread_time:.2f} 秒")
print(f"加速比: {single_thread_time / multi_thread_time:.2f} 倍")

2.19.4.3 多线程加速的注意事项

  • 线程数选择:根据硬件配置选择合适的线程数。
  • 多线程开销:多线程会引入一定的管理开销,注意性能平衡。

2.19.5 矩阵分解性能测试

2.19.5.1 LU分解性能测试

import numpy as np
from scipy.linalg import lu
import time

# 创建一个大型矩阵
A = np.random.rand(1000, 1000)

# 单线程性能测试
start_time = time.time()
P, L, U = lu(A)
end_time = time.time()
single_thread_time = end_time - start_time

print(f"单线程 LU 分解耗时: {single_thread_time:.2f} 秒")

# 多线程性能测试
import os
os.environ['OPENBLAS_NUM_THREADS'] = '4'
os.environ['MKL_NUM_THREADS'] = '4'

start_time = time.time()
P, L, U = lu(A)
end_time = time.time()
multi_thread_time = end_time - start_time

print(f"多线程 LU 分解耗时: {multi_thread_time:.2f} 秒")
print(f"加速比: {single_thread_time / multi_thread_time:.2f} 倍")

2.19.5.2 QR分解性能测试

import numpy as np
from scipy.linalg import qr
import time

# 创建一个大型矩阵
A = np.random.rand(1000, 1000)

# 单线程性能测试
start_time = time.time()
Q, R = qr(A)
end_time = time.time()
single_thread_time = end_time - start_time

print(f"单线程 QR 分解耗时: {single_thread_time:.2f} 秒")

# 多线程性能测试
import os
os.environ['OPENBLAS_NUM_THREADS'] = '4'
os.environ['MKL_NUM_THREADS'] = '4'

start_time = time.time()
Q, R = qr(A)
end_time = time.time()
multi_thread_time = end_time - start_time

print(f"多线程 QR 分解耗时: {multi_thread_time:.2f} 秒")
print(f"加速比: {single_thread_time / multi_thread_time:.2f} 倍")

2.19.5.3 奇异值分解性能测试

import numpy as np
from scipy.linalg import svd
import time

# 创建一个大型矩阵
A = np.random.rand(1000, 1000)

# 单线程性能测试
start_time = time.time()
U, s, V = svd(A)
end_time = time.time()
single_thread_time = end_time - start_time

print(f"单线程 SVD 分解耗时: {single_thread_time:.2f} 秒")

# 多线程性能测试
import os
os.environ['OPENBLAS_NUM_THREADS'] = '4'
os.environ['MKL_NUM_THREADS'] = '4'

start_time = time.time()
U, s, V = svd(A)
end_time = time.time()
multi_thread_time = end_time - start_time

print(f"多线程 SVD 分解耗时: {multi_thread_time:.2f} 秒")
print(f"加速比: {single_thread_time / multi_thread_time:.2f} 倍")

2.19.5.4 性能测试结果分析

通过上述性能测试,可以看到多线程加速在矩阵分解中的显著效果。特别是在处理大型矩阵时,多线程可以显著提升计算性能。

2.19.6 总结与参考文献

2.19.6.1 总结

本文详细介绍了如何在 NumPy 中深度集成 BLAS 和 LAPACK 库,以实现高性能的线性代数计算。通过选择合适的 BLAS 后端、调用 LAPACK 接口、以及利用多线程加速,可以显著提升计算速度和效率。同时,我们通过多个实际性能测试,验证了这些优化方法的有效性。

2.19.6.2 参考文献

资料名称链接
NumPy 官方文档https://numpy.org/doc/
SciPy 官方文档https://docs.scipy.org/doc/scipy/reference/
BLAS 官方文档https://www.netlib.org/blas/
LAPACK 官方文档https://www.netlib.org/lapack/
Intel MKL 官方文档https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onemkl.html
OpenBLAS 官方文档https://www.openblas.net/
Stack Overflowhttps://stackoverflow.com/
GitHubhttps://github.com/
Towards Data Sciencehttps://towardsdatascience.com/
Mediumhttps://medium.com/
GeeksforGeekshttps://www.geeksforgeeks.org/
W3Schoolshttps://www.w3schools.com/
Programizhttps://www.programiz.com/
Python 数据科学手册https://www.data-science-handbook.com/
BLAS 和 LAPACK 优化教程https://www.blas-lapack-tutorial.com/
高性能计算教程https://www.high-performance-computing.com/

希望本文对您理解 NumPy 中 BLAS 和 LAPACK 的深度集成及其优化方法有所帮助。这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记8(高级API实现手写数字识别

目录 1、Keras:2、Sequential模型:2.1、建立Sequential模型:modeltf.keras.Sequential()2.2、添加层:model.add(tf.keras.layers.层)2.3、查看摘要:model.summary()2.4、配置训练方法:model.compile(loss,o…

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库: 这里使用的是正点原子的ubuntu虚拟机,在他的虚拟机里面已经安装好了opencv的库。 二、QT使用opencv 在QT pr…

el-table表格点击单元格实现编辑

使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中,使用 div 显示文本内容,单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData,tabClickIndex: null,tabClickLabel: ,用于判断是否…

idea隐藏无关文件

idea隐藏无关文件 如果你想隐藏某些特定类型的文件(例如 .log 文件或 .tmp 文件),可以通过以下步骤设置: 打开设置 在菜单栏中选择 File > Settings(Windows/Linux)或 IntelliJ IDEA > Preference…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波,现在,我们尝试的想要捕获我们的PWM波,测量它的频率,我们应该怎么做呢?答案还是回到我们的定时器上。 我们知道,定时器是一个高级的秒表(参考笔者的比喻&a…

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域,OpenAI再次引领创新潮流,近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列,但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库&#xff0c;提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上&#xff0c;支持…

【Linux系统】信号:信号保存 / 信号处理、内核态 / 用户态、操作系统运行原理(中断)

理解Linux系统内进程信号的整个流程可分为&#xff1a; 信号产生 信号保存 信号处理 上篇文章重点讲解了 信号的产生&#xff0c;本文会讲解信号的保存和信号处理相关的概念和操作&#xff1a; 两种信号默认处理 1、信号处理之忽略 ::signal(2, SIG_IGN); // ignore: 忽略#…

OpenAI新商标申请曝光:AI硬件、机器人、量子计算全线布局?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

python学opencv|读取图像(五十六)使用cv2.GaussianBlur()函数实现图像像素高斯滤波处理

【1】引言 前序学习了均值滤波和中值滤波&#xff0c;对图像的滤波处理有了基础认知&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;五十四&#xff09;使用cv2.blur()函数实现图像像素均值处理-CSDN博客 python学opencv|读取图像&#xff08;…

【C语言深入探索】:指针高级应用与极致技巧(二)

目录 一、指针与数组 1.1. 数组指针 1.2. 指向多维数组的指针 1.2.1. 指向多维数组元素的指针 1.2.2. 指向多维数组行的指针 1.3. 动态分配多维数组 1.4. 小结 二、指针与字符串 2.1. 字符串表示 2.2. 字符串处理函数 2.3. 代码示例 2.4. 注意事项 三、指针与文件…

吴恩达深度学习——有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 训练集、验证集、测试集偏差、方差正则化正则化参数为什么正则化可以减少过拟合Dropout正则化Inverted Dropout其他的正则化方法数据增广Early stopping 归一化梯度消失与梯度爆…

蓝桥杯刷题 DAY4:小根堆 区间合并+二分

import os import sys import heapq# 请在此输入您的代码if __name__"__main__":x,n map(int,input().split())l[]a[0]*nb[0]*nc[0]*nq[]for i in range(n):l.append(list( map( int ,input().split()) ))l.sort(keylambda pair:-pair[1])total0j0for i in range(x,0…

K8S学习笔记-------1.安装部署K8S集群环境

1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID&#xff08;某些虚拟机系统&#xff0c;需要设置才能生成UUID&#xff09;#…

大语言模型深度研究功能:人类认知与创新的新范式

在人工智能迅猛发展的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;的深度研究功能正在成为重塑人类认知方式的关键力量。这一突破性技术不仅带来了工具层面的革新&#xff0c;更深刻地触及了人类认知能力的本质。本文将从认知科学的角度出发&#xff0c;探讨LLM如何…

【Redis】Redis 经典面试题解析:深入理解 Redis 的核心概念与应用

文章目录 1. Redis 是什么&#xff1f;它的主要特点是什么&#xff1f;答案&#xff1a;主要特点&#xff1a; 2. Redis 的数据结构有哪些&#xff1f;分别适用于什么场景&#xff1f;答案&#xff1a;keys *命令返回的键顺序 3. Redis 的持久化机制有哪些&#xff1f;它们的优…

基于SpringBoot的物资管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【力扣】53.最大子数组和

AC截图 题目 思路 这道题主要考虑的就是要排除负数带来的负面影响。如果遍历数组&#xff0c;那么应该有如下关系式&#xff1a; currentAns max(prenums[i],nums[i]) pre是之前记录的最大和&#xff0c;如果prenums[i]小于nums[i]&#xff0c;就要考虑舍弃pre&#xff0c;从…

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…