PycUDA --入门

导入并初始化

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule`

示例:

传输数据

import numpy
a = numpy.random.randn(4,4)

a 由双精度数字组成,但大多数nvidia设备只支持单精度:

a = a.astype(numpy.float32)

在设备上分配内存:

a_gpu = cuda.mem_alloc(a.nbytes)

将数据传输到GPU:

cuda.memcpy_htod(a_gpu, a)

执行内核

编写相应的CUDAC代码,并将其输入pycuda.compiler.SourceModule ::

mod = SourceModule("""__global__ void doublify(float *a){int idx = threadIdx.x + threadIdx.y*4;a[idx] *= 2;}""")

编译并加载到设备上,pycuda.driver.Function 调用它,指定 a_gpu 作为参数,块大小为4x4::

func = mod.get_function("doublify")
func(a_gpu, block=(4,4,1))

从gpu取回数据并将其与原始数据一起显示 a

a_doubled = numpy.empty_like(a)
cuda.memcpy_dtoh(a_doubled, a_gpu)

显式内存副本的快捷方式
pycuda.driver.In , pycuda.driver.Out 和 pycuda.driver.InOut 参数处理程序可以简化一些内存传输
例如,不是 a_gpu ,直接替换 a

func(cuda.InOut(a), block=(4, 4, 1))

使用内置的函数调用 pycuda.driver.Function.__call__() 方法导致类型标识的开销(请参见 设备接口 )为了获得与上面相同的效果而不产生这种开销,函数被绑定到参数类型(由python的标准库指定 struct 模块),然后调用。

grid = (1, 1)
block = (4, 4, 1)
func.prepare("P")
func.prepared_call(grid, block, a_gpu)

使用 pycuda.gpuarray.GPUArray 同样的效果可以用更少的代码来实现:

import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpya_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print a_doubled
print a_gpu

struct

假设我们有以下struct:

mod = SourceModule("""struct DoubleOperation {int datalen, __padding; // so 64-bit ptrs can be alignedfloat *ptr;};__global__ void double_array(DoubleOperation *a) {a = &a[blockIdx.x];for (int idx = threadIdx.x; idx < a->datalen; idx += blockDim.x) {a->ptr[idx] *= 2;}}""")

网格中的每个块(参见CUDA文档)将使其中一个数组加倍。这个 for 循环允许更多的数据元素比线程加倍,虽然效率不高,如果可以保证有足够数量的线程。接下来,创建结构的包装类,并实例化两个数组:

class DoubleOpStruct:mem_size = 8 + numpy.intp(0).nbytesdef __init__(self, array, struct_arr_ptr):self.data = cuda.to_device(array)self.shape, self.dtype = array.shape, array.dtypecuda.memcpy_htod(int(struct_arr_ptr), numpy.getbuffer(numpy.int32(array.size)))cuda.memcpy_htod(int(struct_arr_ptr) + 8, numpy.getbuffer(numpy.intp(int(self.data))))def __str__(self):return str(cuda.from_device(self.data, self.shape, self.dtype))struct_arr = cuda.mem_alloc(2 * DoubleOpStruct.mem_size)
do2_ptr = int(struct_arr) + DoubleOpStruct.mem_sizearray1 = DoubleOpStruct(numpy.array([1, 2, 3], dtype=numpy.float32), struct_arr)
array2 = DoubleOpStruct(numpy.array([0, 4], dtype=numpy.float32), do2_ptr)
print("original arrays", array1, array2)

此代码使用 pycuda.driver.to_device() 和 pycuda.driver.from_device() 分配和复制值的功能,并演示如何使用分配内存块的偏移量。最后,代码可以被执行;下面演示了将两个数组加倍,然后只有第二个:

func = mod.get_function("double_array")
func(struct_arr, block = (32, 1, 1), grid=(2, 1))
print("doubled arrays", array1, array2)func(numpy.intp(do2_ptr), block = (32, 1, 1), grid=(1, 1))
print("doubled second only", array1, array2, "\n")

参考:https://www.osgeo.cn/pycuda/tutorial.html

PycUDA --入门相关推荐

  1. Theano2.1.12-基础知识之使用GPU

    本文转载自: https://www.cnblogs.com/shouhuxianjian/p/4590224.html 作者:shouhuxianjian 转载请注明该声明. 来自:http://d ...

  2. 计算机视觉用显卡,基于GPU加速的计算机视觉编程:使用OpenCV和CUDA实时处理复杂图像数据...

    本书是OpenCV开发人员的推荐阅读指南,手把手教你使用OpenCV和CUDA实现GPU加速的计算机视觉项目开发,帮你快速掌握利用GPU实时处理复杂图像数据的高效技术.全书共11章,章介绍CUDA架构 ...

  3. tensorflow+入门笔记︱基本张量tensor理解与tensorflow运行结构与相关报错

    欢迎登陆官网(附https://tensorflow.google.cn/)了解更多 TensorFlow 内容,也可关注 TensorFlow 官方公众号获取更多资讯. Gokula Krishna ...

  4. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  5. TensorRt(2)快速入门介绍

    文章目录 1.使用ONNX部署的示例 1.1.导出模型 1.2.设置batch size批处理大小 1.3.指定数值精度 1.4.转换模型 1.5.部署模型 2.使用ONNX转换为engine再部署的 ...

  6. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  7. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  8. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

  9. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

最新文章

  1. 一张900w的数据表,怎么把原先要花费17s执行的SQL优化到300ms?
  2. xmind快捷键_XMind思维导图软件最全面的使用教程!
  3. I. Space Station(hash记忆化+dp)
  4. Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)
  5. 对象交互。英雄搏击游戏。0107
  6. 【备忘录】创建自己的消息映射
  7. 编程中的那些容易迷糊的小知识
  8. 医疗保健行业未来发展的5大趋势预测
  9. MySQL免费社区版安装步骤详解
  10. linux系统u盘启动项,linux怎么以u盘启动
  11. Java、JSP网上花店系统
  12. smartsvn 使用
  13. 手把手教你如何破解无线网络密码(蹭网教程)
  14. 给3D打印机升级的记录( i3 Mega S)
  15. 软件测试面试题:所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?
  16. 微众银行区块链承担科技部国家重点研发计划项目课题
  17. 9.9元进群项目源码/付费进群源码含搭建教程以及微擎工具
  18. 一图搞懂formula常用符号
  19. 漫画 | 程序员职场屌丝逆袭,一举惊艳所有人!
  20. 李祥对数值策划的定义

热门文章

  1. ABB机器人线速度_ABB机器人输送链跟踪新板卡DSQC2000接线
  2. Unity SKFramework框架(十一)、ActionChain 事件链
  3. 《TensorFlow技术解析与实战》欢迎来到异步社区!
  4. 【进阶版】机器学习之支持向量机细节回顾及原理完善(09)
  5. 年终奖发放前离职的员工是否有权获得年终奖
  6. 11-6 商品库存和销量修改
  7. 基于图特征混合学习的功能网络组织动力学
  8. origin 2017修改坐标轴上的值
  9. 清华大学五道口金融学院2021年博士生招生简章(直博、硕博、普博)
  10. 高等教育出版社计算机分社社长,西航职院 | 计算机工程学院教师参加全国高等职业教育计算机类在线开放课程联盟年会...