Küçük bir gömülü sistemdeki görüntü verileri üzerinde 5 çapraz medyan filtrenin bir varyasyonunu kullanıyorum, yani
x
x x x
x
Algoritma gerçekten basittir: 5 işaretsiz tam sayı değeri okuyun, en yüksek 2 değerini alın, bunlar üzerinde bazı hesaplamalar yapın ve işaretsiz tam sayı sonucunu yazın.
Güzel olan, 5 tamsayı giriş değerinin hepsinin 0-20 aralığında olmasıdır. Hesaplanan tamsayı değeri de 0-20 aralığındadır!
Profilleme yoluyla, en büyük iki sayıyı elde etmenin darboğaz olduğunu anladım, bu yüzden bu kısmı hızlandırmak istiyorum. Bu seçimi yapmanın en hızlı yolu nedir?
Mevcut algoritma, 5 sayı ile verilen konumda 1 ve HW destekli bir CLZ fonksiyonu ile 32 bit maske kullanır.
CPU'nun tescilli olduğunu ve şirketimin dışında bulunmadığını söylemeliyim. Derleyicim GCC ama bu CPU için özel olarak üretildi.
Bir arama tablosu kullanabilir miyim anlamaya çalıştım ama kullanabileceğim bir anahtar üretmek için başarısız oldu.
Giriş için kombinasyon var ama sipariş önemli değil, yani aynı .[5,0,0,0,5]
[5,5,0,0,0]
Aşağıdaki karma işlev, çarpışma olmadan mükemmel bir karma üretir!
def hash(x):
h = 0
for i in x:
h = 33*h+i
return h
Ancak karma çok büyük ve bunu kullanmak için yeterli bellek yok.
Kullanabileceğim daha iyi bir algoritma var mı? Sorunumu bir arama tablosu kullanarak ve bir anahtar üreterek çözmek mümkün mü?
hash
zaten fazla işlemlerini gerçekleştirir. Yönteme sonraki çağrılar ilişkili mi, örneğin merkezix
matris boyunca satır satır ilerliyor mu?