所以我读过theano不能用float64进行gpu计算,并将int作为共享变量存储在gpu上,它们必须初始化为共享的float32数据,然后重新转换为int(比如逻辑回归中的“小黑客”)example )…但是经过这样的重铸后,theano能否对整数进行gpu计算?并且存储是计算的前提条件?换句话说,以下两种情况是否可能?
场景1.我想在两个大的int向量上做一个点积.因此,我将它们作为float32共享并在dot产品之前将它们重新转换为int,这个点积然后在gpu上完成(不管int类型)?
场景2.如果场景1是可能的,是否仍然可以在gpu上进行计算而不将它们首先存储为共享的float32? (我知道共享变量可能会缓解gpu-cpu通信,但是dot产品仍然可能吗?存储是计算gpu的先决条件吗?)
解决方法:
不,(目前)没有办法在GPU上使用除float32以外的任何类型进行任何操作.
这个小的演示代码可以看出:
import numpy
import theano
import theano.tensor as tt
x = theano.shared(numpy.arange(9 * 10).reshape((9, 10)).astype(numpy.float32))
y = theano.shared(numpy.arange(10 * 11).reshape((10, 11)).astype(numpy.float32))
z = theano.dot(tt.cast(x, 'int32'), tt.cast(y, 'int32'))
f = theano.function([], outputs=z)
theano.printing.debugprint(f)
在GPU上运行时,它将打印以下计算图:
dot [@A] '' 4
|Elemwise{Cast{int32}} [@B] '' 3
| |HostFromGpu [@C] '' 1
| |<CudaNdarrayType(float32, matrix)> [@D]
|Elemwise{Cast{int32}} [@E] '' 2
|HostFromGpu [@F] '' 0
|<CudaNdarrayType(float32, matrix)> [@G]
在这里你可以看到两个共享变量确实存储在GPU内存(两个CudaNdarrayTypes)中,但它们在被转换为int和常规之前从GPU(HostFromGpu操作)移动到主机(即CPU /主内存)使用点操作.
如果省略了演员表,那么你会看到
HostFromGpu [@A] '' 1
|GpuDot22 [@B] '' 0
|<CudaNdarrayType(float32, matrix)> [@C]
|<CudaNdarrayType(float32, matrix)> [@D]
显示GPU正在执行点积(GpuDot22操作)但是在浮点数据上,而不是整数数据.
标签:python,gpgpu,gpu,theano 来源: https://codeday.me/bug/20190609/1203424.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。