Bilmece Bulmaca ASM ile yapabilmece ama C ile yapamaca

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

z

Hocam benim yaptığım çıkarımım CM3 ler paralel işlem yapamıyor.

Yoksa ARM işlemcilerin yada diğer firmaların paralel işlem yapan işlemcileri muhakkak var. I7 dediğinizde tepki vermemin sebebi de buydu zaten.

Bugüne kadar 1.25 oranına hep acaba diyordum. Buradaki 1.25 Mips/Mhz le aslında anlatılmak istenenin 1 clk da birden fazla komut işletilerek bu orana çıkılmadığını anlamış oldum.

Verdiğin DhryStone dokumanını ilk kez inceleme şansım oldu.

Sonuçta farklı frekanslarda farklı komut kümelerinde yüzlerce işlemci var. Bunlara öyle bir test programı (Program belli) koşturalım ki MIPS ve MHZ den bağımsız bir oran elde edelim demişler.

Bütün olay bundan ibaret. Dolayısı ile 1.25 oranı bu başlık altındaki tartışma açısından aldatıcı, reklam kokan bir değer.

Eğer haklı isem tartışmaya kaldığımız yerden devam edebiliriz.

Kaldığımız konu;

Lokal kazanılan zaferlerin savaşı kazanmaya yetmeyeceği konusu.

C fonksiyonlarının altında (program demiyorum C nin temel komutlarının asm kodlamasından bahsediyorum) mükemmel ASM kodlama olabilir. Fakat bunları uç uca bağladığımızda mükemmel asm koda ulaşırmıyız?

Elbette hayır. Bir programın bir kısmını mükemmel güzellikte ASM ile kodlasak mükemmele ulaşırmıyız elbette hayır.

En son buralarda kaldık.

Eğer Mips/Mhz oranı için hatam varsa söyleyin. Bu oran yerine eğer paralel işlem yapabilen işlemcilerden bahsetmeyeceksek, istruction per cycle IPS bizim için aldatmacasız reklam kokmayan daha doğru  bir değer.

Komut kümesi karmaşıklaştıkça hele hele paralel işlemler gündeme gelirse ASM yazım zorlaşır. Eğer bu işlemcileri kullanırmısın diye sorarsan hayır derim. Nedeni böylesine işlemcilere ihtiyaç duyacak elektronik projeler ilgi alanımın dışında. Bu konular bilgisayarcıların işleri. (Görüntü işleme, Tıbbi görüntüleme, Radar yazılımları vs vs)

Ha eğer ki kullanmam gerekirse C tercih ederim. Fakat bu ASM ile hiç yazamayacağım anlamına gelmez. Sonuçta insan zekası en azından şimdilik makineden üstün vaziyette.

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

Sanayide çimento kamyonu üreten bir adamla tanıştım. Çimento tankeri silindirik değildir. Dikkat edin garip bir yapısı var. Adam bunu üretiyor. Kalın demir saçı 10mm falandı galiba kesmiş biçmiş büküyor
kaynatıyor ve o şekil oluşuyordu.

Adamın eğitimini sordum. Bilgisayardamı tasrladın vs sordum. İlk okul mezunu bile değilmiş. Bilgisayardan B sinden haberi yok.

Ama insan. İnsan zekasına sahip....


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

hasankara

#61
@z en son yorumunuzda ki paralel işlemlerden kastınız nedir? 1.25 mips/mhz dediğiniz mevzu da ki bir saykıl da birden fazla asm komut işlemi yapabilme kabiliyetimi yoksa daha üst katmanlar yani yazılımsal olarak görevleri işlem adında gruplandırarak bu işlemlerin birbirlerine göre paralel yürütülme konusundan mı bahsediyorsunuz?

z

@Gerbay

Sen iddia ediyorsun ben de kod parcasiyla ispat et diyorum.

Yaniliyor olmayi cok istiyorum. Isin aslini bilmiyorum. Fakat cok guvendiginiz C derleyicinizle bize bir ornek sunabilmeniz lazim.

Ben olsam simdiye kadar on kere kod yazar verirdim.

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

CM0 da pes pese tek cycle komut isletttigimde neden  1Mips/Mhz olmuyor onu acikla bari....

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

Benim istedigim alti ustu 5 asm komutluk bir ornek. Bu 5 komutu 4 cycle da isleteceksin. Hepsi bu. Vazgectim ise de yaramasin. Abuk sabuk is yapsin.

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

speak48

 1 in üstüne nasıl çıktığını değilde nasıl altına indiğini açıklayabilirim.
pipeline yapıyı bozan en önemli instructionlar branch instructionları.
eğer birden çok gelişmiş dallanma tahmin edicisi yoksa.
alınan komutlar yanlış dallanmadaysa tüm pipeline işlemi iptal edilip dogru dallanmaya geçilir.
buda  çalıştırlan kodlarda azalmaya neden olur. dmips/mhz oranı 1 in altına düşer.
0.9 dmips /mhz oranı net bir rakam değildir oluşan hatalı dallanmalar sonucu düşen ortalama değerdir.

z

CM3 ailesinde branch komutu her zaman pipeline'i bozmuyor. CM0 dan en buyuk ayricaliklarindan birisi bu zaten.
Kaldiki 1 cycle komutlarin arasina 2 cycle komutlar koydugunuzda ortalama hemen 1 ina ltina iniyor.

Gerbay yada bir baskasi 1 in ustune cikan ornek versin ellerinden opecegim. Ufkumuz genislemis olacak.

Diyelim ki verdiler ufkumuz genisledi.

Tartisma bitmeyecek.

Ne demistik bir cephede kazanilmis zafer tum savasai kazanmaya yetermi? Yetmez sadece ozel durumlarda yeter. 1.25 orani toplamda 100lerce byte olan kod parcaciginda ne kadar alanda kendini gosterecek?

Neyse o kisimlara gelmedik henuz.

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

Anladigim kadariyla dokumanlarda bazen Dmips/Mhz yerine  Mips/Mhz yaziyorlar. Gerbay da bunun birden buyuk oldugunu gorunce islemcinin paralel islem yaptigi seklinde yorumluyor.

Ama Insallah ben haksiz cikarim.

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

Yuunus

   "Z" hocam, sanırım gerbay dediğiniz hızı yakalayacak bir örnek hazırlıyor yoksa çoktan kırk tane örnek yazardı. Ayrıca Tartışma da çok faydalı, en azından şahsım adına C ile asm arasında uçurum varmı onu göreceğim. Birde "Z" hocam yazdığının kodun  hızını nasıl göreceksiniz yani nasıl ölçeceksiniz Analyzer filan mı kullanacaksınız?

RaMu

Hocam gerbayın dediğine bende rastlamıştım
ama tam tersi konuda, c derleyicisi bunu yapıyorda değilde
pic32 için asm kod yazma arayışındayken,
hatta konusunu burada açmıştım yine ne işin var c ile yaz kafayımı yedin denmişti zaten,
hoş ben ne pic32 ile uğraşmış oldum nede pic32 asm ile arm a bakmaya başladım c ile.
Ama pic32 için asm toplama çıkarma yfak tefek işler yapan örnek kod yazıp derlemiştim,
bu sırada komut setini incelerken bahsedilen olay dikkatimi çekti,
net hatırlamıyorum ama şöyle şeylerden bahsediyordu,
işte bu komutdan sonra şu komut kullanılırsa komutlar beraber (execute) işlenir gibi,
yani gerbayın dediğini asmde yapmakta çok sıkıntılı bir iş değil aslında
derleyicininde bunu yapabilmesi hiç zor değil zaten
belli komutlar var peşisıra gelince bu durumu sağlayacak
ve o komutlarında neler olduğu komut setinde belirtilmiş durumda,
bu iş-konu uzarsa ben birara yazdığım alıştırma asm kodları hatırlamaya ve
aynı örneği yine pic32 için mikroc de yazıp asm çıktısına bakmaya çalışırım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

Kod parcasini bir kac yuz yada bin kere donguye sokup scopla bir pinden cikartacagimiz sinyalin frekansina bakariz yada komutlara paralel olarak donanima ait counteri saydiririz. O kismi cok dert degil.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Hocam orda sozu edilen paralel islemler kelimesi cok elastik. Adigecen paralel islemleri, MCU komutlari paralel isliyor diye yorumlamak dogru değil. (Bunu destekler net ifadeler yok yada ben goremedim)

Bir komut alt seviyede mikrokomutlardan olusur. Bu komutlari bizim kullanma sansimiz yok. Islemci bunlari paralel kullanilabilir. Fakat biz bu mikro komutlarin sonucuna bakariz.

CM3 ASM kitapciklarina bakiyorum paralel islemeye dair tek bir aciklama bulamadim.

Sadece Nop icin soyle bir ibare var. Nop komutu fetch, decode islemine alinir fakat execute islemi yapilmaz deniyor.

Pes pese noplardan olusan  kod parcasi bile 1 oraninin ustune cikamiyor. Cunku sadece execute fazi iptal oluyor. Tam bu esnada bir onceki komut decode islemine baslamis oluyor.

Bir de Multiply komutlarina bakmak lazim. Bu komut ALU'dan bagimsiz ayri bir blokda ele aliniyor.

Fakat diyelimki bir sekilde 4..5 komut icin 1.25 oranina ulastik. Bu orani pes pese ne kadar tutturacagiz ki ortalama 1 den buyuk olsun.

Imkan ve ihtimal yok gorunuyor. Bahsettigin paralel islemler sayesinde su anki 1 ve 2 cycle komutlara ulasmis olmalilar. Aksi takdirde ASM kitapciklarinda bu durumlari mansetten verirlerdi ama yok. Kelimesi yok.

Pipeline uzerinde islem yapan komutlar bile sistemi yavaslatmaya yonelik.

Sen uretici olsan bu tip durumlari ASM dokumanlarda aciklamazmiydin. ALU unitesinde pipeline penaltilarin olmadigi bile yazilmis ama her ne hikmetse paralel islenebilen komut diizlislerine hic deginilmemis.
M0'lardan farkli olarak Branch komutu icin yapilan iyilestirmeden sozediliyor o da pipeline iceriginin bazen bosaltilmayacagina yonelik.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cicjoe

Bu pipeline hazards olayina ben de takilmistim.. CM0 icin definitive guide'i okurken, kodlara baktim, dumduz yazilmis gibi geldi.. Ders notlarimi actim baktim, oyle olmamasi gerekiyor diye dusundum.. Biraz nette arastirdim, Forwarding, Interlock gibi tekniklerle bunlari donanimda hallediyormus sanirim.. Ben de olayin asm kismina cok takilmayip, C uzerinden devam edeyim dedim ama hala ne tur sikintilar oldugu konusunda bilinmezler icindeyim.. Bu baslikta konusu acilmisken belki hocalarimiz bu konuda bize aydinlatir, soru isaretlerimiz silinir =)

z

Eger kullandigin islemcinin pipeline bufferinda isleme alinacak sirali komutlar, sirf bu siralamada olduklari icin isletim cip ureticisinden kaynaklanan hatalar yuzunden hatali sonuclar uretiyorsa boyle islemcilere ASM ile kod yazmak cok daha fazla efor iseter.

Bu tip cipher genellikle revizyondan gecirilir ve sorunlari kaldirilir.

CM0 ile hic calismadim. Fakat TI DSP lerle calisirken pipeline conflict olaylari mevcuttu.

Yasanan sorunlar kisaca su sekilde oluyor.

Pespese isletilecek komutlarda ilki ornegin A=B+C islemini, ikinci komut ise D=A+X islemini yapacak olsun. (Burada sozu edilen islemler register/memory uzerinde olabilir)

Eger 2. komut execute asamasina geldiginde henuz ilk komutun sonucu A alanina yazilamiyorsa bu durumda 2 komut hatali islem yapar.

Bu durumda yazilimcinin yapabilecegi tek sey bu iki komut arasina duruma gore bir yada daha fazla NOP komutu  koymak olacaktir.

Yada bu iki komut arasina daha alt satirlarda isletilecek komutlardan birisini (benzer tehlike olusturmamali) tasimak olacaktir.

ornegin

A=B+C
D=A+X
Y=Y+1

gibi komut dizilisinde ilk iki komut pipeline da hatali sonuca neden oluyorsa

A=B+C
NOP
D=A+X
Y=Y+1

yada daha iyisi

A=B+C
Y=Y+1
D=A+X

Bu tip hatali durumlarla karsilasildikca uretici erreta listesinden durumu duyurur ve cozum onerisini de getirirdi. Kisa bir sure icinde de C ve ASM derleyiciler revize edilirdi.

Dokumanlarda bu tip konularin ele alindigi satirlarda C kullaniyorsaniz sorun yok fakat "pure asm" kodlama yapiyorsaniz su su durumlara dikkat edin uyarilari yer alirdi.

Isin guzel yani asm yazarin bu tip durumlari surekli olarak hatirlamasi zor oldugundan asm programimizin basina  bir satir (direktif) ekler, derleyici bu satiri gordugunde, eger yazdigimiz kodlarda pipeline da sorun olusturacak komut dizilisi ile karsilasirsa o satirlara otomatik NOP ekler ve uyari  verirdi.

CM3 de bu tip sorunlardan hic bahsedilmedigi icin ASM yazimda bunlara kafa yormak gerekmiyor. Eger cok sayida bu tip durumlar olsaydi asla bu ciple calismak istemezdim.

Asagidaki iki dokumani sizin icin arastirip buldum.

http://courses.cs.washington.edu/courses/cse378/09au/lectures/cse378au09-15.pdf

http://coitweb.uncc.edu/~abw/ITCS3182F09/slides11.pdf

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

z

Kendimce ulastigim sonuc asagidadir.

Farkli frekans, farkli mimari, hatta farkli bit uzunluklarindaki islemciler icin Bulent adini verecegimiz bir test programi yazalim.

Bu testin amaci ramdaki 16 bitlik iki sayiyi toplamak ve geri yerine yazmaktan ibaret olsun.


1. islemci 8 bit 28 Mhz, rama erisim 2 cycle ve toplama tek cycle olsun.

ROKU   A, ADR1L
ROKU   B, ADR2L
TOPLA  C, A, B
RYAZ    C, ADR3L

ROKU   A, ADR1H
ROKU   B, ADR2H
TOPCA  C, A, B
RYAZ    C, ADR3H

en optimzie kod olsun.

2. islemci ise 16 bit islem yapma kaabiliyetinde tum komutlar tek cycle ve islemci frekansi 4 Mhz olsun.

ROKU   A,ADR1
ROKU   B,ADR2
TOPLA  C, A, B
RYAZ   C,ADR3

Bu iki islemcinin Bulent adini verdigimiz test sonucu BMIPS/Mhz ile belirlensin.

1. islemci sonuca 14 cycle da ulasirken
2. islemci sonuca 4 cycle da ulasir.

BMIPS saniyede 1 milyon tane 16 bit toplama anlamina gelecektir.


1. islemci 8 komutla bu isi yaparken 2. islemci bu isi 4 komutla yapmaktadir.

1. islemci (1/14) * 28E6 dan saniyede 2 milyon Btesti yapar. Yani 2BMIPS/1E6 dan 2 gibi bir performans sergiler.

2. islemci (1/4)*4E6 dan saniyede 1 milyon B testi yapar. Yani 1 BMIPS/1E6 dan 1 performansinielde eder.

O halde  B testinde  1. islemcimiz 2. islemciden daha basarildir. (Neden 1Mhz'e boldum?)

Bir tablonun tepesine Bulent testi basligini yazar, islemcileri  alt alta yazar karsilarina da MIPS/MHz (Bmips/MHz) degerini yazarsak degeri yuksek olanlar bu testte daha basarilidir sonucuna ulasiriz. Bazi islemcilerde bu deger 1 den buyuk bazilarinda 1 den kucuk olacaktir.

Performansi 1 den buyuk olanlar bu testte basarili olanlardir. Fakat bu sadece bu test icin gecerlidir ve bir baska program parcaciginda dengeler degisiverir.

MIPS/MHz degerine bakip da bu islemci paralel islemler yapabiliyor buna ASM ile kod yazarsan bu paralellik durumlarini kafanda canlandiramaz C den daha az performansli kod yazarsin sonucuna ulasamayiz.

Kaldiki C,  hafizasinda sakli hazir ASM sablonlar kullanir. Bilgisayar sadece burada kullanilacak registerlerin ne olacagina karar verebilir.

Yoksa hic bir bilgisayar yazilimi + isaretini gorunce haa yuzlerce ASM komutundan ADD komutu bu ise yarar zekasina sahip degildir. Sonucta el oglunun yazdigi ASM sablonlari kullaniyor.

Buradaki BMIPS/MHz degerini kullanarak reklam yapabilirim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Hocam ortalamayi 1 den yukari cikartmaktan bahsediyorsak ornek ornek diye yalvariyorum.

Daha ne diyeyim?

Farkli mimarilerle isimiz yok. Cortex M3 de  paralel islemler yaptirin yeterli.

Neden CM3 icin paralel calismaya yonelik internette tek bir asm ornegi goremiyorum? Neden kitaplarda bu konuya deginilmiyor.?

Tek aciklamasi var yok boyle bir sey. Olay tamamen bir ust mesajda kurguladigim gibi. Reklam reklam reklam.

Dikkat edersen kurgum cok cok farkli islemciler icin iyi/kotu karari vermeye yarayabilir. Fakat aldatici bir sonuc.

Cok sik kullanilan islemlerle bu testin daha karmasigi yapilabilir ve ortaya daha az aldatici sonuclar cikabilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Alıntı yapılan: gerbay - 03 Kasım 2013, 14:49:14
Adam aynı clock saykıl da hem code hem de data fetch edebildiğini yazmış. Tekrar bekleyecekse niye aynı clock da fetch etsin ki.

Ayni cycle'da koda ve dataya ulasabilmek ne avantaj saglar? Bu hangi asamada yapiliyor cok onemli.

Pipelineda kuyruga giren komutlarin siralamasina bakarsak 1. komutun execute asamasinda 3. komut prefetch asamasinda oluyor.

Bunun anlamlarindan birisi 1. komut rama ulasirken 3.komut ayni zaman diliminde komuta (Flasha/PFUya) ulasiyor. Bunda garipsenecek bir durum yok.

Bu tur paralel (komut bazinda değil mikro komut bazinda) islemler stall durumlari olusturmadan kodlarin akisina izin veriyor.

Fakat stall durumundan her zaman kacilamiyor. (Neyseki bu durumlari donanim kendi hallediyor aksi halde asmcinin isi  cok zordu)

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

Sayfa 28....31

Bahsettigin ayni anda hem kod alanina hem de ram alanina erisilemezse zaten bu islemci 1 yada  2 cycle da bu islerin altindan kalkamaz ki.

Alıntı Yaphttp://www-micrel.deis.unibo.it/LABARCH/slidecorso2013/04-Buses.pdf

Hocam  bak, adam paralel load/Store yapabileceğini ifade etmiş

Verdigim dokumanda zaten bu durum var. 2 cycle suren komut, bahsettigin erisim sayesinde 2 cycle da yapiliyor. Eger yapamazsaydi bu komutlar 2cycle değil  3 falan olacakti.

Hic bir sekilde kodlar ust uste binip te performansi artirmiyor.

Ama sunu duymak istiyorsan soyleyeyim.

Paralel komutlar yurutulen islemcilere asm yazmak tam bir iskence olur. Ama yazamam demiyorum. Cunku elin oglu bunlara C derleyicisi yazdiysa demekki asm kodlar da yazmis demektir. Onlar asm yaziyorsa ben yada bir baskasi da yazabilir.

Ama ugrasmakdan keyif alirmiyim bilmiyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cicjoe

Aciklamalar icin tesekkurler hocam..

http://s3.dosya.tc/server12/nJXROw/ARMProcessorArchitecture.ppt.html
access.ee.ntu.edu.tw'den indirdim

Bu dokumani biraz inceledigimde soyle bir yargiya vardim. Bahsettiginiz gibi
A=B+C
D=A+X
Y=Y+1
seklinde yazdigimiz zaman, donanimsal olarak Forwarding yapiyor, hazard olusturacak komutun execution bolumunu erteliyor diye anladim.
O zaman ben pipeline yokmuscasina, yani daha sonra kodu duzelttiginiz haline cevirmek icin ugrasmasam, hatali sonuc almadan, sadece zaman kaybetmis olurum gibi geldi. Eger oyleyse, korkmadan asm ile de kod yazabilirim.. Cunku gozden kacirip hata yapmak cok onemli ve basit iken, sadece birkac cycle kaybetmek ayni derece onemli degil benim icin.. Yeterki sonuc dogru ciksin..