Cupy медленнее, чем numpy, при итерации по массиву

У меня есть код, который я хочу распараллелить с cupy. Я думал, что это будет просто - просто напишите «import cupy as cp» и замените везде, где я написал np., На cp., И это сработает.

И это действительно работает, код работает, но работает намного медленнее. Я думал, что в конечном итоге это будет быстрее, по сравнению с numpy, при итерации через большие массивы, но похоже, что этого никогда не происходит.

Код такой:

q = np.zeros((5,5))
q[:,0] = 20

def foo(array):

    result = array
    shedding_row = array*0
    for i in range((array.shape[0])):
        for j in range((array.shape[1])-1):

            shedding_param = 2 * (result[i,j])**.5             
            shedding = (np.random.poisson( (shedding_param), 1))[0]

            if shedding >= result[i,j]:
                shedding = result[i,j] - 1

            result[i,j+1] = result[i,j] - shedding

            if result[i,j+1]<0:
                result[i,j+1] = 0

            shedding_row[i,j+1] = shedding  

    return(result,shedding_row)

x,y = foo(q)

Это должно быть быстрее с Cupy? Я неправильно это использую?


person Ipulatov    schedule 07.08.2019    source источник


Ответы (1)


Чтобы получить быструю производительность numpy или cupy, вы должны использовать параллельную операцию вместо использования цикла for.

Например,

for i in range((array.shape[0])):
    for j in range((array.shape[1])-1):

        shedding_param = 2 * (result[i,j])**.5

Это можно рассчитать как

xp = numpy  # change to cupy for GPU
shedding_param = 2 * xp.sqrt(result[:, :-1])
person corochann    schedule 08.08.2019