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

Python int操作是否可以在Theano的GPU上进行?,python,gpu,gpgpu,theano,Python,Gpu,Gpgpu,Theano,因此,我读到theano无法使用float64进行gpu计算,并且要将整数作为共享变量存储在gpu上,必须将其初始化为共享float32数据,然后再重铸为整数(就像逻辑回归中的“小黑客”一样)……但是在重铸之后,theano能在整数上进行gpu计算吗?存储是计算的先决条件吗?换句话说,以下两种情况是否可能 情景1。我想在两个大的整数向量上做点积。因此,我将它们共享为float32,并在点积之前将它们重新转换为int,这个点积是否在gpu上完成(无论int类型) 情景2。如果场景1是可能的,是否仍

因此,我读到theano无法使用
float64
进行gpu计算,并且要将整数作为共享变量存储在gpu上,必须将其初始化为共享
float32
数据,然后再重铸为整数(就像逻辑回归中的“小黑客”一样)……但是在重铸之后,theano能在整数上进行gpu计算吗?存储是计算的先决条件吗?换句话说,以下两种情况是否可能

情景1。我想在两个大的整数向量上做点积。因此,我将它们共享为
float32
,并在点积之前将它们重新转换为int,这个点积是否在gpu上完成(无论int类型)

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

不,(目前)除了
float32
之外,没有其他方式在gpu上执行任何操作

这可以通过以下演示代码看到:

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正在执行点积(GpuDot22操作),但在浮点数据上,而不是整数数据上。

回答得很好,我肯定会投票支持它(但我没有必要的声誉:S)。然而,根据这一点,在这种情况下,他们首先将共享的y存储为floatX,然后将其重铸为int似乎是没有用的。根据上面的例子,这只会增加gpu cpu的通信量。我相信,如果int仅用作其他张量的索引,情况会有所不同,如该示例中所示。当您想对整数执行数学运算时,问题就出现了。
HostFromGpu [@A] ''   1
 |GpuDot22 [@B] ''   0
   |<CudaNdarrayType(float32, matrix)> [@C]
   |<CudaNdarrayType(float32, matrix)> [@D]