智能操作是否可以在atano的GPU上进行?

2024-04-23 08:54:26 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我读到theano不能用float64进行gpu计算,并且要将int作为共享变量存储在gpu上,它们必须初始化为共享的float32数据,然后重新转换为int(就像在logistic回归example中的“小黑客”)。但是在这样一个重铸之后,theano能在int上进行gpu计算吗?存储是计算的先决条件吗?换句话说,以下两种情况是否可能?在

场景1。我想对两个大的整数向量做点积。因此,我将它们共享为float32,并在点积之前将它们重新转换为int,那么这个点积是否在gpu上完成(不管int类型如何)?在

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


Tags: 数据类型gpu先决条件example场景情况整数
1条回答
网友
1楼 · 发布于 2024-04-23 08:54:26

不,没有办法(目前)在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上运行时,它将打印以下计算图:

^{pr2}$

在这里您可以看到这两个共享变量确实存储在GPU内存中(这两个CudaNdarrayTypes),但是它们在被强制转换为ints之前从GPU(即HostFromGpu操作)移动到主机(即CPU/主内存),然后使用常规的dot操作。在

如果省略了类型转换,那么您将看到

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

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

相关问题 更多 >