в Nvidia Performance Primitives (АЭС) примеры обработки изображений в Распределение CUDA SDK, изображения обычно хранятся в CPU как ImageCPU
объекты и изображения хранятся на GPU как ImageNPP
объекты.
boxFilterNPP.cpp это пример из CUDA SDK, который использует эти ImageCPU
а также ImageNPP
объекты.
При использовании функции фильтра (свертка), как nppiFilter
, имеет смысл определить фильтр как ImageCPU
объект. Тем не менее, я не вижу четкого способа установки значений ImageCPU
объект.
npp::ImageCPU_32f_C1 hostKernel(3,3); //allocate space for 3x3 convolution kernel
//want to set hostKernel to [-1 0 1; -1 0 1; -1 0 1]
hostKernel[0][0] = -1; //this doesn't compile
hostKernel(0,0) = -1; //this doesn't compile
hostKernel.at(0,0) = -1; //this doesn't compile
Как я могу вручную поместить значения в ImageCPU
объект?
Заметки:
nppiFilter
во фрагменте кода; Я просто упоминаю nppiFilter
в качестве мотивирующего примера для записи значений в ImageCPU
объект.ImageCPU
объект, потому что nppiFilterBox
это особый случай nppiFilter
который использует встроенный гауссов сглаживающий фильтр (вероятно, что-то вроде [1 1 1; 1 1 1; 1 1 1]).Чтобы назначить значения пикселю / матрице:
hostKernel.pixels(0,0)[0].x = -1;
Вы говорите: «При использовании функции фильтра (свертки), такой как nppiFilter, имеет смысл определить фильтр как объект ImageCPU».
Это ложная и плохая идея. Данные изображения обычно хранятся в формате «с добавлением строки», а классы изображений, поставляемые с образцами CUDA SDK для АЭС, используют специальные распределители 2D-памяти, которые добавляют байты заполнения в конец каждой строки. Таким образом, первый пиксель каждой строки попадает на 64-байтовый выровненный адрес. Это сделано из соображений производительности (как на процессорах, так и на графических процессорах).
Массивы ядра, используемые для таких примитивов, как nppiFilter, должны быть плотно упакованы. Вот почему приведенный код не будет работать.
Для 1 канала (например, 32f_C1
), этот подход работает:
hostKernel.pixels(0,0) = -1;