在Theano中是否有GPU加速的numpy.max(X,axis=0)实现?

在Theano中是否有GPU加速的numpy.max(X,axis=0)实现?,numpy,pycuda,theano,deep-learning,Numpy,Pycuda,Theano,Deep Learning,我们是否有一个GPU加速版的numpy.max(X,axis=None)在No中。 我查看了文档,发现theano.tensor.max(X,axis=None),但它比numpy实现慢4-5倍 我可以向你保证,它不会因为矩阵大小选择不当而变慢。相同的矩阵在theano.tensor.exp下比numpy对应矩阵快40倍 有什么建议吗?max和exp操作根本不同exp(以及其他操作,如加法、sin等)是一种令人尴尬的可并行化的元素级操作,而max需要一种并行处理扫描算法,该算法基本上在数组上建立

我们是否有一个GPU加速版的
numpy.max(X,axis=None)
在No中。 我查看了文档,发现
theano.tensor.max(X,axis=None)
,但它比numpy实现慢4-5倍

我可以向你保证,它不会因为矩阵大小选择不当而变慢。相同的矩阵在theano.tensor.exp下比numpy对应矩阵快40倍


有什么建议吗?

max和
exp
操作根本不同
exp
(以及其他操作,如加法、
sin
等)是一种令人尴尬的可并行化的元素级操作,而
max
需要一种并行处理扫描算法,该算法基本上在数组上建立成对比较树。加速
max
并非不可能,但它不像
exp
那么容易

无论如何,
theano
max
实现基本上由以下几行组成(在theano/tensor/basic.py中):

其中,
max_和_argmax
是一组自定义代码,在我看来,它们使用
numpy
实现max+argmax操作,
CAReduce
是一种通用的GPU加速扫描操作,用作回退(根据注释,它不支持
grad
等)。您可以尝试直接使用回退,看看是否更快,可能是这样:

from theano.tensor.elemwise import CAReduce
from theano.scalar import maximum

def mymax(X, axis=None):
    CAReduce(maximum, axis)(X)

前面的答案是片面的。这个建议不应该起作用,因为解决方法是最终编译代码中使用的方法。有一个优化将自动完成此转换

问题的题目和内容不一样。他们在轴心论点上有所不同。我会回答这两个问题

如果轴为0或无,我们支持在GPU上对矩阵进行该操作。如果axis是None,那么我们有一个基本的实现,它没有得到很好的优化,因为它很难并行化。如果axis是0,我们有一个基本的实现,但是它更快,因为它更容易并行化


还有,你是如何安排时间的?如果您仅使用该操作生成一个函数,并通过device=gpu标志对其进行测试以进行比较,这将包括CPU和gpu之间的传输时间。这是一个内存受限的操作,所以如果你在计时中包含了传输,那么我不希望在这种情况下有任何速度运算。要仅查看GPU操作,请使用Theano profiler:运行时使用Theano标志profile=True。

这似乎并没有改善性能,至少现在性能与CPU相当。我尝试了各种大小的矩阵只是为了确定。编辑:对于较大的矩阵,速度仍然慢4倍。毫不奇怪,找到最大值是内存限制。是的,我对整个复制+计算进行了计时。我将尝试Ano profiler。我希望加速最大(X,轴=0)操作,包括复制开销。对于任何矩阵大小,我似乎都无法得到。你有什么建议?正如我在回答中试图告诉你的,我认为如果你将任何系统的换乘时间包括在内,而不仅仅是Theano,那么你将无法最大限度地降低换乘速度。为了减少CPU的占用,瓶颈是从内存中读取数据。传输到GPU的速度比CPU内核读取CPU内存的速度慢。如果您希望GPU加速,包括传输,您需要在GPU上进行更多的计算。
from theano.tensor.elemwise import CAReduce
from theano.scalar import maximum

def mymax(X, axis=None):
    CAReduce(maximum, axis)(X)