0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

面向数组计算任务而设计的Numba具有CUDA加速功能

星星科技指导员 ? 来源:NVIDIA ? 作者:Mark Harris ? 2022-04-11 09:58 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Python 是一种高效的动态编程语言,广泛应用于科学、工程和数据分析应用程序中。影响 python 流行的因素有很多,包括它简洁而富有表现力的语法和标准的数据结构、全面的“包含电池”的标准库、优秀的文档、广泛的库和工具生态系统、专业支持的可用性以及大而开放的社区。不过,最重要的也许是 Python 这样的动态类型化、解释性语言所能实现的高生产率。 Python 既灵活又灵活,这使它成为快速原型设计和构建完整系统的优秀语言。

但是 Python 最大的优点也可能是它最大的弱点:它的灵活性和无类型的高级语法会导致数据和计算密集型程序的性能下降。因此,关心效率的 Python 程序员通常用 C 重写最里面的循环,并从 Python 调用编译后的 C 函数。有许多项目旨在使这种优化更容易,例如 Cython ,但它们通常需要学习新的语法。理想情况下, Python 程序员希望在不使用其他编程语言的情况下使现有的 Python 代码更快,而且,自然地,许多人希望使用加速器来从他们的代码中获得更高的性能。

Numba :高性能计算的高生产率

你为什么不想在 Numba 上用 Python Anaconda 编译一个 CUDA 的 Python 编译器,因为你不想用 Python 的 GPUs 编译一个 PythonCPU 语言。答案当然是运行本机编译代码比运行动态解释代码快很多倍。 Numba 的工作原理是允许您为 Python 函数指定类型签名,这样可以在运行时进行编译(这是“ Just-in-time ”或 JIT 编译)。 Numba 动态编译代码的能力意味着您不会放弃 Python 的灵活性。这是向提供高生产率编程和高性能计算的理想组合迈出的一大步。

使用 Numba ,现在可以编写标准的 Python 函数并在支持 CUDA -GPU 上运行它们。 Numba 是为面向数组的计算任务而设计的,很像广泛使用的 NumPy 库。面向数组的计算任务中的数据并行性自然适合 GPUs 这样的加速器。 Numba 理解 NumPy 数组类型,并使用它们生成高效的编译代码,以便在 GPUs 或多核 CPU 上执行。所需的编程工作可以简单到添加一个函数修饰符来指示 Numba 为 GPU 编译。例如,下面代码中的 @vectorize 修饰符在运行时生成标量函数 Add 的编译矢量化版本,以便可以在 GPU 上并行处理数据数组。

import numpy as np
from numba import vectorize @vectorize(['float32(float32, float32)'], target='cuda')
def Add(a, b): return a + b # Initialize arrays
N = 100000
A = np.ones(N, dtype=np.float32)
B = np.ones(A.shape, dtype=A.dtype)
C = np.empty_like(A, dtype=A.dtype) # Add arrays on GPU

C = Add(A, B)要在 CPU 上编译并运行相同的函数,我们只需将目标更改为“ CPU ”,这将在 CPU 上产生编译的、矢量化的 C 代码级别的性能。这种灵活性有助于您生成更多可重用的代码,并允许您在没有 GPUs 的机器上进行开发。

GPU -Python 加速库

CUDA 并行计算平台的优势之一是其可用 GPU – 加速库 的宽度。Numba 团队的另一个项目叫做 pyculib ,提供到 CUDA cuBLAS (稠密线性代数) 、 快速傅里叶变换 和 cuRAND (随机数生成) 库的 Python 接口。许多应用程序只需使用这些库就可以获得显著的加速,而无需编写任何特定于 GPU 的代码。

import numpy as np
from pyculib import rand as curand prng = curand.PRNG(rndtype=curand.PRNG.XORWOW)
rand = np.empty(100000)
prng.uniform(rand)

print rand[:10]使用 CUDA Python 实现大规模并行

Anaconda (以前的 Continuum Analytics )认识到,在某些计算上实现大的加速需要一个更具表现力的编程接口,对并行性的控制比库和自动循环矢量化所能提供的更详细。因此, Numba 还有另一组重要的特性,它们构成了非正式的“ CUDA Python ”。 NUBA 公开了 CUDA 编程模型,就像 CUDA C / C ++中一样,但是使用纯 Python 语法,这样程序员就可以创建定制的、并行的并行内核,而不必留下 Python 的舒适性和优点。 Numba 的 CUDA JIT (通过 decorator 或 function call 提供)在运行时编译 CUDA Python 函数,将它们专门化为您使用的类型,而且它的 CUDA Python API 提供了对数据传输和 CUDA 流等功能的显式控制。

下面的代码示例用一个简单的 Mandelbrot set 内核演示了这一点。请注意, mandel_kernel 函数使用 Numba 提供的 cuda.threadIdx, cuda.blockIdx, cuda.blockDim, and cuda.gridDim 结构来计算当前线程的全局 X 和 Y 像素索引。与其他 CUDA 语言一样,我们通过在括号中插入一个“执行配置”( CUDA – 表示运行内核的线程数和线程块数)来启动内核函数名和参数列表: mandel_kernel[griddim, blockdim](-2.0, 1.0, -1.0, 1.0, d_image, 20) 。您还可以看到使用 to_hostto_device API 函数在 GPU 之间复制数据。

您可以在 Github 上获得完整的 Mandelbrot 示例的 Jupyter 笔记本 。

@cuda.jit(device=True)
def mandel(x, y, max_iters): """ Given the real and imaginary parts of a complex number, determine if it is a candidate for membership in the Mandelbrot set given a fixed number of iterations. """ c = complex(x, y) z = 0.0j for i in range(max_iters): z = z*z + c if (z.real*z.real + z.imag*z.imag) >= 4: return i return max_iters @cuda.jit
def mandel_kernel(min_x, max_x, min_y, max_y, image, iters): height = image.shape[0] width = image.shape[1] pixel_size_x = (max_x - min_x) / width pixel_size_y = (max_y - min_y) / height startX = cuda.blockDim.x * cuda.blockIdx.x + cuda.threadIdx.x startY = cuda.blockDim.y * cuda.blockIdx.y + cuda.threadIdx.y gridX = cuda.gridDim.x * cuda.blockDim.x; gridY = cuda.gridDim.y * cuda.blockDim.y; for x in range(startX, width, gridX): real = min_x + x * pixel_size_x for y in range(startY, height, gridY): imag = min_y + y * pixel_size_y image[y, x] = mandel(real, imag, iters) gimage = np.zeros((1024, 1536), dtype = np.uint8)
blockdim = (32, 8)
griddim = (32,16) start = timer()
d_image = cuda.to_device(gimage)
mandel_kernel[griddim, blockdim](-2.0, 1.0, -1.0, 1.0, d_image, 20) d_image.to_host()

dt = timer() - start print "Mandelbrot created on GPU in %f s" % dt imshow(gimage)在带有 NVIDIA Tesla P100GPU 和 Intel Xeon E5-2698 v3CPU 的服务器上, CUDA Python Mandelbrot 代码的运行速度比纯 Python 版本快近 1700 倍。 1700x 似乎是一个不切实际的加速,但请记住,我们将编译的、并行的、 GPU – 加速的 Python 代码与 CPU 上解释的单线程 Python 代码进行比较。

今天就开始使用 Numba

Numba 为 Python 开发人员提供了一个进入 GPU 加速计算的简单入口,并为使用日益复杂的 CUDA 代码提供了一条路径,只需使用最少的新语法和行话。您可以从简单的函数修饰符开始自动编译函数,或者使用 pyculib 公开的功能强大的 CUDA 库。随着您对并行编程概念的深入理解,以及当您需要对并行线程进行富有表现力和灵活的控制时, CUDA 是可用的,无需您在第一天就投入使用。

Numba 是一个经过 BSD 许可的开源项目,它本身严重依赖于 LLVM 编译器的功能。 Numba 的 GPU 后端使用了基于 LLVM 的 NVIDIA 编译器 SDK 。 CUDA 库的 脓疱 包装器也是开源的,并且是 BSD 许可的。

要开始使用 Numba ,第一步是下载并安装 Anaconda 分布 ,这是一个“完全免费的企业级 Python 发行版,用于大规模数据处理、预测分析和科学计算”,其中包括许多流行的软件包( NumPy 、 Scipy 、 Matplotlib 、 iPython 等)和功能强大的包管理器“ conda ”。一旦安装了 Anaconda ,输入 conda install numba cudatoolkit pyculib 安装所需的 CUDA 包。然后查看 ContinuumIO github 存储库上的 CUDA 的 Numba 教程

关于作者

Mark Harris 是 NVIDIA 杰出的工程师,致力于 RAPIDS 。 Mark 拥有超过 20 年的 GPUs 软件开发经验,从图形和游戏到基于物理的模拟,到并行算法和高性能计算。当他还是北卡罗来纳大学的博士生时,他意识到了一种新生的趋势,并为此创造了一个名字: GPGPU (图形处理单元上的通用计算)。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5363

    浏览量

    106909
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4985

    浏览量

    132213
  • 编译器
    +关注

    关注

    1

    文章

    1663

    浏览量

    50486
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MQTT网关具备边缘计算功能吗?有什么功能

    现代MQTT网关通常具备边缘计算功能,尤其是为适应物联网(IoT)场景中低延迟、高可靠、带宽优化等需求而设计的新一代网关。传统MQTT网关的核心功能是协议转换(如将Modbus、Zig
    的头像 发表于 07-15 15:01 ?237次阅读
    MQTT网关具备边缘<b class='flag-5'>计算</b><b class='flag-5'>功能</b>吗?有什么<b class='flag-5'>功能</b>?

    使用NVIDIA CUDA-X库加速科学和工程发展

    NVIDIA GTC 全球 AI 大会上宣布,开发者现在可以通过 CUDA-X 与新一代超级芯片架构的协同,实现 CPU 和 GPU 资源间深度自动化整合与调度,相较于传统加速计算架构,该技术可使
    的头像 发表于 03-25 15:11 ?822次阅读

    GPU加速计算平台的优势

    传统的CPU虽然在日常计算任务中表现出色,但在面对大规模并行计算需求时,其性能往往捉襟见肘。而GPU加速计算平台凭借其独特的优势,吸引了行业
    的头像 发表于 02-23 16:16 ?508次阅读

    云 GPU 加速计算:突破传统算力瓶颈的利刃

    在数字化时代,数据呈爆炸式增长,传统的算力已难以满足复杂计算任务的需求。无论是人工智能的深度学习、大数据的分析处理,还是科学研究中的模拟计算,都对算力提出了极高的要求。而云 GPU 加速
    的头像 发表于 02-17 10:36 ?347次阅读

    STM32N6 | ST首款具有 AI 加速功能的高性能MCU

    处理技术以实现DSP功能,并配备了ST Neural-ART accelerator?,这是一款专为高能效边缘AI应用而设计的内部NPU。它具有1GHz的时钟速度和高达600 GOPS,支持
    的头像 发表于 01-15 18:17 ?3960次阅读
    STM32N6 | ST首款<b class='flag-5'>具有</b> AI <b class='flag-5'>加速</b><b class='flag-5'>功能</b>的高性能MCU

    《CST Studio Suite 2024 GPU加速计算指南》

    。 2. 操作系统支持:CST Studio Suite在不同操作系统上持续测试,可在支持的操作系统上使用GPU计算,具体参考相关文档。 3. 许可证:GPU计算功能通过CST Studio Suite
    发表于 12-16 14:25

    NVIDIA加速全球大多数超级计算机推动科技进步

    HPCwire 读者和编辑选择奖。 自 2006 年发布 CUDA 以来,NVIDIA 不断推动 AI 和加速计算的进步,最新发布的全球最强超级计算机 TOP500 榜单突显了该公司
    的头像 发表于 11-24 14:38 ?755次阅读
    NVIDIA<b class='flag-5'>加速</b>全球大多数超级<b class='flag-5'>计算</b>机推动科技进步

    指针数组和二维数组有没有区别

    。 首先是指针数组 s1。 s1 本身是个一维数组数组有三个元素,每个元素都是个指针。如果是 64 位系统,三个指针就占了 24 个字节。 使用 sizeof 计算 s1 的大小,结
    的头像 发表于 11-24 11:12 ?598次阅读

    英伟达与谷歌联手加速量子计算设备设计

    子处理器的复杂物理过程。这一举措旨在深入探索量子计算的潜力,为下一代设备的研发提供有力支持。 此外,谷歌还将借助英伟达提供的混合量子-经典计算平台CUDA-Q,加速开发新型量子组件。这
    的头像 发表于 11-21 11:08 ?842次阅读

    C语言数组应用计算机导论A第6讲:数组

    C语言数组应用计算机导论A第6讲:数组
    发表于 11-20 15:33 ?1次下载

    英伟达与谷歌携手加速量子计算设备设计

    英伟达近日宣布,将与谷歌量子AI团队展开合作,共同推进量子计算软硬件工具的研发。双方将利用英伟达CUDA-Q平台提供的模拟支持,加快设计谷歌下一代量子计算设备。
    的头像 发表于 11-19 16:21 ?633次阅读

    S7t-VG6 VectorPath加速卡的特性和功能

    S7t-VG6 VectorPath加速卡是Achronix公司联合BittWare公司(Molex旗下的领先企业级FPGA加速器产品供应商)推出的一类全新的、面向高性能计算和数据
    的头像 发表于 11-14 11:19 ?927次阅读

    GPU加速计算平台是什么

    GPU加速计算平台,简而言之,是利用图形处理器(GPU)的强大并行计算能力来加速科学计算、数据分析、机器学习等复杂
    的头像 发表于 10-25 09:23 ?671次阅读

    有没有大佬知道NI vision 有没有办法通过gpu和cuda加速图像处理

    有没有大佬知道NI vision 有没有办法通过gpu和cuda加速图像处理
    发表于 10-20 09:14

    labview字符串数组转化为数值数组

    在LabVIEW中,将字符串数组转换为数值数组是一项常见的任务,尤其是在处理数据采集、信号处理或用户输入时。 1. 理解LabVIEW的数据类型 在开始之前,了解LabVIEW中的数据类型是非
    的头像 发表于 09-04 17:47 ?6023次阅读