Bilmece Bulmaca ASM ile yapabilmece ama C ile yapamaca

Başlatan z, 29 Ekim 2013, 14:22:24

z

@rrre

2 Cycle isteyen komutları bir kenara bırakırsak, lineer kodlama yaptığımızda cycle başına işletilebilecek komut sayısı 1 olabilir.

Fakat özel tekniklerle (buram buram reklam kokuyor) 4 clockda 5 komut işletilebiliyor.

Hani CM3 işlemcilerde ASM ile yazarsan C den daha kötü bir performans bile elde edebilirsin deniyor ya, ben de diyorumki C ile işe yarar bir kod yazın bu oranı yakalayın.

Sanki C yazanlar makinaya C kod koşturuyorlar sanki ben onların C derleyicisinin üreteceği kodları elle yazmaktan acizim.

Lokal olarak 5..10 ASM satırında 1.25 sonrasında ortalama belki de 0.8.

Bir kaç yüz bytlık programda ortalama olarak CPI değerini 1,e yaklaştırsam benim için başarıdır ki hiç pipeline boşaltma durumlarına özel olarak kafa yormayacağım.

Açın optimizasyon ayarlarını alın max hız konumuna sonra da basın gaza, bakalım görelim C dediğiniz meret kaç basıyor...

Biraz tartışınca da fanatiklik yapıyor oluyoruz. CM3 şart değil ki. CM0 olsun. PIC olsun. 8051 olsun.

-----------------------------

Üniversiteden mezun olduğumda hex kodlamadan başka programlama bilmezdim. Bakın dikkat edin hex kodlama diyorum ASM bile değil.

Kısa bir süre sonra PC ve MsDos'un meşhur Debug ve Symdeb programları ile tanışınca mnemonik kodlarla program yazılabildiğini keşfettik.

Keşfettik diyorum çünkü biz üniversitede mikroişlemci programlama dersi almadık.

Ben uzun yıllar çok hızlı çalışan kod yazdığımı sanıyordum.

Bir gün bir işe başladım ve PC de asm ile yazdığım pixel pixel grafik çizen programın arkadaşımın C ile yazdığı programa kıyasla kağnı gibi yavaş, grafik çizdiğini gördüm.

Nasıl olurdu da C ile yazılmış bir program ASM ile yazılandan daha hızlı koşuyordu?

Sorun algoritma vs sorunuydu. Ben hazır BIOS interruptlar üzerimden pixel çizdiriyordum C program ise  hesap kitap yapıp yapıp doğrudan CRTC RAM'a ulaşıyordu.

O halde bu ASM nin değil benim becereksizliğimdi.

C deki grafik rutinini debug edip asm kodları elde ettim. Aradan bir sürü fazlalık kodu çıkartıp attım. Benim kodum artık C'ye nal toplatıyordu.

Olay işte bu.

Bir kod optimize edilmek istenirse optimize edilir. Asm kullanarak optmize ettiysek bunun daha da üstü olamaz. Işık hızı geçilemez....








mesaj birleştirme:: 01 Kasım 2013, 15:40:41

Alıntı yapılan: gerbay - 01 Kasım 2013, 15:21:29

:)

hocam hazır yazılmışı elinizin altında var. tekrar bir şey yazmaya gerek yok.

keil ın içinde /ARM/Examples/DhryStone

dizinine bakın...

şu dokümana da bir göz atın;

http://infocenter.arm.com/help/topic/com.arm.doc.dai0273a/DAI0273A_dhrystone_benchmarking.pdf



mesaj birleştirme:: 01 Kasım 2013, 15:22:17

haaa, bu arada; o kod C ile yazılmış..

Hemen bakalım hocam.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

@Gerbay

Verdiğin linteki dokumana baktım fakat araya giren işler yüzünden şu saate kadar meşguldüm. Programa sadece üstün körü bakabildim.

Bir verilen örneği bir de sıradan fakat iyi kodlanmış ve bir amacı gerçekleştiren C kodunu derleyip bakacağım.

-----------------------

Her derleyiciyi Hitech mi sandın derken?

Bu durumda Hitech'i eleyebiliriz. Bu derleyicide çalışanlar optimizasyon vs konularında ASM dendiğinde atıp tutmasınlar.



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

z

Hocam ben bu verdigin Dhrystone ornegini hic begenmedim.

Alıntı yapılan: gerbay - 30 Ekim 2013, 16:28:47
.......hiç düşündünüzmü Cortex-M0 lar 0.9 MIPS/MHz ken Cortex-M3 ler nasıl oluyor da 1.25 MIPS/MHz olabiliyor..

pic mi kullanacaksınız, pic32 ler 1.65 MIPS/MHz,
avr mi kullanacaksınız, avr32 ler 1.38 MIPS/MHz.......

Bana ustte dedigin gibi mesela C ile yazacagin program, CM3 islemci icin ise yarayan (ne bileyim ledleri yakip sondursun yada  hesap yapsin yada bir sey yapsin) su 1.25 MIPS/Mhz performansa bir ulassin.

Senin icin zor olmasa gerek.

Yoksa burada 1.25 Mips/Mhz derken yanlis mi yazdin?  1.25 DMips/Mhz mi demek istiyordun?



mesaj birleştirme:: 02 Kasım 2013, 00:38:35

Cunku benim MIPS/MHZ den anladigim

Her 1 Mhz basina 1 milyon islem yapabilen islemci 1 MIPS/Mhz demektir.

CPU 4 cycle de 5 komut islerse bu 4 clk zaman araligi icin islemciyi 1.25 MIPS/MHZ de kullanmis olur. 

Boyle bir durumun CM3 islemcide olmasi mumkun gorunmuyor.

Eger boyle ise DMIPS/MHZ ile beni kandirdin. DMIPS'in cok cok farkli bir anlami var ve ne oldugunu bilmek istemiyorum.

Bu 1.25 orani ile kafami cok karistirdin.

Yok eger 1.25 orani icin gercekten bir yontem varsa C derleyici yazarlari bu orani yakaliyorsa benim de yontemi ogrenip yakalamam lazim.

Yontemini goremedim bilmiyorum. Bugune kadar hedefim 1 oranina yaklasmakti.

http://www.arm.com/files/pdf/CortexM3_Uni_Intro.pdf
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tyildizak

Alıntı yapılan: z - 02 Kasım 2013, 00:15:32

Cunku benim MIPS/MHZ den anladigim

Her 1 Mhz basina 1 milyon islem yapabilen islemci 1 MIPS/Mhz demektir.


Hocam MHz zaman birimi değil, dolayısıyla "MHz başına" ifadesinde sorun var. Dolayısıyla "MIPS / MHz"de  de öyle.

Biliyorsunuz, MIPS zaten 1 milyon komut / saniye gibi bir oran belirtir.

MIPS / MHz ise ,  "1 milyon işlem / saniye / MHz"  gibi birşey olur.


trgtylcnky

#50
Zaten C derleyicisi ASM kodu üretmiyor mu? Optimizasyon yapıldıktan sonra C kodunun hala daha hızlı olması bence imkansız.

blacklogic

Konunun dışında belki ama meraktan soruyorum, 1 clock darbesinde işlenen komut 1 asm komutu mu oluyor? Ayrıca şu mips olayı hakında bi açıklama yapabilir misiniz? 1.5mips/mhz dediğinde saniyenin milyonda birinde 1.5 komut mu işlemiş oluyor?

z

Alıntı yapılan: tyildizak - 02 Kasım 2013, 02:59:37
Hocam MHz zaman birimi değil, dolayısıyla "MHz başına" ifadesinde sorun var. Dolayısıyla "MIPS / MHz"de  de öyle.

Biliyorsunuz, MIPS zaten 1 milyon komut / saniye gibi bir oran belirtir.

MIPS / MHz ise ,  "1 milyon işlem / saniye / MHz"  gibi birşey olur.

Haklisin ifade ederken hata yapmisim. Isin ozu, cycle basina islem sayisi diyeyim. Paralel isler yoksa en ideal durum 1.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

rree

                        Her komutun kaç clock harcayı komuta göre değişir. Pic 16 da mesela movwf  1  clock   goto komutu 2 clock.

Burda neyi tartışılıyor anlamış değilim!!
                 C ile program yazdın asm listesine bak fazla kod mu üretmiş  aç bir asm bloğu  asm kodlarını yerleştir.Fonksiyon çağrısdamı zaman harcıyor geç macro asm c içinde tanımla olsun bitsin.Bence  macro asm = asm  .Şunu diyebiliriz mikro işlemcinin mimarisi ve nasıl çalıştığını anlamak için asm öğrenilir. Ondansonra program yazmak için bir üst dile geçmek lazım. Yoksa fonksiyon kütüphane dediğimiz destekten yoksun bir derleyici ile  ine ile kuyu kazmak. Ben ilk önce asm yi öğrendim sonra proton baziğe geçtim, Şimdi ccs kullanıyorum. Yüzde 90 problemleri çözebiliyorum.

z

Gerbay hocam

CM3 paralel islem yapan uniteye sahip değil.

3 asamali pipeline mekanizmasinda

erisim yapan birim 1 tane
decode eden birim 1 tane
execute eden birim 1 tane.

Linkini verdigim dokumanda 27 sayfada CM3 icin decode ve execute eden birimde bazi paralel bloklar var.

http://www.arm.com/files/pdf/CortexM3_Uni_Intro.pdf

Fakat bu birimler pipeline blogunda 3 Cycle'dan fazla zaman alan komutlarin  ortalamasini 3 cycle yapmaya yonelik. (Sayfa 31) Zira 4 cycle'a cikan komutlar pipeline senkronizasyonunu bozmadan (1/3 oranina sadik kalacak sekilde) islemeyi sagliyor.

DMIPS/Mhz olayi kandirmaca kokuyor.

Cunku DMIPS=Dhrystones per scecond gibi bir ifade uzerine kurulu. Buradaki Dhrystones'un MCU komutu olmadigi belli.

Eger paralel islem olmasi gerekiyorsa pipeline asamasinda ayni sutunda iki execute, yada decode asamasinda 2 decode islemi yapilabilmesi lazim. Fakat hep capraz durumdalar.

Verilen orneklerde CM3 ve altini konusursak memnun olurum.

Cortex M0 ile pes pese 1 cycle komutlari ard arda dizersem 1Mips/Mhz oranini tuttururum değil mi? Ama Aadamlar 0.9 Mips/Mhz yazmislar. Neden? Cunku gene ne zikkim bir tanim ise DMIPS de ondan. Bu da beni hic ilgilendirmiyor.

Eger C/ASM nin MIPS acisindan tartismasi yapilacaksa basindan beri dedigim sekilde bir ornek vermeniz lazim. (Ne cok cok kisa ne de uzun bir program ornegi)

DMIPS vs testleri dillerden ziyade farkli islemcilerde belli bir test programini kosturup  MIPS/MHZ oranini arastirmaya yonelik. Komut kalitesi yuksekse bunun 1 uzerine cikmasi normal. Fakat bu degere bakip 1 cycle da 1 den fazla komut paralel isletiliyor anlami cikatilamaz.

Mesela test programi  128 bitlik sayilarin carpimina yonelik olsaydi, bu testi ard arda 1000 kere yaptirsaydik,

bu test X saniye surseydi, F de MCU clk frekansi olsaydi  atiyorum X/F gibi oranlara  bakarak yorumda bulunabilirdik. Fakat buradaki orana bakip da islemci paralel islemler yapiyor sonucuna ulasmazdik.

Zira bu oran DSP ve ARM islemcilerde cok buyuk cikarken 8051 ve PIC serisinde yerlerde surunecekti.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

#55
Alıntı YapEger C/ASM nin MIPS acisindan tartismasi yapilacaksa basindan beri dedigim sekilde bir ornek vermeniz lazim. (Ne cok cok kisa ne de uzun bir program ornegi)

sayin @z EEMBC'nin CoreMark benchmarki gomulu sistemler icin ve daha gunceldir. C kodunu web sitesinden indirebilirsiniz.

Sizde bu benchmarkii ASM ile yaziniz ve ayni platformda run ediniz, sonuclara bakiniz tartismada sonuclansin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Bu tartismanin ilk mesajimdaki sinirlarini 9 soru ile cizdigim alandan buraya gelmis olmasindan rahatsiz değilim. Tartismada CM3 islemcide karsima 1.25MIPS/Mhz oranini yakalamaktan ve bu orani asm ile yakalayamayacagimdan, asm ile yazarsam C den daha da kotu sonuclar elde edilecegimden bahsedildi.

Ben 1.25 oranini yakalamayi bilmiyorum. 1'e yakin kodlama yapmaya calisiyorum. Dolayisi ile ornek kod veremem. Ama aramizda 1.25 oranini yakalayacak adam varsa ciksin yazsin diyorum.

Eger ogretirseniz bundan sonraki CM3 asm kodlamalarimi 1 in ustune cikartmaya calisirim.

Verdiginiz linkte gene tartismamizla bagdasmayan CoreMark/MHz=1.91 orani verilmis. (STMicroelectronics STM32 90nm ) Bunun anlami da MIPS/Mhz olmasa gerek.

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

mufitsozen

Alıntı yapılan: z - 02 Kasım 2013, 13:15:12
Bu tartismanin ilk mesajimdaki sinirlarini 9 soru ile cizdigim alandan buraya gelmis olmasindan rahatsiz değilim. Tartismada CM3 islemcide karsima 1.25MIPS/Mhz oranini yakalamaktan ve bu orani asm ile yakalayamayacagimdan, asm ile yazarsam C den daha da kotu sonuclar elde edilecegimden bahsedildi.

Ben 1.25 oranini yakalamayi bilmiyorum. 1'e yakin kodlama yapmaya calisiyorum. Dolayisi ile ornek kod veremem. Ama aramizda 1.25 oranini yakalayacak adam varsa ciksin yazsin diyorum.

Eger ogretirseniz bundan sonraki CM3 asm kodlamalarimi 1 in ustune cikartmaya calisirim.

Aramizdaki en iyi ASM bilen sizsiniz. Size daha iyi ASM yazmayi gosterecek birisi olmadigina gorede konu kapatilabilir.

C bilenler C ile ASM bilenlerde ASM ile calisirlar.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Hocam ASM yi en iyi bilen değilim. Oyle bir iddiam ve amacim da yok.

C kodlarinin derlenmis hallerini inceleyerek asm konusunda yeni yeni seyler ogreniyorum. Bana asm ile ornek verilmesini degil de C ile 1.25 oranina cikilan ornegi istiyorum. (ASM sini cekip cikartabilirim)

Anlasilan  bilmecemi sevmediniz.


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

hasankara

ben bulmacanızı sevdim sayın @z güzel şeyler öğrendiğimi düşünüyorum. özellikle mips ve arm konusunda fazla bir bilgim yoktu. üstü kapalı şeyler biliyorduk en fazla. bunun sebebini arm tabanlı mikrodenetleyiciler le çalışmamış oluşuma bağlayabilirim. stm32f407 dicovery kit le c de biraz kurcaladım ama pipeline dolaylarına fln hiç girmedim. pic de sanırım risc mimarisinden gelen bir durum ki 4 cycle de 1 komut bazı komutlar 8cycle da oluyor hatta, standart bir durum olduğu için en fazla buralara kadar inebildik. birde pic32 de pipeline varmış ama ondada yazdığım c kodlarının asm sinden hiç birşey anlamadım desem yalan olmaz sanırım.

arm tabanlı denetleyicilerinde asm kodları olarak pic deki komut yaz geç değilde bir işi yapmanın pic asm e göre çok daha fazla yolu olduğunu vurguluyorsunuz anladığım kadarıyla. bu sebeple c derleyicilerinde her zaman fazlalık kod bulmanın mümkün olduğunu vurguluyorsunuz.