Обобщенные вычисления в скользящем окне на GPU

Вот код Python, который реализует вычисление в скользящем окне для двух 3D-матриц X и Y .

import numpy

def sliding_dot( X,Y ) :

    assert X.ndim == Y.ndim == 3
    iw,ih,id = X.shape
    fw,fh,fd = Y.shape

    assert id == fd
    assert fw < iw and fh < ih

    ow,oh = iw-fw+1,ih-fh+1
    out = numpy.zeros( [ow,oh] )

    for x in xrange(ow) :
        for y in xrange(oh) :
            window = X[x:x+fw,y:y+fh,:]
            out[x,y] = numpy.dot( window.flatten(),Y.flatten() )

    return out

#################    

A_dims = (640,480,32)
B_dims = (6,6,32)

A = numpy.random.rand(*A_dims)
B = numpy.random.rand(*B_dims)

sliding_dot(A,B)

В общем, Y всегда намного меньше X по первому и второму измерениям, но они равны в третьем измерении.

Обратите внимание, что мы можем заменить numpy.dot () любой функцией Y и окна. Это немного отличается от свертки в том, что Y скользит только по первому и второму измерениям X. Я ищу эффективную стратегию для эффективной реализации такого типа вычислений скользящего окна с использованием CUDA. Кто-нибудь хочет предложить мне какое-нибудь направление? Ваше здоровье!

Обновление : вы можете посмотреть, как я работаю над процессом оптимизации с помощью других пользователей в моем ответе ниже.

7
задан BrianTheLion 10 October 2011 в 02:43
поделиться