使用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数据结构之二叉树的遍历实例
Apr 29 Python
python设置检查点简单实现代码
Jul 01 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
Apr 17 Python
Python在图片中添加文字的两种方法
Apr 29 Python
Python中将dataframe转换为字典的实例
Apr 13 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
python中下标和切片的使用方法解析
Aug 27 Python
Python数学形态学实例分析
Sep 06 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
基于matplotlib xticks用法详解
Apr 16 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 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数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
PHP统计目录大小的自定义函数分享
2014/11/18 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
php控制文件下载速度的方法
2015/03/24 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
点击广告后才能获得下载地址
2006/10/26 Javascript
JavaScript 事件系统
2010/07/22 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
Python使用chardet判断字符编码
2015/05/09 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
用python写一个带有gui界面的密码生成器
2020/11/06 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
教师岗位职责范本
2013/12/29 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
个人查摆剖析材料
2014/10/16 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
Python Django获取URL中的数据详解
2021/11/01 Python
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android
js前端图片加载异常兜底方案
2022/06/21 Javascript