» »

Digitalna evolucija

Digitalna evolucija

««
5 / 29
»»

OwcA ::

Thomas: ali si kdaj poskusil kako se Critticall obnese v primerjavi z enim agresivnim vektorskim prevajalnikom kot je recimo Intelov C++ Compiler 7. Bolj kot gledam tole kodo, bolj se mi zdi, da prevajalniku ne ostane kaj prida za optimizirati. Kar niti ne bi bil tak problem, če ne bi prevajalnik znal stvari, ki jih Critticall ne, kot je naprimer določanje kje se hrani kak podatek, paralelizem, posebni ukazi odvisni od procesorja ... Ne me narobe razumeti, ne mislim primerjave med bubble sortom in Critticallovo optimizacijo, ampak med recimo quick sortom ali heap sortom z agresivnimi optimizacijami in izkoriščanjem prekaljenih knjižnic in nečem kar izpljune Crittical.
Otroška radovednost - gonilo napredka.

darkolord ::

Thomas: a ta program kodo skompila in jo poganja, da izmeri tole al kako?

Thomas ::

Samo randomu. To je placentni sesalci se v Avstraliji niso razvili. Treba dostikrat probat, na večih celinah! :D

Se pa splača zmanjšati zgornjo mejo 10 krat in nekaj 10 krat prej bomo prišli do rezultata.

Sieve kot je v vgrajenem primeru ... tudi ni za odmet.

:)
Man muss immer generalisieren - Carl Jacobi

Thomas ::

@OwcA

Agresivni prevajalnik ima potem še zmerom možnost, da (dodatno) naredi, kar največ zna.

Tukaj ne gre za optimizacijo kode, pač pa algoritma. (Dodatno) optimizacijo kode pa v vsakem primeru prepuščamo compilerjem.

@darklord

Critticall naredi neko transformacijo kode v neke številke in iz njih vse izračuna.

:)
Man muss immer generalisieren - Carl Jacobi

darkolord ::

aha samo potem je ta izracun _zelo_ relativen?

OwcA ::

@Thomas:
Agresivni prevajalnik ima potem še zmerom možnost, da (dodatno) naredi, kar največ zna.

Tukaj ne gre za optimizacijo kode, pač pa algoritma. (Dodatno) optimizacijo kode pa v vsakem primeru prepuščamo compilerjem.

To vem. Ampak čimbolj specifično in "čudno" (torej takšno, katere pomena sam ne zna razbrati) kodo imaš tem manj bo postoril prevajalnik. Če ne ve kaj naj bo vedno na stacku in kaj ne, ne bo dal ničesar, ali pa bo skušal preveč optimizirati (naprimer z odstranjevanjem blokov kode ali "podvojenih" ukazov) in potem ne bo nič delalo. Nakar je potrebno vložiti veliko časa, da se mu dopove kaj ja in kaj ne, kar je ravno nasproto od tega kar skušaš doseči s Critticallom, hitrer razvoj kompleksnih algoritmov. Če prav razumem se Critticall loteva optimizacije na podoben način kot večina prevajalnikov. Zmanjšati skuša število osnovnih ukazov izvedenih v enem prehodu. Prevajalnik ima tu to prednost, da ve kaj koliko stane na danem procesorju in lahko naprimer prilagaja poravnavo podatkov (data aligment). Res, da bi lahko to prevajlnik storil tudi po tem, ko s kodo opravi Critticall, ampak kot sem že omenil obstaja nevarnost, da je taka koda za prevajalnik nerazumljiva (morda bi se lahko Critticall naučil v kodo tlačiti še kake #pragma ;) ).
Otroška radovednost - gonilo napredka.

Thomas ::

@darkolord

Izračun je popolnoma pravilen, v smislu, koliko korakov se izvrši.

Tako kot se algoritmi edino morejo primerjati.

Kako pa izgleda stvar potem v tem ali onem procesorju ali mikrokodi, je pa stvar compilerjev in njihovega poznavanja procesorskih ukazov, koliko prvo in drugo nivojskega cachea ima, kako hiter je RAM ...

To je pa že en drug layer. Kar je pa že tudi odgovor, ki bi ga hotel imeti OwcA.


Samo ni pene. Intel (AND) mi da par milijončkov, pa mu povem, kako se zadeva naredi še za direktno optimizacijo njihovih kebrčkov. :D


Sem imel tole na assembler nivoju že leta 1998. Samo da je bil assembler en tak bolj čuden in smo potem rezultate prevajali v C++.

:))
Man muss immer generalisieren - Carl Jacobi

Thomas ::

@OwcA,

Jest mislim, da Critticall koda je compilerju čisto razumljiva. Je pa hitro nerazumljiva ljudem.


:)
Man muss immer generalisieren - Carl Jacobi

CaqKa ::

nerazumljiva ljudem..
da da :)

a da kdo kodo za heap sort in quick sort?

darkolord ::

Hja sam če se manj korakov izvrši, še ne pomeni, da je koda hitrejša... :\

Thomas ::

@darkolord,

Če so linije tiste, ki jih zgenerira Critticall, boš zelo težko našel primer, kjer ni tako. Sploh če bo razlika v številu izvedenih linij znatna.

:)
Man muss immer generalisieren - Carl Jacobi

jeti51 ::

Okej, po prespani noči, kaj pogrešam?
Pogrešam funkcijo abs() in bitshift v levo in desno (čeprav se da tudi simulirati z večkratnim množenjem/deljenjem z 2). Predlog za prihodnjo izboljšavo (poleg seveda floata in ostalih zadev:D).

Thomas ::

ABS se zaenkrat nadomešča z - operatorjem, če je število manjše od 0.

Bit shift pa z množenjem/deljenjem s potencami števila 2.

Zaradi tega zadeva ni povsem optimalna. Vendar je napaka majhna in še ta BO odpravljena.

Največjo prioriteto ima pa zdaj nek "primer.c", ki celo stvar postavi v povsem novo luč. Kot bi obarvali ČB sliko. ;)

Več o tem zvečer.
Man muss immer generalisieren - Carl Jacobi

Sergio ::

Hm. Tale isprime.c, ki si mi ga pomagal napisati, me malo skrbi. Kaj če Critticallu nastopi taka mutacija, da bo vrnila "po naključju" vse prave vrednosti (torej tabelo prvih 1000 praštevil)? Kako _veš_, da je zadeva reprezentativna? ;)
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Thomas ::

Samo vprašanje časa je, kdaj se bo program skrčil na naštevanje praštevil do 1000.

ČE je to tisto kar hočeš vedeti. IN ČE je to najbolj optimalno.

Če pa boš napisal tak program za sito, ko je sieve.c iz primerov, ki ima variabilno zgornjo mejo - potem bo našel odgovor na vprašanje "praštevila do variabilnega n".

$minimize lines 100 pa celo fizično prepreči nastanek programa, ki bi ti naštel kaj dosti praštevil. Bi moral najprej v neko spremenljivko zapisati index, v drugo vrednost in šele s tretjim ukazom bi se praštevilo znašlo v tabeli, kot smo zahtevali. (Tukaj se vidi, da ima striktna sintaksa tudi nek globji pomen.)

Kompleksnost programa po Kolmogorovu ne sme biti večja od njegovega outputa, če ne je smešen! :))
Man muss immer generalisieren - Carl Jacobi

snow ::

Potem je odkril novo formulo za praštevila do 1000? :))

Jaz od sedaj naprej pišem vse v critticall kodi.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

snow,

Ja, specifičen program za vsa praštevila do 1000, podobno kot specifični program za število dni po mesecih - je gotovo rezultat, ki ga dobiš, če "se s tem preveč igraš"! :))

Jest mislim, da bi bilo že tako ali tako dobro, da bi vsi pisali v Critticall code. Ampak vseeno bo treba narest nek prevajalnik iz C++ v Critticall code.

:)
Man muss immer generalisieren - Carl Jacobi

romci ::

Sem cisto za tak prevajalnik - ze celo dopoldne prevajam en simpl algoritem za leksikografske permutacije array-a iz C-ja v C-ritticall, pa se zmer ga kot kaze nekje userjem :)
-- not all those who wander are lost...

Sergio ::

Še ena mala skrb. Sedaj se malo igram z algoritmom fibonaccija. In sem tudi naredil to, da imam tabelo vhodnih vrednosti (preverja fib tabele za različne zgornje fib meje). Je pa problem, da doživim integer overflow, ker fibonacci prehitro raste. Obstaja kakšna rešitev, ali moram enostavno omejiti zadevo?
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Sergio ::

 $rinvar doKam (5,45) $dimension rezultati[50] $minimize lines on $sound on $retvar rezultati[] $bes prviClen = 0; temp = 0; temp2 = 0; temp3 = 0; temp4 = 0; temp5 = 0; drugiClen = 1; i = 0; numZero = 0; numOne = 1; numTwo = 2; rezultati[numZero] = prviClen; rezultati[numOne] = drugiClen; for (i=numTwo; i<doKam; i+=numOne) { temp2 = i-numOne; temp3 = i-numTwo; temp4 = rezultati[temp2]; temp5 = rezultati[temp3]; temp = temp4+temp5; rezultati[i] = temp; } $ees 
Moje videnje Critticall Fibonaccija. Mam zdele na optimiziranju. A je dobr napisan?
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

CaqKa ::

smem vprašat zakaj bi sploh fibonacija optimiziral? a ni že dovolj optimiziran?
aja pa nkeje zgoraj sem prosil če bi kdo napisal algoritem za quick in heap sort

romci ::

Evo, permutacije array-a:

Originalen C-progcic

Na kritiziranje pripravljen algoritem

Zdej pa sam se da ga prepricam, da bi to jst rad mel na vseh moznih array in vseh moznih permutacijah :)
-- not all those who wander are lost...

Sergio ::

CaqKa: Da vidim, če je možno. In izgleda, da je. :D

Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Thomas ::

Sergio,

Ja prav. A maš že 82,5%? :\
Man muss immer generalisieren - Carl Jacobi

Thomas ::

romci ... več $invarov mu daj. Na roko napisanih primerov input date. Potem bo najbrž uvedel še dodatne, algoritom bo pa za vse.

:)
Man muss immer generalisieren - Carl Jacobi

Sergio ::

Thomas, kako? Trenutno imam 72.5%.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Thomas ::

Nekej golfaš! >:D
Man muss immer generalisieren - Carl Jacobi

Sergio ::

71.9%. To je pač navit procesor, hihi :D
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

romci ::

Hm, bom poskusu - sicer so pa itak tele permutacije sam del necesa mal vecjega, tko da same poseb jih ne bom predolg pustu kuhat - sam do ene 85% :)

Na fibonacciju pa po prib 1 min. 72,7% :)

Thomas: a question - PPS = ... ?Processes? Per Second?
-- not all those who wander are lost...

Zgodovina sprememb…

  • spremenil: romci ()

Thomas ::

romci,

Programs per second.

Taprva številka je skreiranih programov, druga konzistentnih, tretja z zaželenim outputom - vse to na sekundo.

:)
Man muss immer generalisieren - Carl Jacobi

Thomas ::

romci,

Ukaza $bes in $ees lahko kar izpustiš v tvojih permutacijah. Še zmeraj bo vse v redu, samo nekoliko širši scope da večje možnosti optimizacij.

$bes in $ees postaviš samo takrat, kadar te zanima le optimizacija enega podsegmenta.

:)
Man muss immer generalisieren - Carl Jacobi

romci ::

Thomas,

hotel sem samo excludat iz optimizacije filanje arraya z elementi, kar je blo potrebno realizirat programsko - kot sem rekel so tele permutacije samo en delcek nekega drugega algoritma, pri katerem pa arraya ne bom filal programsko.
-- not all those who wander are lost...

CaqKa ::

pa vseeno fibonačija optimizirat?
a ni to tista zadeva

a1=1
a2=1
anaslednji=anaslednji-1+anaslednji-2

?

em dajte malo pokomentirat kaj je zdaj zevuliralo in kaj je boljše.

romci ::

men je za fibonacija zevuliralo za dobrih 30% v tole:


numone++;
numtwo|=2;
dokam--;
rezultati[numone]=numone;
temp++;
for (i=numtwo;i < dokam;i+=numone) {
temp3++;
rezultati[i]=temp;
temp5=rezultati[temp3];
temp=temp+temp5;
}
rezultati[i]=temp;
-- not all those who wander are lost...

Thomas ::

CaqKa,

Kar se vse sorte sortov tiče, jih bom enkrat dal na homepage. Da se bodo ljudje lahko igrali z njimi.

Kar se Fibonaccija tiče - več algoritmov mu ustreza. TAB[i]=TAB[i-1]+TAB[i-2] - mora procesor nekako izvesti. Kar direktno v realnosti ne gre, ampak je treba dati navodila stroju, da to izvrši.

Sej input in output kodi sta jasni.

romci,

Ja, okay. Samo vseeno - while zanko bi mu jest prepustil v celoti. Tako smo trenutno na 67,8%.
Man muss immer generalisieren - Carl Jacobi

jeti51 ::

CaqKa: Optimizira se algoritem. Program se tako preoblikuje, da odvečne operacije pomeče ven. Pri Fibonacciju kakšnih hudih sprememb ne bo (vseeno se izboljša za skoraj 30% po 10 minutah), pri kakšni drugi stvari se pa dejansko spremeni praktično cel algoritem. Recimo poglej si primer tistega "random sorta" (ene dve strani nazaj), kjer se je Thomasu preoblikoval kar v nekakšen bubble sort.

BigWhale ::

Critticall.exe *shudder*

You've left me in the dark here... Once again, kateri del portanja predstavlja problem? :)
Saj zadeva je jasno tako napisana, da je spodaj 'engine' s svojim APIjem, potem je pa na to zaliman GUI? :)

snow ::

Zgoraj nekje je nekdo spraseval o vecdimenzionalnih tabelah.
Da se stvar resit nekako takole:

rows=10;
columns=20;
all=rows*columns;
int tab[rows][columns];
int tab2[all];
zero=0;

//tab1[rows][columns] -> tab2[all]
for(i=zero;i<rows;i+=1){
for(j=zero;j<columns;j+=1){
kopy=i*rows;
kopy+=j;
tab2[kopy]=tab[i][j];
}
}

//tab2[all] -> tab1[rows][columns]
for(i=zero;i<all;i+=1){
rown=i/rows;
columnn=i%rows;
tab[rown][column]=tab2[i]
}


Zero. Hmph. :))
Znova in znova se dogajajo skoki, ki nas popeljejo bližje k singularnosti. Critticall je en tak skok.

Daj mi naj en napiše tisti html oznaki za < in > .
Hvala xbitu spodaj. :D
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

darh ::

&lt; om &gt;
Excuses are useless! Results are priceless!

Zgodovina sprememb…

  • spremenil: darh ()

Sergio ::

Ma navdušen sem :)

Po dveh urah je prišel do 69,4%, nato pa rekel, da sem neregistriran.

Bi se dalo, Thomas, da se program po dveh urah ne bi zaprl, ampak bi samo čakal na tvoj klik, in nato nadaljeval dalje? Ali je to že preveč funkcionalnosti za unreg verzijo?
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

romci ::

Snow: hvala, ze nekaj casa veselo izracunavam indexe :) ampak sem mislil da gre kej bolj na izi

Sergio: odpri se 1x, nalozi ze izboljsan program in OLE, gremo naprej :)

Thomas: ce ti ni odvec, da te neregistrirani uporabniki izrabljamo za podporo :8), mogoce kaksna ideja, zakaj bi tlele javlju syntax error, ce pa v syntaxi ni errorja? :)

LP,
Roman
-- not all those who wander are lost...

asPeteR ::

romci: Kaj pa ce je po dveh urah ne pojavi noben evoluiran program? Se pomaga tvoja resitev?

Thomas je tocno vedel, kje postaviti omejitev.0:)

Za "navadno" uporabo zadostuje Shareware verzija, za kaj bolj kompleksnega pa je fajn da se odpravi dveurna omejitev ...

Razen ce zadevo laufas na kaksem optreon serverju z osmimi proci ...8-) Samo Critticall verjetno ni optimiziran za vec procesorjev, ali pac?8-)

Kostko ::

BigWhale: sej drgač critticall dela preko winea - sicer je to začasna rešitev dokler ne pride vn native linux verzija, vendar stvar čist lepo dela :D drgač bi pa kakšna console verzija programa pršla prow, da ne bi rabu glih grafike za poganjat tole :\
Human stupidity is not convergent, it has no limit!

darh ::

meni tudi javi sintax error, v podobnem primeu kot romciju:
nekej[stotice] = 100;


Drugače pa... mal exprerimentiram.. in sem naredu "human-style" množilnik dveh števil do 999. Me zanima kolk časa rabi da ugotovi da je vseeno če pomnoži dani cifri :)
Excuses are useless! Results are priceless!

Kostko ::

xbite, poskusi takole:

sto = 100;
nekej[stotice] = sto;
Human stupidity is not convergent, it has no limit!

darh ::

Nope.
Excuses are useless! Results are priceless!

jeti51 ::

Evo, da povem, kaj je meni naredil iz tistega naivnega random sorta (v psevdokodi):

sorted = 1

od zacetka do konca pojdi skozi vse pare sosednjih elementov
ce je trenutni par neurejen, sorted = 0 in break, sicer vzemi naslednji par

while (sorted==0) //dokler tabela ni sortirana
zamenjaj trenutni neurejeni par elementov med sabo
sorted = 1

//zdaj naredi popolnoma isto kot cisto na zacetku:
od zacetka do konca pojdi skozi vse pare sosednjih elementov
ce je trenutni par neurejen, sorted = 0 in break, sicer vzemi naslednji par

end while


Zadevo je spravil na 0.7% prvotne zahtevnosti. Res je izumil nekakšen bubble sort, kjer menja sosednje pare elementov, ki niso urejeni. Slabost je, da prvi neurejen par išče vsakič čisto od začetka tabele, namesto da bi vsakič šel do konca in zamenjal vse neurejene pare. Je pa to očitno mnogo boljše, kot naivni random sort.:)

Zgodovina sprememb…

  • spremenil: jeti51 ()

Gandalfar ::

Zdele testiram zadevo z gcc-3.3 optimizacijami, intelovim c compilerjem in critticalom..

mi lahko nekdo na mail ( gandalf@owca.info ) poslje primer kaksne kode, ki se izvaja vsaj kaksno minuto ali pa vec, ce se da..

Rabim neoptimizirano kodo in potem critticallovo optimizacijo. Rezultate bom potem tukaj objavil..

Imam ze neke primere samo bi rad se kaksnega, da ne bom na podlagi enega vlekel napacnih povzetkov ven..

Thomas ::

romci,

Imaš eno tabelo, v katero lahko pišeš. Če imaš več nizov, jih moraš lepo porazdelizi po prvotnem nizu, ki ga imenuješ kakorkoli že.

Displacement od 0, ti je potem orodje za reševanje tega.

VENDAR imaš pa še rezerni arr256[], ki ga uporabi namesto tvojega curpata.

:)
Man muss immer generalisieren - Carl Jacobi

Thomas ::

romci,

Pošlji original ... bomo videli, kaj se da narest.

:)
Man muss immer generalisieren - Carl Jacobi
««
5 / 29
»»


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Najhitrejši programski jezik? (strani: 1 2 )

Oddelek: Programiranje
757469 (5289) Senitel
»

Funkcija z logičnimi operaterji.... (strani: 1 2 )

Oddelek: Programiranje
905203 (4549) CaqKa
»

Petaflopsu naproti (strani: 1 2 3 )

Oddelek: Novice / Procesorji
1058306 (8306) Marjan
»

cene permutacij help please

Oddelek: Programiranje
261968 (1575) Sergio
»

kako definirtati prastevilo

Oddelek: Programiranje
143700 (3505) ooux

Več podobnih tem