Как написать определяемую пользователем функцию ядра cupy для вычисления сегментированной суммы

#numpy #cupy

#numpy #cupy

Вопрос:

Сейчас я использую следующую функцию, но я не думаю, что она работает, но я не могу понять описание определения ядра cupy. Эта функция требует больших затрат памяти и времени, когда речь идет об огромных данных.

 def cupy_sum(self, bins):
    bidx = cupy.cumsum(bins) -1,
    return cupy.diff(cupy.r_[0, cupy.cumsum(self)[bidx]])
 

Обратитесь к другим примерам и напишите следующий код, не знаю, есть ли проблема.

 sum_section_kernel = cp.ElementwiseKernel(
'raw T bins, raw T dats',
'float32 out',
'''
T bin_f = bins[i  ];
T bin_l = bins[i 1];
T biv   = 0;
for(size_t j=bin_f; j<bin_l; j  ){
  biv  = dats[j];
}        
out = biv; 
''',
'summe')

a = cp.array([4, 3, 5], dtype=cp.float32)
b = cp.array([1, 1, 1.1, 1,   2, 2, 2,   3, 3, 3, 3, 3], dtype=cp.float32)
y = cp.empty(3, dtype=cp.float32)

a = cp.r_[0,a.cumsum()]
out = sum_section_kernel(a, b, y)
print(out)

> [ 4.100  6.000  15.000]
 

Ответ №1:

Пример был приведен выше, и скорость не была улучшена, но я думаю, что преимущество экономии памяти все еще есть.