numba 入门示例

一维向量求和:  C = A + B

在有nv 近几年gpu的ubuntu 机器上,

环境预备:

conda create -name numba_cuda_python3.10 python=3.10
conda activate numba_cuda_python3.10

conda install numba
conda install cudatoolkit
conda install -c nvidia cuda-python
	or   $ conda install nvidia::cuda-python

示例1:源代码

C[i] = A[i] + B[i]

hello_numba_cpu_01.py

import time
import numpy as np
from numba import jit
from numba import njit

def f_py(a, b, c, N):
    for i in range(N):
        c[i] = a[i] + b[i]

@jit
def f_bin(a, b, c, N):
    for i in range(N):
        c[i] = a[i] + b[i]

@njit
def f_pure_bin(a, b, c, N):
    for i in range(N):
        c[i] = a[i] + b[i]


if __name__ == "__main__":
    np.random.seed(1234)
    N = 1024*1024*128
    a_h = np.random.random(N)
    b_h = np.random.random(N)
    c_h1 = np.random.random(N)
    c_h2 = np.random.random(N)
    c_h3 = np.random.random(N)
    f_bin(a_h, b_h, c_h1, N)
    print('a_h  =', a_h)
    print('b_h  =', b_h)
    print('c_h1 =', c_h1)
    #c_h = np.random.random(N)
    #print('c_h =', c_h)
    f_pure_bin(a_h, b_h, c_h2, N)
    print('c_h2 =', c_h2)

    s1 = time.time()
    f_py(a_h, b_h, c_h1, N)
    e1 = time.time()
    print('time   py:',e1 - s1)

    s1 = time.time()
    f_bin(a_h, b_h, c_h2, N)
    e1 = time.time()
    print('time  jit:',e1 - s1)

    s1 = time.time()
    f_pure_bin(a_h, b_h, c_h3, N)
    e1 = time.time()
    print('time njit:',e1 - s1)

    print('c_h1 =', c_h1)
    print('c_h2 =', c_h2)
    print('c_h3 =', c_h3)

运行时间,纯python是26s,jit是0.23s:

 

示例2:源代码

C[i] = A[i] + B[i]

hello_numba_gpu_02.py

import time
import numpy as np
from numba import jit
from numba import njit
from numba import cuda

def f_py(a, b, c, N):
    for i in range(N):
        c[i] = a[i] + b[i]

@jit
def f_bin(a, b, c, N):
    for i in range(N):
        c[i] = a[i] + b[i]

@njit
def f_pure_bin(a, b, c, N):
    for i in range(N):
        c[i] = a[i] + b[i]

@cuda.jit
def f_gpu(a, b, c):
    # like threadIdx.x + (blockIdx.x * blockDim.x)
    tid = cuda.grid(1)
    size = len(c)

    if tid < size:
        c[tid] = a[tid] + b[tid]


if __name__ == "__main__":
    np.random.seed(1234)
#    M = np.random.random([int(4e3)] * 2)
    N = 1024*1024*128
    a_d = cuda.to_device(np.random.random(N))
    b_d = cuda.to_device(np.random.random(N))
    c_d = cuda.device_array_like(a_d)
    print('a_d =', a_d.copy_to_host())
    print('b_d =', b_d.copy_to_host())
    print('c_d =', c_d.copy_to_host())

    a_h = a_d.copy_to_host()
    b_h = b_d.copy_to_host()
    c_h = c_d.copy_to_host()
    f_bin(a_h, b_h, c_h, N)
    print('a_h =', a_h)
    print('b_h =', b_h)
    print('c_h =', c_h)
    c_h = np.random.random(N)
    #print('c_h =', c_h)
    f_pure_bin(a_h, b_h, c_h, N)
    print('c_h =', c_h)

    f_gpu.forall(len(a_d))(a_d, b_d, c_d)
    print('c_d =', c_d.copy_to_host())

    # Enough threads per block for several warps per block
    nthreads = 256
    # Enough blocks to cover the entire vector depending on its length
    nblocks = (len(a_d) // nthreads) + 1
    f_gpu[nblocks, nthreads](a_d, b_d, c_d)
    print('c_d =', c_d.copy_to_host())

    s1 = time.time()
    f_py(a_h, b_h, c_h, N)
    e1 = time.time()
    print('time   py:',e1 - s1)

    s1 = time.time()
    f_bin(a_h, b_h, c_h, N)
    e1 = time.time()
    print('time  jit:',e1 - s1)

    s1 = time.time()
    f_pure_bin(a_h, b_h, c_h, N)
    e1 = time.time()
    print('time njit:',e1 - s1)

    s1 = time.time()
    f_gpu.forall(len(a_d))(a_d, b_d, c_d)
    e1 = time.time()
    print('time gpu1:',e1 - s1)

    s1 = time.time()
    f_gpu[nblocks, nthreads](a_d, b_d, c_d)
    e1 = time.time()
    print('time gpu2:',e1 - s1)

gpu的加速非常明显,N万倍:

 

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

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

相关文章

【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景

文章目录 1.前言2.使用方式1. 添加Redisson依赖&#xff1a;2. 配置Redis连接信息3. 使用场景3.1. 分布式锁3.2. 限流器&#xff08;Rate Limiter&#xff09;3.3. 可过期的对象&#xff08;Expirable Object&#xff09;3.4. 信号量&#xff08;Semaphore&#xff09;3.5. 分布…

实践-CNN卷积层

实践-CNN卷积层 1 卷积层构造2 整体流程3 BatchNormalization效果4 参数对比5 测试效果 1 卷积层构造 2 整体流程 根据网络结构来写就可以了。 池化 拉平 训练一个网络需要2-3天的时间。用经典网络来&#xff0c;一些细节没有必要去扣。 损失函数&#xff1a; fit模型&…

【网络基础】应用层协议

【网络基础】应用层协议 文章目录 【网络基础】应用层协议1、协议作用1.1 应用层需求1.2 协议分类 2、HTTP & HTTPS2.1 HTTP/HTTPS 简介2.2 HTTP工作原理2.3 HTTPS工作原理2.4 区别 3、URL3.1 编码解码3.2 URI & URL 4、HTTP 消息结构4.1 HTTP请求方法4.2 HTTP请求头信…

欧拉函数和最大公约数

分析&#xff1a;如果两个数的最大公约数是一个质数p&#xff0c;那么这两个数都除以p&#xff0c;得到的两个数的最大公约数一定是1. 反证法&#xff1a;如果得到的两个数的最大公约数不是1&#xff0c;那么把此时的最大公约数乘以上边的最大公约数&#xff0c;得到的一定比上…

【解读Spikingjelly】使用单层全连接SNN识别MNIST

原文档&#xff1a;使用单层全连接SNN识别MNIST — spikingjelly alpha 文档 代码地址&#xff1a;完整的代码位于activation_based.examples.lif_fc_mnist.py GitHub - fangwei123456/spikingjelly: SpikingJelly is an open-source deep learning framework for Spiking Neur…

Java真实面试题,offer已到手

关于学习 在黑马程序员刚刚开始的时候学习尽头非常足&#xff0c;到后面逐渐失去了一些兴趣&#xff0c;以至于后面上课会出现走神等问题&#xff0c;但是毕业时后悔晚矣。等到开始学习项目一的时候&#xff0c;思路总会比别人慢一些&#xff0c;不看讲义写不出来代码。 建议…

Kubuesphere部署Ruoyi:持久化存储配置

按照如下教程配置NFS 先服务器&#xff1a;搭建 NFS 服务器 后客户端&#xff1a;安装 NFS Client 按照链接操作以后&#xff0c;在客户端上面把目录挂载到服务端 rootclient_banana:/# mount 172.25.110.41:/mnt/nfs_share /mnt/client_floder 客户端: mount <server-ip…

【Microsoft 支持】【数据库-MySql】当您尝试从大于 5000 的 TCP 端口连接时收到错误 WSAENOBUFS (10055)

​ 一、转载原文 When you try to connect from TCP ports greater than 5000 you receive the error ‘WSAENOBUFS (10055)’ Symptoms If you try to set up TCP connections from ports that are greater than 5000, the local computer responds with the following WSAE…

什么是微服务?

2.微服务的优缺点 优点 单一职责原则每个服务足够内聚&#xff0c;足够小&#xff0c;代码容易理解&#xff0c;这样能聚焦一个指定的业务功能或业务需求&#xff1b;开发简单&#xff0c;开发效率提高&#xff0c;一个服务可能就是专一的只干一件事&#xff1b;微服务能够被小…

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)

注1:本文系“计算机视觉/三维重建论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读计算机视觉&#xff0c;特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…

python办公自动化有用吗?,python办公自动化能干啥

这篇文章主要介绍了python自动化办公真的有用吗 知乎&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Hello大家好&#xff0c;我是小猴紫&#xff0c;一个帅气、善良、勇敢、正…

Unity ARFoundation 配置工程 (Android)

注意&#xff1a; 1、AR Core是Google的产品&#xff0c;因为谷歌制裁华为&#xff0c;所以 有些 华为机可能不支持AR Core的软件&#xff1b; 2、手机在设置里搜索Google Play&#xff0c;看看是否已经安装上了&#xff0c;如果没有装此服务&#xff0c;去商城里搜索Google Pl…

机器人CPP编程基础-01第一个程序Hello World

很多课程先讲C/C或者一些其他编程课&#xff0c;称之为基础课程。然后到本科高年级进行机器人专业课学习&#xff0c;这样时间损失非常大&#xff0c;效率非常低。 C/单片机/嵌入式/ROS等这些编程基础可以合并到一门课中进行实现&#xff0c;这些素材已经迭代三轮以上&#xf…

脚本一键生成通用接口,一分钟实现增删改查

直接使用无需看此配置 快速生成通用接口业务配置 &#xff1a; https://blog.zysicyj.top/2023/08/14/快速生成通用接口业务配置 一、插件安装 二、脚本 关注绿色聊天软件【程序员朱永胜】回复&#xff1a;1013 下载 三、使用 拷贝到扩展目录下 修改mybatisCodehelper.vm 修改i…

说一下什么是tcp的2MSL,为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?

1.TCP之2MSL 1.1 MSL MSL:Maximum Segment Lifetime报文段最大生存时间&#xff0c;它是任何报文段被丢弃前在网络内的最长时间 1.2为什么存在MSL TCP报文段以IP数据报在网络内传输&#xff0c;而IP数据报则有限制其生存时间的TTL字段&#xff0c;并且TTL的限制是基于跳数 1.3…

mysql中在有数据的表中新增一个主键处理方案

需求&#xff1a;因为业务需要修改表中原来的主键为新增的字段&#xff1b; 处理方案&#xff1a; 1、先将表名修改一下&#xff1b; 2、新增一个一样的表结构&#xff0c;表名与原表名一致&#xff0c;多了一个主键&#xff08;自增&#xff09;的字段&#xff1b; 3、把原…

ubuntu中安装python

最简单方便的是 apt 使用第三方的 ppa 源&#xff0c;然后直接 apt 安装 python3.9 安装 software-properties-common 获取add-apt-repository命令&#xff1a;apt install -y software-properties-common添加第三方的 ppa 源&#xff1a;add-apt-repository ppa:deadsnakes/p…

【一场专属于开发者的盛会!】------NPCon2023 AI模型技术与应用峰会(北京站)

2023年8月12日&#xff0c;由CSDN官方举办的2023年-NPCon2023 AI模型技术与应用峰会(北京站)在北京格兰云天大酒店荣重召开&#xff01; 话不多说&#xff01;上图~~~ 目录 【会议展望】 【大咖宣讲】 【CSDN活动介绍】 【开谈环节&#xff0c;我有句话说】 【现场人气】…

简单入门seleniumUI自动化测试

目录 一、selenium的介绍 二、selenium的原理 三、selenium的八种元素定位的方法 1、ID定位&#xff1a; 2 、name定位&#xff1a; 3、class定位&#xff1a; 4、tag定位&#xff1a; 5、link_text定位&#xff1a; 6、partial_link_text定位&#xff1a; 7、css定位…

【UniApp开发小程序】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面首页让文字只显示两行路由跳转传递对象将商品分为两列显示使用中划线划掉原价 后端商品controllerservicemappersql 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除关于商品分类页面的实现&#xff0c;请在我…