使用 Numba 从NumPy ufuncs 编译 CUDA 核函数
使用 Numba 创建和启动自定义 CUDA 核函数
应用关键的GPU内存管理技术
**[CUDA](https://en.wikipedia.org/wiki/CUDA)** 计算平台可以让开发者在 NVIDIA GPU 上实现大规模并行计算,从而加速应用程序的执行,节省宝贵的时间资源。
**[Numba](http://numba.pydata.org/)** 是一款即时(JIT) Python 函数编译器,提供简洁的 API 用于加速 Python 函数运行。对希望使用 GPU 加速其应用又不想写 C/C++ 代码的同学而言,Numba 是个极具吸引力的选择,而对日常使用 NumPy 执行大量计算任务的开发者来说,Numba 更是不二之选。Numba 可用于加速 CPU 上运行的 Python 函数,同样也适用于在 NVIDIA GPU 进行应用加速。**本课程侧重讲解使用 Numba 在 GPU 上加速 Python 应用程序所需的基础技能。**
Numba 是一个**类型专用**的**即时函数编译器**,用于为 CPU 或 GPU 加速**以数值计算为主的** Python 函数。此定义很长,下面就让我们逐一解析这些术语:
* **函数编译器**:Numba 用于编译 Python 函数,而非整个应用程序,它也不是函数的一部分。Numba 不会取代 Python 解释器,而仅作为另一个 Python 模块,将普通函数转化为执行速度更快的函数(通常情况下)。
* **类型专用**:Numba 可为您当前使用的特定数据类型生成专门的执行代码,从而加速函数运行。Python函数被设计为对通用数据类型进行操作,这为其带来了极大的灵活性,但也严重拖慢了运行速度。实际上,您只会调用具有少量参数类型的函数,因此Numba会为每种类型的集合生成快速实现。
* **即时**:在函数首次被调用时,Numba 会对它们进行转换,这样可以确保编译器知道您将使用的参数类型。这也使得Numba可以像传统应用程序一样轻松地在Jupyter笔记本中交互使用。
* **以数字计算为主**:Numba 目前以处理数值型数据类型为主,如 `int`、`float` 和 `complex`。字符串处理支持极为受限,且许多字符串处理函数还无法在 GPU 上获得有效加速。若要借助 Numba 获得最佳加速效果,您可能需要搭配使用 NumPy 数组。
Numba 绝非 CUDA 编程的唯一手段。目前,最常见的 CUDA 编程方法便是使用 CUDA C/C++ 语言扩展程序。对于 Python 而言,[PyCUDA](https://documen.tician.de/pycuda/) 是除 Numba 以外可实现 GPU 加速 Python 代码的另一种选择。本课程将着重介绍 Numba。不过作为背景知识,我们也有必要在开讲前简单对比一下刚刚提到的三个选项。
**CUDA C/C++**:
- 最常用、高效且最灵活的方式来使用 CUDA
- 加速 C/C++ 应用程序
**PyCUDA**:
- 完全对接 CUDA C/C++ API
- 在 Python 中释放 NVIDIA GPU 性能的优先选项
- 需在编写 C 代码,通常还要修改 Python 代码
**Numba**:
- 性能或许低于 PyCUDA
- (当前)并未完全支持 CUDA C/C++ API
- 仍能大幅加速应用程序,代码修改量小
- 开发者可在 Python 框架下轻松编写代码
- 能同时为 CPU 优化 Python 代码
本文来自于自己对英伟达深度学习院DLI-加速计算基础——CUDA Python课程的学习记录
文章评论