使用Python写CUDA程序的方法


Posted in Python onMarch 27, 2017

使用Python写CUDA程序有两种方式:

* Numba
* PyCUDA

numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了。

例子

numba

Numba通过及时编译机制(JIT)优化Python代码,Numba可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使Python代码可以在GPU上运行,只需在函数上方加上相关的指令标记,

如下所示:

import numpy as np 
from timeit import default_timer as timer
from numba import vectorize

@vectorize(["float32(float32, float32)"], target='cuda')
def vectorAdd(a, b):
  return a + b

def main():
  N = 320000000

  A = np.ones(N, dtype=np.float32 )
  B = np.ones(N, dtype=np.float32 )
  C = np.zeros(N, dtype=np.float32 )

  start = timer()
  C = vectorAdd(A, B)
  vectorAdd_time = timer() - start

  print("c[:5] = " + str(C[:5]))
  print("c[-5:] = " + str(C[-5:]))

  print("vectorAdd took %f seconds " % vectorAdd_time)

if __name__ == '__main__':
  main()

PyCUDA

PyCUDA的内核函数(kernel)其实就是使用C/C++编写的,通过动态编译为GPU微码,Python代码与GPU代码进行交互,如下所示:

import pycuda.autoinit
import pycuda.driver as drv
import numpy as np
from timeit import default_timer as timer

from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void func(float *a, float *b, size_t N)
{
 const int i = blockIdx.x * blockDim.x + threadIdx.x;
 if (i >= N)
 {
  return;
 }
 float temp_a = a[i];
 float temp_b = b[i];
 a[i] = (temp_a * 10 + 2 ) * ((temp_b + 2) * 10 - 5 ) * 5;
 // a[i] = a[i] + b[i];
}
""")

func = mod.get_function("func")  

def test(N):
  # N = 1024 * 1024 * 90  # float: 4M = 1024 * 1024

  print("N = %d" % N)

  N = np.int32(N)

  a = np.random.randn(N).astype(np.float32)
  b = np.random.randn(N).astype(np.float32)  
  # copy a to aa
  aa = np.empty_like(a)
  aa[:] = a
  # GPU run
  nTheads = 256
  nBlocks = int( ( N + nTheads - 1 ) / nTheads )
  start = timer()
  func(
      drv.InOut(a), drv.In(b), N,
      block=( nTheads, 1, 1 ), grid=( nBlocks, 1 ) )
  run_time = timer() - start 
  print("gpu run time %f seconds " % run_time)  
  # cpu run
  start = timer()
  aa = (aa * 10 + 2 ) * ((b + 2) * 10 - 5 ) * 5
  run_time = timer() - start 

  print("cpu run time %f seconds " % run_time) 

  # check result
  r = a - aa
  print( min(r), max(r) )

def main():
 for n in range(1, 10):
  N = 1024 * 1024 * (n * 10)
  print("------------%d---------------" % n)
  test(N)

if __name__ == '__main__':
  main()

对比

numba使用一些指令标记某些函数进行加速(也可以使用Python编写内核函数),这一点类似于OpenACC,而PyCUDA需要自己写kernel,在运行时进行编译,底层是基于C/C++实现的。通过测试,这两种方式的加速比基本差不多。但是,numba更像是一个黑盒,不知道内部到底做了什么,而PyCUDA就显得很直观。因此,这两种方式具有不同的应用:

* 如果只是为了加速自己的算法而不关心CUDA编程,那么直接使用numba会更好。

* 如果为了学习、研究CUDA编程或者实验某一个算法在CUDA下的可行性,那么使用PyCUDA。

* 如果写的程序将来要移植到C/C++,那么就一定要使用PyCUDA了,因为使用PyCUDA写的kernel本身就是用CUDA C/C++写的。

以上这篇使用Python写CUDA程序的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的ini文件操作类分享
Nov 20 Python
python执行等待程序直到第二天零点的方法
Apr 23 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
使用Python对SQLite数据库操作
Apr 06 Python
python 生成器生成杨辉三角的方法(必看)
Apr 10 Python
python模块之time模块(实例讲解)
Sep 13 Python
Python实现的txt文件去重功能示例
Jul 07 Python
Flask框架配置与调试操作示例
Jul 23 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
Python Django view 两种return的实现方式
Mar 16 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
pyenv命令管理多个Python版本
Mar 26 #Python
Django实现自定义404,500页面教程
Mar 26 #Python
Python 多线程实例详解
Mar 25 #Python
解决python3 urllib中urlopen报错的问题
Mar 25 #Python
Python制作Windows系统服务
Mar 25 #Python
Python 类的继承实例详解
Mar 25 #Python
python利用拉链法实现字典方法示例
Mar 25 #Python
You might like
php学习笔记之面向对象编程
2012/12/29 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
javascript实现数独解法
2015/03/14 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
javascript模拟php函数in_array
2015/04/27 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
js实现楼层导航功能
2017/02/23 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
angular将html代码输出为内容的实例
2018/09/30 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python获取邮件地址的方法
2015/07/10 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
基于Python闭包及其作用域详解
2017/08/28 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python管理Windows服务小脚本
2018/03/12 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
找工作最新求职信
2013/12/22 职场文书
先进个人推荐材料
2014/12/29 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android