Я використовую варіацію 5-хрестоподібного серединного фільтра для даних зображень на невеликій вбудованій системі, тобто
x
x x x
x
Алгоритм дійсно простий: прочитайте 5 безпідписаних цілих значень, отримайте найвищі 2, зробіть кілька обчислень на них і запишіть результат непідписаного цілого числа.
Приємно, що 5 цілих вхідних значень знаходяться в межах 0-20. Обчислене ціле значення також знаходиться в діапазоні 0-20!
За допомогою профілювання я зрозумів, що отримання найбільших двох чисел є вузьким місцем, тому я хочу прискорити цю частину. Який найшвидший спосіб здійснити цей вибір?
Поточний алгоритм використовує 32-бітну маску з 1 у положенні, заданому 5 числами, та функцією CLZ, підтримуваною HW.
Я мушу сказати, що процесор є власником, не доступний за межами моєї компанії. Мій компілятор - 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
через матрицю рядок за рядком?