Я использую вариант 5-перекрестного медианного фильтра для данных изображения в небольшой встроенной системе, т.е.
x
x x x
x
Алгоритм действительно прост: прочитайте 5 целочисленных значений без знака, получите самые высокие 2, сделайте некоторые вычисления и запишите результат целого числа без знака.
Что приятно, так это то, что все 5 целочисленных входных значений находятся в диапазоне 0-20. Рассчитанное целочисленное значение также находится в диапазоне 0-20!
Благодаря профилированию я понял, что получение двух самых больших чисел является узким местом, поэтому я хочу ускорить эту часть. Какой самый быстрый способ выполнить этот выбор?
Текущий алгоритм использует 32-битную маску с 1 в позиции, заданной 5 числами, и поддерживаемую HW функцию CLZ.
Я должен сказать, что процессор является проприетарным и недоступен за пределами моей компании. Мой компилятор GCC, но специально для этого процессора.
Я попытался выяснить, могу ли я использовать справочную таблицу, но мне не удалось сгенерировать ключ, который я могу использовать.
У меня есть комбинаций для ввода, но порядок не важен, то есть такой же, как .[5,0,0,0,5]
[5,5,0,0,0]
Бывает, что приведенная ниже хеш-функция создает идеальный хеш без коллизий!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Но хэш огромен, и для его использования просто недостаточно памяти.
Есть ли лучший алгоритм, который я могу использовать? Можно ли решить мою проблему с помощью таблицы соответствия и генерации ключа?
hash
уже выполняет больше операций. Связаны ли последующие вызовы метода, например, центральныйx
линг пересекает матрицу построчно?