Enbuyuk, en kucuk, esit vs Algoritma

Başlatan z, 21 Mart 2021, 06:54:06

z

V1,V2,V3 seklinde 3 tane 64 bitlik long long tipinde degiskenim var.

Programin pek cok satirda 

en buyuk V1 ise sunu sunu yap.
en buyuk V2 ise sunu sunu yap
en buyuk V3 ise sunu sunu yap

en kucuk V1 ise sunu sunu yap.
en kucuk V2 ise sunu sunu yap
en kucuk V3 ise sunu sunu yap

en buyuk v1 degil ama V2ye esit V3 den buyuk
en buyuk v2 degil ama V1ye esit V3 den buyuk
en buyuk v3 degil ama V2ye esit V1 den buyuk
...
...

gibi kontroller ve sonucuna gore islemler yapiyor.

Haliyle 64 bit degiskenlerde en buyuk en kucuk gibi testler zaman aliyor.

Bu sekilde her defasinda kontrol yapmak yerine bir yerde kontrol yapip sonuclari ureteyim
daha sonra sonuclari daha basit sekilde kontrol edeyim.

Kafa yoracaklar buyursun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Andromeda

..alt program kullanmak neden işe yaramıyor?
bunun tek çözümü daha hızlı işlemci kullanmak herhalde..
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

Yuunus

high byte ve low byte ayri degerlendirebilirsinix

z

E1 en buyuk ise k=1
E2 en buyuk ise k=2


Gibi durumlari kodladim.

Daha sonra karsilastirma gereken yerde sadece K degerini kontrol ettim.

Boylece her defasinda 64 bit sayilari karsilastirma zahmetinden kurtuldum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Andromeda

..en büyük değişmiyorsa tabi ki işe yarar ama,
..en büyük değişirse ne olacak.Karşılaştırma yapmak o zaman zorunlu hale gelecek.. mi acaba?
kafa yoracaklar buyursun :D
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

OG

#5
çoklu karşılaştırmalarda benzer durumu yaşamamak için

karşılaştırılacak büyük değişkenler sayısınca bit adedi olan farklı bir değişken kullanıyorum

mesela 7 büyük değerli (64 bit) değişkenimiz var,
7 bit gerekir, yani bir byte

gereken karşılaştırma tipi kadar, yani;
en büyük için 1 byte (mesela değişken adı= buyuksun)
en küçük için 1 byte (mesela değişken adı= kucuksun)
gibi
ilgili bit 1 ise o değişken en büyük veya en küçük
başlangıçta
buyuksun = 0  (bit bazında %00000000)
kucuksun = 0  (bit bazında %00000000)

ana değişkenlerin değer değişimi olduğu anda
kıyaslama yapıp ilgili biti set / clear  yapıyorum
böylelikle kıyaslama işlemi dağıtılmış oluyor, yani uzun süreli kıyaslamalardan kurtulunuyor
sorgulama da bit bazında hazır oluyor
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

z

#6
Alıntı yapılan: Andromeda - 21 Mart 2021, 20:48:31..en büyük değişmiyorsa tabi ki işe yarar ama,
..en büyük değişirse ne olacak.Karşılaştırma yapmak o zaman zorunlu hale gelecek.. mi acaba?
kafa yoracaklar buyursun :D

Sorun degerin degisip degismemesi degil.

Zirt pirt 64 bit sayilarin buyukluk karsilastirma islemini yapmamak. Sayilardan birisi degistiginde hemen karsilastirma islemini yapip kodlama yapip sonraki karsilastirma ihtiyaclarinda dogrudan kodlanmis degerleri kullanmak.

Bu mantikla kodum 152 byte daha kisa oldu ve hizim da daha artti.

Mevcut cozumumde 8 bitlik bir flag ile 256 farkli durum kodlanabiliyor.

Ornegin 

V1>V2 V2=V3 V3<V4 durumu K=1
V1<V2 V2=V3 V3<V4 durumu K=2
V1=V2 V2=V3 V3<V4 durumu K=3 gibi.

Bu durumda

if ((V1>V2) && (V2==V3) && (V3<V4))
  {
  }
else if ((V2>V1) && (V2==V3) && (V3<V4))
  {
  }
else if ((V1==V2) && (V2==V3) && (V3<V4))
  {
  }

Yukaridaki ornek

if (k==1)
{
}
else if (k==2)
{
}
else if (k==3)
{
}

gibi basit ve hizli bir koda donusuyor.

Verdigim ornek optimize edilmeye yatkin bir ornek oldu. Yani normalde her if satirinda tum degiskenleri tekrardan karsilastirmaya gerek olmasa da ana fikir olmasi acisindan bu ornegi verdim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Karşılaştırmalar için asm serbest mi?
C derleyici nasıl karşılaştırmış 64 biti,
eldeli karşılaştırma komutunu kullanmış mı?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

Islemcinin data bit uzunlugunu asan boyutta veriler karsilastirildigi icin elde bitine bakmak zorunda.

Asm ciktisina ilk firsatta bakarim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Bu linkte biraz bahsedilmiş,
16bit DsPic30F de B borrow ile karşılaştırma gibi bir komut vardı.
Normal CP komutu vede CPB komutu ayrı.
Yine SUB, SUBB vs. de var.

Bunları kullanarak 16bit işlemcide 32 64 bit karşılaştırmalar daha hızlı yapılabiliyor.
Daha ACCU lu işlerde var...

Senin işlemcidede benzer komutlar vardır bakmak lazım.

İlgili link:https://www.microchip.com/forums/m/tm.aspx?m=180857&p=1

Özellikle Olin in yazdığı mesaj.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

#10
Karsilastirma islemi biraz karmasik.

Sadece barrow biti bir sey ifade etmez.

Isaretli sayilari karsilastirirken barrow ve overflow bitlerini de degerlendirmek lazim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com