使用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 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
python+VTK环境搭建及第一个简单程序代码
Dec 13 Python
python3实现字符串的全排列的方法(无重复字符)
Jul 07 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
Python正则表达式如何匹配中文
May 27 Python
Python中的整除和取模实例
Jun 03 Python
Python flask框架端口失效解决方案
Jun 04 Python
python 如何在测试中使用 Mock
Mar 01 Python
python爬虫破解字体加密案例详解
Mar 02 Python
解决pytorch-gpu 安装失败的记录
May 24 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
CI映射(加载)数据到view层的方法
2016/03/28 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
django 信号调度机制详解
2019/07/19 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
生物技术专业毕业生求职信范文
2013/12/14 职场文书
护士毕业生自荐信
2014/02/07 职场文书
三八妇女节活动总结
2014/05/04 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
小学主题班会教案
2015/08/17 职场文书
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers