使用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入门篇之字符串
Oct 17 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
Python脚本实现虾米网签到功能
Apr 12 Python
Python爬虫信息输入及页面的切换方法
May 11 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
python剪切视频与合并视频的实现
Mar 03 Python
Python 随机生成测试数据的模块:faker基本使用方法详解
Apr 09 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
基于python实现ROC曲线绘制广场解析
Jun 28 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
Python使用tkinter实现小时钟效果
Feb 22 Python
使用python实现学生信息管理系统
Feb 25 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
2015/06/08 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
使用Bootstrap框架制作查询页面的界面实例代码
2016/05/27 Javascript
input框中的name和id的区别
2016/11/16 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
python 爬取学信网登录页面的例子
2019/08/13 Python
numpy按列连接两个维数不同的数组方式
2019/12/06 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
Pytorch之finetune使用详解
2020/01/18 Python
selenium如何定位span元素的实现
2021/01/13 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
教师实习自我鉴定
2013/12/18 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
后勤服务中心总经理工作职责
2014/03/03 职场文书
三年级评语大全
2014/04/23 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
单位综合评价意见
2015/06/05 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python