numba 入门示例
一维向量求和: C = A + B
在有nv 近几年gpu的ubuntu 机器上,
环境预备:
conda create -name numba_cuda_python3.10 python=3.10
conda activate numba_cuda_python3.10conda install numba
conda install cudatoolkit
conda install -c nvidia cuda-pythonor $ 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 njitdef 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*128a_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 cudadef 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*128a_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 blocknthreads = 256# Enough blocks to cover the entire vector depending on its lengthnblocks = (len(a_d) // nthreads) + 1f_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万倍:

相关文章:
numba 入门示例
一维向量求和: C A B 在有nv 近几年gpu的ubuntu 机器上, 环境预备: conda create -name numba_cuda_python3.10 python3.10 conda activate numba_cuda_python3.10conda install numba conda install cudatoolkit conda install -c nvi…...
BUUCTF 还原大师 1
题目描述: 我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4D…...
自定义hook之首页数据请求动作封装 hooks
本例子实现了自定义hook之首页数据请求动作封装 hooks,具体代码如下 export type OrganData {dis: Array<{ disease: string; id: number }>;is_delete: number;name: string;organ_id: number;parent_id: number;sort: number; }; export type SwiperData …...
2023上半年京东手机行业品牌销售排行榜(京东数据平台)
后疫情时代,不少行业都迎来消费复苏,我国智能手机市场在今年上半年也实现温和的复苏,手机市场的出货量回暖。 根据鲸参谋平台的数据显示,2023年上半年,京东平台上手机的销量为2830万,环比增长约4%…...
lodash之cloneDeep()源码阅读笔记
lodash之cloneDeep()源码阅读笔记 基本上都在写业务代码,没有机会写库,还是想了解一下lodash的库源码是怎么样的,平时用的最多的就是cloneDeep()方法了,终于有空详细看看其中的源码。 本文基于lodash5.0.0版本的源码进行阅读。 /…...
算法模版,今天开始背
二分查找算法 int left_bound(int[] nums, int target) {int left 0, right nums.length - 1;// 搜索区间为 [left, right]while (left < right) {int mid left (right - left) / 2;if (nums[mid] < target) {// 搜索区间变为 [mid1, right]left mid 1;} else if …...
新的 Python URL 解析漏洞可能导致命令执行攻击
Python URL 解析函数中的一个高严重性安全漏洞已被披露,该漏洞可绕过 blocklist 实现的域或协议过滤方法,导致任意文件读取和命令执行。 CERT 协调中心(CERT/CC)在周五的一份公告中说:当整个 URL 都以空白字符开头时&…...
react项目做的h5页面加载缓慢优化(3s优化到0.6s)
打包到生产环境时去掉SOURCEMAP 禁用生成 Source Map 是一种权衡,可以根据项目的实际需求和优化目标来决定是否禁用。如果您对调试需求不是特别强烈,可以考虑在生产构建中禁用 Source Map 以获取更好的性能。但如果需要保留调试能力,可以在生…...
如何修复损坏的DOC和DOCX格式Word文件?
我们日常办公中,经常用到Word文档。但是有时会遇到word文件损坏、无法打开的情况。这时该怎么办?接着往下看,小编在这里就给大家带来最简单的Word文件修复方法! 很多时候DOC和DOCX Word文件会无缘无故的损坏无法打开,一…...
UI设计师个人工作感悟5篇
UI设计师个人工作感悟一 工作一年了,结合我自身谈谈UI设计的重要性。现在主流的论坛建站程序有两种 Phpwind 和Discuz(Phpwind被阿里巴巴收购 Discuz被腾讯收购这两个论坛程序都是开源免费的),利用这两种程序我都分别建立过论坛,我第一次用的…...
Java堆、栈、内存的知识
在JAVA中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆&…...
tp6 RabbitMQ
1、composer 安装 AMQP 扩展 composer require php-amqplib/php-amqplib 2、RabbitMQ 配置 在 config 目录下创建 rabbitmq.php 文件 <?php return [host>,port>5672,user>,password>,vhost>,exchange_name > ,queue_name > ,route_key > ,cons…...
java Spring Boot yml多环境拆分文件管理优化
上文 java Spring Boot yml多环境配置 我们讲了多环境开发 但这种东西都放在一起 还是非常容易暴露信息的 并且对维护来讲 也不是非常的友好 这里 我们在resources下创建三个文件 分别叫 application-pro.yml application-dev.yml application-test.yml 我们直接将三个环境 转…...
【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)
文章目录 案例引入介绍基本介绍登场角色应用场景 案例实现案例一类图实现 案例二:借贷平台源码剖析传统方式实现分析状态修改流程类图实现 案例三:金库警报系统系统的运行逻辑伪代码传统实现方式使用状态模式 类图实现分析问题问题一问题二 总结文章说明…...
【LeetCode每日一题】——41.缺失的第一个正数
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 困难 三【题目编号】 41.缺失的第一个正数 四【题目描述】 给你一个…...
typedef函数代码段解释以及部分Windows下的系统函数
文章目录 1、typedef int (WINAPI* LPSDOLInitialize)(const SDOLAppInfo* pAppInfo)2、typedef int (WINAPI* LPSDOLGetModule)(REFIID riid, void** intf)3、typedef int (WINAPI* LPSDOLTerminal)();4、GetProcAddress运行时获取一个动态链接库(DLL)中…...
Typora常用手册
常用快捷键 加粗: Ctrl B 标题: Ctrl H 插入链接: Ctrl K 插入代码: Ctrl Shift C – 无法执行 行内代码: Ctrl Shift K 插入图片: Ctrl Shift I 无序列表:Ctrl Shift L – 无法执行…...
互联网发展历程:从网线不够长到中继器的引入
互联网,这个如今贯穿我们生活的无所不在的网络,其发展历程充满了无数的创新和变革。有一项看似不太起眼的技术却在互联网的发展中发挥着至关重要的作用,那就是中继器。本文将带您深入了解互联网的发展历程,探讨在网线不够长的情况…...
【Java】异常处理 之 使用SLF4J 和 Logback
使用SLF4J和Logback 前面介绍了Commons Logging 和Log4j 这一对好基友,它们一个负责充当日志 API,一个负责实现日志底层,搭配使用非常便于开发。 有的童鞋可能还听说过SLF4J和Logback。这两个东东看上去也像日志,它们又是啥&…...
C++11并发与多线程笔记 (1)
C11并发与多线程笔记(1) 1、并发、进程、线程的基本概念和综述1.1 并发1.2 可执行程序1.3 进程1.4 线程1.5 学习心得 2、并发的实现方法2.1 多进程并发2.2 多线程并发 3、C11新标准线程库 1、并发、进程、线程的基本概念和综述 1.1 并发 指在一个时间段…...
生物信息学实战:如何用k-mer分析提升基因组测序质量(附Python代码示例)
生物信息学实战:k-mer分析在基因组测序质量提升中的关键作用 基因组测序数据的质量直接影响后续分析的可靠性,而k-mer分析技术正成为生物信息学工具箱中不可或缺的利器。想象一下,当你拿到一批新的测序数据时,如何快速识别其中的低…...
ENSP组网避坑指南:当STP、VRRP、OSPF和GRE隧道混搭时,最容易出错的5个配置点
ENSP组网避坑指南:当STP、VRRP、OSPF和GRE隧道混搭时,最容易出错的5个配置点 在复杂的企业网络环境中,STP、VRRP、OSPF和GRE隧道等协议的协同工作常常成为网络工程师的噩梦。明明每个协议单独配置都能正常运行,一旦混搭使用&#…...
C++27反射工具链现状全景图(2024Q3):Boost.PFR停更、cpp-reflect弃坑、std::reflect成为唯一工业级选择?
第一章:C27静态反射的标准化演进与战略意义C27静态反射(Static Reflection)正从实验性提案走向核心语言特性,其标准化进程标志着C元编程范式的根本性跃迁。不同于C20的std::is_same_v等类型特征或C23的std::type_identity_t&#…...
恒压供水系统:维纶通屏与S7 - 200程序的奇妙组合
恒压供水,维纶通屏+s7 200程序在自动化控制领域,恒压供水系统一直是一个经典应用。今天咱就来唠唠如何用维纶通屏搭配S7 - 200程序实现恒压供水。 一、恒压供水原理简介 恒压供水简单来说,就是不管用水量怎么变化,都能…...
效率神器:用快马AI将antigravity彩蛋变为你的趣味开发效率工具
今天想和大家分享一个提升开发效率的小技巧——把Python里经典的antigravity彩蛋变成日常开发的趣味工具。这个想法源于我发现很多开发者(包括我自己)在紧张的工作中容易陷入枯燥的重复劳动,而一些小小的趣味互动其实能有效缓解疲劳ÿ…...
正点原子lwIP实战解析——PHY芯片LAN8720A与YT8512C的配置与应用
1. 认识PHY芯片:网络通信的"翻译官" 当你用网线连接开发板时,数据究竟是如何从物理信号变成单片机可处理的数字信号的?这个关键角色就是PHY芯片。简单来说,PHY就像个精通多国语言的翻译官——它把网线里的模拟信号&…...
MBTI职业性格测试
...
并发编程模式(如生产者-消费者、任务分区、发布-订阅等)可以帮助我们更好地组织多线程代码,提高可维护性、性能和健壮性
基于之前的线程同步优化代码,我将进一步引入并发编程模式,以更结构化和可扩展的方式优化加热控制逻辑。并发编程模式(如生产者-消费者、任务分区、发布-订阅等)可以帮助我们更好地组织多线程代码,提高可维护性、性能和健壮性。 在加热控制场景中,适合的模式包括任务分区…...
在Vue3中推荐使用的函数定义方法
const funcName (argName) > {}; 和 function funcName(argName) {} 这两种方式,哪种定义函数比较好一点呢?两种方式各有适用场景,简单总结: 箭头函数 const fn () > {} 没有自己的 this,继承外层作用域的 thi…...
别再问哪个AI 最强了,把它们放进同一个考场就知道
这段时间,我越来越不想回答一个问题:“现在哪个 AI 最强?”不是因为这个问题不重要, 恰恰相反,是因为它太重要了,重要到一句话已经越来越回答不了。以前大家聊 AI,很像在追榜单。 今天这个登顶&…...
