在Theano的GPU上是否可以进行int操作?

Fra*_*ess 4 python gpu gpgpu theano

所以我读过theano不能用gpu计算float64和存储整数作为共享变量在gpu上它们必须初始化为共享float32数据,然后重铸为int(如逻辑回归示例中的"小黑客" ). ..但是经过这样的重铸之后,theano能否对整数进行gpu计算?并且存储是计算的前提条件?换句话说,以下两种情况是否可能?

场景1.我想在两个大的int向量上做一个点积.因此,我将它们分享为float32并在dot产品之前将它们重新转换为int,然后在gpu上完成此点积(无论int类型)?

场景2.如果场景1是可能的,是否仍然可以在gpu上进行计算而不将它们首先存储为共享的float32?(我知道共享变量可能会缓解gpu-cpu通信,但是dot产品仍然可能吗?存储是计算gpu的先决条件吗?)

Dan*_*haw 5

不,(目前)没有办法在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)
Run Code Online (Sandbox Code Playgroud)

在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]
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到两个共享变量确实存储在GPU内存(两个CudaNdarrayTypes)中,但它们HostFromGpu在被转换为int和常规dot操作之前从GPU(操作)移动到主机(即CPU /主内存)正在使用.

如果省略了演员表,那么你会看到

HostFromGpu [@A] ''   1
 |GpuDot22 [@B] ''   0
   |<CudaNdarrayType(float32, matrix)> [@C]
   |<CudaNdarrayType(float32, matrix)> [@D]
Run Code Online (Sandbox Code Playgroud)

显示GPU正在执行点积(GpuDot22操作)但是在浮点数据上,而不是整数数据.