使用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实现带百分比的进度条
Jun 28 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
Python+Wordpress制作小说站
Apr 14 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
对python的文件内注释 help注释方法
May 23 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
Pytorch之parameters的使用
Dec 31 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Python2与Python3的区别详解
Feb 09 Python
python 瀑布线指标编写实例
Jun 03 Python
python b站视频下载的五种版本
May 27 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数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
2011/11/02 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
2017/03/01 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
pycharm 使用心得(五)断点调试
2014/06/06 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
python遍历序列enumerate函数浅析
2017/10/17 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
J2EE模式面试题
2016/10/11 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
党员的自我评价范文
2014/01/02 职场文书
个人租房协议书
2014/04/09 职场文书
律师授权委托书范本
2014/10/07 职场文书
家庭贫困证明
2015/06/16 职场文书
区域销售大会开幕词
2016/03/04 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书