IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python使用numba库实现gpu加速 -> 正文阅读

[Python知识库]python使用numba库实现gpu加速

????????Numba是一个针对Python的开源JIT编译器,由Anaconda公司主导开发,可以对Python原生代码进行CPU和GPU加速。Numba对NumPy数组和函数非常友好。

????????使用Numba非常方便,只需要在Python原生函数上增加一个装饰器(Decorator)。Numba会将这些函数使用即时编译JIT方式编译成机器码,这些代码将以近乎机器码的速度运行。

1.CPU加速:

只用1行代码即可加速,对loop有奇效

在函数前面加一个@nb.jit? 其他不用变

import numba as nb
import numpy as np

#把数据导入到data里面
f = open(r'source.txt')
data = f.read().split(" ")
while '' in data:
    data.remove('')
data = np.array(data, dtype = int)

#定义nb_func函数
@nb.jit
def cpu_func(out,data):
    for i in range(1200):
        for j in range(762):
            for k in range(128):
                for n in range(128):
                    order = int((((i * i + (j - k * 6) * (j - k * 6)) ** 0.5 + (i * i + (j - n * 6) * (j - n * 6)) ** 0.5) * 0.05) / 1.54 * 30)
                    if (order < 2000):
                        out[j][i] = out[j][i] + data[k * 2000 + order]

#定义一个二维数组存放重建图像
out = np.zeros([762,1200])
cpu_func(out,data)
print(data)

耗时大约75s(c++编程在不加速的情况下需要20分钟)

输出:

2.GPU加速:?

与传统的Python CPU代码不同的是:

  • 使用from numba import cuda引入cuda
  • 在GPU函数上添加@cuda.jit装饰符,表示该函数是一个在GPU设备上运行的函数,GPU函数又被称为核函数
  • 主函数调用GPU核函数时,需要添加如[1, 2]这样的执行配置,这个配置是在告知GPU以多大的并行粒度同时进行计算。gpu_func[1, 2]()表示开启一个block块,每个block块开启2个线程并行地执行gpu_func函数,函数将被并行地执行2次。
  • GPU核函数的启动方式是异步的:启动GPU函数后,CPU不会等待GPU函数执行完毕才执行下一行代码。必要时,需要调用cuda.synchronize(),告知CPU等待GPU执行完核函数后,再进行CPU端后续计算。这个过程被称为同步。

?Thread层次结构:

????????CUDA将核函数所定义的运算称为线程(Thread),多个线程组成一个块(Block),多个块组成网格(Grid)。这样一个Grid可以定义成千上万个线程,也就解决了并行执行上万次操作的问题。例如,把前面的程序改为并行执行8次:可以用2个Block,每个Block中有4个Thread。原来的代码可以改为gpu_func[2, 4](),其中方括号中第一个数字表示整个Grid有多少个Block,方括号中第二个数字表示一个Block有多少个Thread。

????????CUDA提供了一系列内置变量,以记录Thread和Block的大小及索引下标。以[2, 4]这样的配置为例:blockDim.x变量表示Block的大小是4,即每个Block有4个Thread,threadIdx.x变量是一个从0到blockDim.x - 1(4-1=3)的索引下标,记录这是第几个Thread;gridDim.x变量表示Grid的大小是2,即每个Grid有2个Block,blockIdx.x变量是一个从0到gridDim.x - 1(2-1=1)的索引下标,记录这是第几个Block。

某个Thread在整个Grid中的位置编号为:threadIdx.x + blockIdx.x * blockDim.x

?将CPU的代码改进一下就能得到:

import numba as nb
import numpy as np
from numba import cuda
#检测一下GPU是否可用
print(cuda.gpus)

#把数据导入到data里面
f = open(r'source.txt')
data = f.read().split(" ")
while '' in data:
    data.remove('')
data = np.array(data, dtype = int)

@cuda.jit
def nb_func(out,data):
    # j定义为这个thread在所在的block块中的位置(0 <= j <= 761)
    j = cuda.threadIdx.x
    # i定义为这个block块在gird中的位置(0 <= i <= 1199)
    i = cuda.blockIdx.x
    for k in range(128):
        for n in range(128):
            order = int((((i * i + (j - k * 6) * (j - k * 6)) ** 0.5 + (i * i + (j - n * 6) * (j - n * 6)) ** 0.5) * 0.05) / 1.54 * 30)
            if (order < 2000):
                out[j][i] = out[j][i] + data[k * 2000 + order]

#将data数据拷贝到GPU
data_device=cuda.to_device(data)

#在GPU里开辟一块空间存放图像数组
out_device=cuda.device_array([762,1200])

#运行nb_func()函数
nb_func[1200,762](out_device,data_device)

#最后将图像数据从GPU拷贝回CPU
out = out_device.copy_to_host()
print(out)

?最后耗时约25s,其中并行运算的仅耗时0.5s,将数据从GPU拷贝回CPU耗时24.5s

输出:

(但是两种方法求出的数据有些许出入,还没搞清楚为什么)?

Reference初识GPU编程 | Weizheng

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 11:50:09  更:2021-10-19 11:50:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:52:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码