Есть ли способ компиляции (то есть кэширования) подходящего RawKernel перед его вызовом? - PullRequest
1 голос
/ 27 мая 2019

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

Для простоты предположим, что ниже у меня есть простое сырое ядро.

import cupy as cp


add_kernel = cp.RawKernel(r'''
extern "C" __global__
void add_one(float* dimg, float* y) {
    int j = threadIdx.x;
    int i = blockIdx.x;
    int k = blockDim.x;
    int tid = k*i+j;

    y[tid] = dimg[tid] + 1;
}
''', 'add_one')


if __name__ == '__main__':
    h, w = 192, 256
    dimg_cp = cp.zeros(shape=(h, w), dtype=cp.float32)
    y = cp.zeros(shape=(h, w), dtype=cp.float32)
    add_kernel((h,), (w,), (dimg_cp, y))
    print(y)

Здесь add_kernel просто копирует входную матрицу и добавляет один к каждому элементу скопированногоМатрица затем вернуть его.Это прекрасно работает, но я считаю, что код можно дополнительно оптимизировать с точки зрения скорости выполнения.

В соответствии с ссылкой , когда ядро ​​вызывается впервые (то есть не кэшируется),на компиляцию будут накладные расходы.

Я хочу избежать этого времени компиляции.Поэтому я хочу спросить, есть ли способ компиляции cp.RawKernel перед первым вызовом ядра?

Заранее спасибо.

1 Ответ

1 голос
/ 29 мая 2019

В настоящее время нет явного способа прекомпиляции ядра без его вызова. Одно простое решение - просто вызвать его один раз с небольшим вводом. Обратите внимание, что скомпилированное ядро ​​также кэшируется в файл, поэтому накладные расходы существуют только при первом выполнении сценария в среде.

...