一、对于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. (详细)华为Mate7 MT7-TL00的usb调试模式在哪里开启的步骤

    就在我们使用pc连接安卓手机的时候,如果手机没有开启usb调试模式,pc则不能够成功识别我们的手机,在一些情况下,我们使用的一些功能较好的工具好比之前我们使用的一个工具引号精灵,老版本就需要打开usb ...

  2. Android视频录制从不入门到入门系列教程(二)————显示视频图像

    1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...

  3. datatable的部分问题处理(动态定义列头,给某行添加事件,初始显示空数据)

    一.动态定义列头 在ajax中,用datatable再去重新配置列头,当然传回的数据中,要有对应放列头的键值对 我自定义了Mock数据,用于前端自己交互. 其中,rowdata用于存放传回的数据,co ...

  4. promise原理

      简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...

  5. 使用免费 mongodb数据库 + 免费node.js服务器搭建小程序接口

    由于微信的小程序只支持不带端口的域名接口,不支持IP地址和接口,所以我们需要映射到80端口并绑定备案过的域名才能被微信小程序访问到.简单点就是接口需要 https 协议才行,找了许久的免费的数据库与n ...

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

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

  7. win7 wifi热点设置

    1.创建wifi热点 netsh wlan set hostednetwork mode=allow ssid=pengyanPC key=11111111 2.启动wifi热点 netsh wlan ...

  8. SSM —— 注解解析

    @Component是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用. @Controller通过@Controller注解说明该类非 ...

  9. Linux新手随手笔记1.2

    重定向 输入重定向:将命令输出结果写入一个文件或将一个文件内容导回到命令里面的这个过程叫做重定向 :标准(>) 输出重定向   :覆盖写入清空写入(>)/追加写入(>>) :错 ...

  10. NPOI的基本用法,导出Excel

    void DownloadForAccountIndex(IReadOnlyList<AccountInfoView> list) { NPOI.HSSF.UserModel.HSSFWo ...