Подскажите, пожалуйста, может, кто-нибудь сталкивался с таким. Я нашел это, но в коде черт ногу сломает (используется оптимизация под конкретные процессоры) и, самое главное, результат - uchar. А мне нужно для float.
Пока использую ворованный в Numerical Recipes алгоритм quick_select, данные для которого готовлю так: в начале каждой строки изображения заполняю для фильтра nxm массив-подызображение; вычисляю quick_select'ом медиану; при переходе к следующему пикселю в массиве-подызображении меняю только один столбец (который уже не нужен) на столбец с новыми данными.
Мой подход жутко тормозной:
* однопоточная:
* 127секунд для 3Кх3К с фильтром 32х32
* 33секунды для 3Кх3К с фильтром 16x16
* 4.4секунды 3Кх3К с фильтром 5х5
* четырехпоточная:
* 1974секунды для 3Кх3К с фильтром 256x256
* 40секунд для 3Кх3К с фильтром 32х32
* 10секунд для 3Кх3К с фильтром 16x16
* 1.4секунды 3Кх3К с фильтром 5х5
Если фильтр больше, чем 5x5, использовать этот алгоритм вообще нельзя.
На CUDA я еще не переписывал, но, боюсь, производительность не сильно-то и возрастет (все равно самой медленной операцией является quick_select, даже если я вместо четырех буду использовать 100 потоков, скорость увеличится всего лишь раз в 20).
Вопрос: как можно это ускорить?