Theano2.1.13-基础知识之PyCUDA、CUDAMat、Gnumpy的兼容
来自:http://deeplearning.net/software/theano/tutorial/gpu_data_convert.html
PyCUDA/CUDAMat/Gnumpy compatibility
一、PyCUDA
当前,PyCUDA 和Theano使用不同的对象来存储GPU数据。这两种实现支持的是不同的特征集。 Theano的实现是叫做CudaNdarray ,并且支持strides。 同时只支持float32 dtype。 PyCUDA的实现叫做 GPUArray 而且不支持strides。 然而,它可以处理所有的NumPy 和CUDA dtypes。
我们现在来介绍下如何工作在这两个都有的基对象上,而且也在模仿NumPy。下面有一些资料关于如何在同一个脚本中使用这两个对象。
1.1 迁移
你可以使用 theano.misc.pycuda_utils 模块来对
GPUArray和CudaNdarray之间进行转换。函数 to_cudandarray(x,copyif=False) 和 to_gpuarray(x) 返回一个新的对象,该对象占据着和原始对象同一块内存空间。不过它会抛出一个值错误(ValueError)的异常。因为GPUArrays不支持strides,如果CudaNdarray
是strided,那么我们需要对它进行non-strided复制。生成的GPUArray不会在共享同一片内存区域。如果你想要这种行为,那么可以在to_gpuarray中设置 copyif=True 。
1.2 用PyCUDA 来编译
你可以使用 PyCUDA来编译直接工作在CudaNdarrays上的
CUDA 函数。这里是来自文件theano/misc/tests/test_pycuda_theano_simple.py中的例子:
import sys
import numpy
import theano
import theano.sandbox.cuda as cuda_ndarray
import theano.misc.pycuda_init
import pycuda
import pycuda.driver as drv
import pycuda.gpuarray def test_pycuda_theano():
"""Simple example with pycuda function and Theano CudaNdarray object."""
from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
dest[i] = a[i] * b[i];
}
""") multiply_them = mod.get_function("multiply_them") a = numpy.random.randn(100).astype(numpy.float32)
b = numpy.random.randn(100).astype(numpy.float32) # Test with Theano object
ga = cuda_ndarray.CudaNdarray(a)
gb = cuda_ndarray.CudaNdarray(b)
dest = cuda_ndarray.CudaNdarray.zeros(a.shape)
multiply_them(dest, ga, gb,
block=(400, 1, 1), grid=(1, 1))
assert (numpy.asarray(dest) == a * b).all()
1.3 Theano 操作,使用一个PyCUDA函数
你可以在theano op中使用 用PyCUDA编译好的GPU函数:
import numpy, theano
import theano.misc.pycuda_init
from pycuda.compiler import SourceModule
import theano.sandbox.cuda as cuda class PyCUDADoubleOp(theano.Op):
def __eq__(self, other):
return type(self) == type(other)
def __hash__(self):
return hash(type(self))
def __str__(self):
return self.__class__.__name__
def make_node(self, inp):
inp = cuda.basic_ops.gpu_contiguous(
cuda.basic_ops.as_cuda_ndarray_variable(inp))
assert inp.dtype == "float32"
return theano.Apply(self, [inp], [inp.type()])
def make_thunk(self, node, storage_map, _, _2):
mod = SourceModule("""
__global__ void my_fct(float * i0, float * o0, int size) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
if(i<size){
o0[i] = i0[i] * 2;
}
}""")
pycuda_fct = mod.get_function("my_fct")
inputs = [ storage_map[v] for v in node.inputs]
outputs = [ storage_map[v] for v in node.outputs]
def thunk():
z = outputs[0]
if z[0] is None or z[0].shape!=inputs[0][0].shape:
z[0] = cuda.CudaNdarray.zeros(inputs[0][0].shape)
grid = (int(numpy.ceil(inputs[0][0].size / 512.)),1)
pycuda_fct(inputs[0][0], z[0], numpy.intc(inputs[0][0].size),
block=(512, 1, 1), grid=grid)
thunk.lazy = False
return thunk
二、CUDAMat
这里的函数是用来在CUDAMat对象和 Theano的 CudaNdArray对象之间进行转换的。 它们遵循和theano的PyCUDA函数一样的原则,可以查阅 theano.misc.cudamat_utils.py.
WARNING: 在这些转换器上,会有一个与stride/shape相关的特殊的问题。为了能够work,需要 transpose和reshape.等操作..
三、Gnumpy
这是介于Gnumpy garray 对象和
Theano CudaNdArray 对象之间的转换函数。也同样相似于 Theano的 PyCUDA 函数,可查阅: theano.misc.gnumpy_utils.py.
参考资料:
[1] 官网:http://deeplearning.net/software/theano/tutorial/gpu_data_convert.html
Theano2.1.13-基础知识之PyCUDA、CUDAMat、Gnumpy的兼容的更多相关文章
- Theano2.1.1-基础知识之准备工作
来源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial 这里介绍的是使用theano的一些基础知识,虽然thea ...
- C# 基础知识系列-13 常见类库(三)
0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...
- 【干货】用大白话聊聊JavaSE — ArrayList 深入剖析和Java基础知识详解(二)
在上一节中,我们简单阐述了Java的一些基础知识,比如多态,接口的实现等. 然后,演示了ArrayList的几个基本方法. ArrayList是一个集合框架,它的底层其实就是一个数组,这一点,官方文档 ...
- java基础知识 多线程
package org.base.practise9; import org.junit.Test; import java.awt.event.WindowAdapter; import java. ...
- Java基础知识【下】( 转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- LLDB基础知识
LLDB基础知识 LLDB控制台 Xcode中内嵌了LLDB控制台,在Xcode中代码的下方,我们可以看到LLDB控制台. LLDB控制台平时会输出一些log信息.如果我们想输入命令调试,必须让程序进 ...
- Oracle数据库基础知识
oracle数据库plsql developer 目录(?)[-] 一 SQL基础知识 创建删除数据库 创建删除修改表 添加修改删除列 oracle cascade用法 添加删除约束主键外 ...
- Linux基础知识整理
一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...
随机推荐
- .Net开源网络爬虫Abot介绍
.Net中也有很多很多开源的爬虫工具,abot就是其中之一.Abot是一个开源的.net爬虫,速度快,易于使用和扩展.项目的地址是https://code.google.com/p/abot/ 对于爬 ...
- javascript-适配器模式
适配器模式笔记 将一个类(对象)的接口(方法或属性)转化成另一个接口,以满足用户需求,使类(对象)之间接口的不兼容性问题通过适配器方法得以解决 demo实例:1.适配参数对象,使传入的参数完整 2.适 ...
- 按要求编写Java应用程序。 (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。
package zuoye; public class Cat { String name="妮妮"; String color="灰色"; int age=1 ...
- 浅谈游标选项 Static|Keyset|DYNAMIC|FAST_FORWARD
接好久之前太监的一篇Blog.现在补充几个选项的介绍 所用的语句都是这个 IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 GO CREATE TABLE T1 ...
- IDENT_CURRENT ,@@identity,SCOPE_IDENTITY() 之间对比
获取表的标识值,有3种比较常见的用法 IDENT_CURRENT ,@@identity,SCOPE_IDENTITY(),有啥不一样呢? 3个关键字在联机手册中的解释 IDENT_CURRENT ...
- HBase应用开发回顾与总结系列之二:RowKey行键设计规范
2. RowKey行键设计规范 2.1. RowKey四大特性 2.1.1 字符串类型 虽然行键在HBase中是以byte[]字节数组的形式存储的,但是建议在系统开发过程中将其数据类型设置为Strin ...
- iOS同一项目多个Target的快速实现方法
之前写过这种场景下的项目,比如类似滴滴的司机端和乘客端,学生端和教师端等等.. 最近有人问我,就整理记录如下: 1.正常新建一个项目,完成后 如下: 2.这一步就是添加一个新的target 3.添加 ...
- Linux和开源已经在2013年开始悄悄主宰世界?
提到Linux,很多人觉得它依旧不温不火,实际上在这个即将过去的一年,Linux和开源软件已经悄悄主宰了计算领域的各方面,这具体表现在开源项目遍地、Chromebook崛起、SteamOS备受瞩目、A ...
- Jquery 的遍历,祖先、后代、同胞以及其过滤
什么是遍历? jQuery 遍历,意为“移动”,用于根据其相对于其他元素的关系来“查找”(或选取)HTML 元素.以某项选择开始,并沿着这个选择移动,直到抵达您期望的元素为止. 下图展示了一个家族树. ...
- 树莓派2 安装 win10Iot 和 Ubuntu mate
注册博客账号已经2年多了.一直没写博文现在抽空写写. 写这篇博文是因为我之前在网上找了蛮多有关教程写的都不是很清晰.安装没成功.所以我写一下我根据网上找到的整理一下分享出来. 非专业只是业余玩玩.好了 ...