一、对于python的基础介绍

Python是一种高效的动态编程语言,广泛用于科学,工程和数据分析应用程序。。影响python普及的因素有很多,包括干净,富有表现力的语法和标准数据结构,全面的“电池包含”标准库,优秀的文档,广泛的图书馆和工具生态系统,专业支持的可用性以及大而开放社区。但也许最重要的是,像Python这样的动态类型化解释语言能够实现高效率。Python灵活灵活,使其成为快速原型设计的理想语言,同时也是构建完整系统的理想语言。
但是Python的最大优势也可能是它最大的弱点:它的灵活性和无类型的高级语法可能导致数据和计算密集型程序的性能不佳。

二、numba--高性能高效率的计算

在这篇文章中,我将向您介绍Numba,一个来自Anaconda的Python编译器,可以编译Python代码,以便在支持CUDA的GPU或多核CPU上执行。由于Python通常不是编译语言,您可能想知道为什么要使用Python编译器。答案当然是运行本机编译代码比运行动态解释代码快许多倍。 Numba允许您为Python函数指定类型签名,它可以在运行时进行编译(这是“即时”或JIT编译)。 Numba动态编译代码的能力意味着您不会放弃Python的灵活性。这是向高效率编程和高性能计算提供理想组合的重要一步。    

使用Numba,现在可以编写标准的Python函数并在支持CUDA的GPU上运行它们。 Numba专为面向阵列的计算任务而设计,就像广泛使用的NumPy库一样。面向阵列的计算任务中的数据并行性非常适合GPU等加速器。 Numba了解NumPy数组类型,并使用它们生成有效的编译代码,以便在GPU或多核CPU上执行。所需的编程工作可以像添加函数装饰器一样简单,以指示Numba为GPU编译。例如,以下代码中的@vectorize装饰器在运行时生成标量函数Add的已编译矢量化版本,以便它可用于在GPU上并行处理数据数组

imort 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代码级别上产生性能。 这种灵活性可帮助您生成更多可重用的代码,并允许您在没有GPU的计算机上进行开发。

三、用于Python的GPU加速库
     CUDA并行计算平台的优势之一是其广泛的GPU加速库。 Numba团队的另一个名为pyculib的项目为CUDA cuBLAS(密集线性代数),cuFFT(快速傅立叶变换)和cuRAND(随机数生成)库提供了Python接口。 许多应用程序只需使用这些库就可以获得显着的加速,而无需编写任何特定于GPU的代码。 例如,以下代码使用“XORWOW”伪随机数生成器在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”的功能。 Numba公开CUDA编程模型,就像在CUDA C / C ++中一样,但是使用纯python语法,这样程序员就可以创建自定义的,调优的并行内核,而不会留下Python的舒适和优势。 Numba的CUDA JIT(可通过装饰器或函数调用获得)在运行时编译CUDA Python函数,专门针对您使用的类型,并且其CUDA Python API提供对数据传输和CUDA流的显式控制,以及其他功能

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

@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)
On a server with an NVIDIA Tesla P100 GPU and an Intel Xeon E5-2698 v3 CPU, this CUDA Python Mandelbrot code runs nearly 1700 times faster than the pure Python version. 1700x may seem an unrealistic speedup, but keep in mind that we are comparing compiled, parallel, GPU-accelerated Python code to interpreted, single-threaded Py

在配备NVIDIA Tesla P100 GPU和Intel Xeon E5-2698 v3 CPU的服务器上,此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库周围的pyculib包装器也是开源和BSD许可的。
     要开始使用Numba,第一步是下载并安装Anaconda Python发行版,这是一个“完全免费的企业级Python发行版,用于大规模数据处理,预测分析和科学计算”,其中包括许多流行的软件包(Numpy, Scipy,Matplotlib,iPython等)和“conda”,一个强大的包管理器。安装Anaconda后,键入conda install numba cudatoolkit pyculib安装所需的CUDA软件包。然后在ContinuumIO github存储库上查看CumbA的Numba教程。我还建议您查看Anaconda博客上的Numba帖子。

numba学习教程的更多相关文章

  1. Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)

    理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...

  2. WebPack 简明学习教程

    WebPack 简明学习教程 字数1291 阅读22812 评论11 喜欢35 WebPack是什么 一个打包工具 一个模块加载工具 各种资源都可以当成模块来处理 网站 http://webpack. ...

  3. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  4. 深入浅出的javascript的正则表达式学习教程

    深入浅出的javascript的正则表达式学习教程 阅读目录 了解正则表达式的方法 了解正则中的普通字符 了解正则中的方括号[]的含义 理解javascript中的元字符 RegExp特殊字符中的需要 ...

  5. 子类重载父类的方法“parent::方法名”转于 恩聪PHP学习教程

    在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法 ...

  6. LaTeX学习教程

    本来我对LaTeX不是看好的,毕竟都是命令格式的.觉得有word就足够啦word可视化操作方便快捷. 但是由于要写论文等,在导师要求下潜心学习一下,不知不觉间被LaTeX的强大功能所吸引.现在很多出版 ...

  7. Deep Learning 13_深度学习UFLDL教程:Independent Component Analysis_Exercise(斯坦福大学深度学习教程)

    前言 理论知识:UFLDL教程.Deep learning:三十三(ICA模型).Deep learning:三十九(ICA模型练习) 实验环境:win7, matlab2015b,16G内存,2T机 ...

  8. Deep Learning 12_深度学习UFLDL教程:Sparse Coding_exercise(斯坦福大学深度学习教程)

    前言 理论知识:UFLDL教程.Deep learning:二十六(Sparse coding简单理解).Deep learning:二十七(Sparse coding中关于矩阵的范数求导).Deep ...

  9. Deep Learning 11_深度学习UFLDL教程:数据预处理(斯坦福大学深度学习教程)

    理论知识:UFLDL数据预处理和http://www.cnblogs.com/tornadomeet/archive/2013/04/20/3033149.html 数据预处理是深度学习中非常重要的一 ...

随机推荐

  1. OPPO K3在哪里打开USB调试模式的完美方法

    当我们使用pc链接安卓手机的时候,如果手机没有开启USB调试模式,pc则无法成功识别我们的手机,这个时候我们需要找解决方法将手机的USB调试模式打开,今天我们介绍OPPO K3如何开启USB调试模式的 ...

  2. java集合介绍(List,Set,Map)

    前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...

  3. ConchAPI | 更智能的API监控,提升团队效率

    “昨天调好的API,怎么又挂了,竟然没有人发现?” “喂喂喂,你的API挂了,无法调用成功?哪里出问题了?” “这段时间的API数量越来越多了,有谁能好好理清下?” 现在服务端技术越来越讲究微服务化, ...

  4. Maven deploy部署jar包到远程私仓

    Maven deploy部署jar包到远程私仓 maven deploy介绍 maven中的仓库分为两种,snapshot快照仓库和release发布仓库.snapshot快照仓库用于保存开发过程中的 ...

  5. jqery autocomplete 动态传递参数的问题

    今天弄一个autocomplete 向后后台动态传递参数的问题 老的写法: params: { "saleid": $("#divSalesman input[field ...

  6. python之定义类创建实例

    https://www.cnblogs.com/evablogs/p/6688938.html 类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 1 2 >>&g ...

  7. js坚持不懈之16:使用js向HTML元素分配事件

    向 button 元素分配 onclick 事件: <!DOCTYPE html> <html> <body> <p>点击按钮就可以执行 <em& ...

  8. [LeetCode] 24. 两两交换链表中的节点

    题目链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs/ 题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是 ...

  9. 初识gauge自动化测试框架

    segmentfault阅读 官方网站:https://docs.gauge.org/latest/index.html 介绍: Gauge是一个轻量级的跨平台测试自动化工具,可以使用不同的语言中编写 ...

  10. 使用 ng build 构建后资源地址引用错误的问题

    最近使用 Angular 做项目的时候,通过 ng build 打包后的资源地址都带有 localhost:4200,百思不得其解,以为是打包的问题. 最后在 index.html 的文件中发现有一个 ...