不,(目前)没有办法在 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)但是它们是从GPU移动到主机(即CPU/主内存)的(HostFromGpu操作)在被强制转换为整数并使用常规 dot 操作之前。
如果演员被省略,那么你会看到
HostFromGpu [@A] '' 1
|GpuDot22 [@B] '' 0
|<CudaNdarrayType(float32, matrix)> [@C]
|<CudaNdarrayType(float32, matrix)> [@D]
显示 GPU 正在执行点积(GpuDot22 运算),但针对的是浮点数据,而不是整数数据。