Enterprise Forever

:HUN => Programozás => Topic started by: IstvanV on 2013.October.31. 19:17:05

Title: Fraktálok assemblyben
Post by: IstvanV on 2013.October.31. 19:17:05
Quote from: Povi
érdekes, hogy csak maga a rajzolás kb. 8 mp.
EXOS hívások nélküli ASM változat:
[attachurl=#]

Ez 2.31 másodperc alatt fut le, amiből 0.35 s az inicializálás (memória foglalás 640K-s konfiguráción és a képernyő törlése).
Title: Re: Fraktálok assemblyben
Post by: Lacika on 2013.October.31. 20:38:30
Quote from: IstvanV
Ez 2.31 másodperc alatt fut le, amiből 0.35 s az inicializálás
Az igen! :shock:
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.01. 13:15:51
Nem tartozik ugyan közvetlenül a témához, de az ep128.hu-n található Fractals.rar-ban a VL formátumú képeket IVIEW-ra konvertáltam. Így lényegesen kisebb lett a file-ok mérete:
[attachurl=#]
Title: Re: Fraktálok assemblyben
Post by: Lacika on 2013.November.01. 16:18:02
Quote from: IstvanV
Nem tartozik ugyan közvetlenül a témához, de az ep128.hu-n található Fractals.rar-ban a VL formátumú képeket IVIEW-ra konvertáltam.
Kösz! Kicseréltem.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.01. 18:53:00
Még néhány konvertált fraktál rajzoló program:

[attachurl=#]
[attachurl=#]
[attachurl=#]
[attachurl=#]

[attachurl=#]
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.03. 19:12:00
Fraktál rajzolás témában itt egy újabb program azoknak, akiknek van türelmük kb. 82 percet várni a teljes lefutására (illetve emulátoron gyorsítva kevesebbet). :) Valószínűleg még lenne mit fejleszteni rajta. :oops: 32 bites lebegőpontos műveleteket használ (a PC egyszeres pontosságú "float" típusával azonos formátumban), a felbontás 160x200, az iterációk maximális száma 88. A kép 32 menetben jelenik meg, először csak kis felbontásban, de aztán egyre részletesebben.

[attachurl=#]

[attachurl=#]
[attachurl=#]
[attachurl=#]
[attachurl=#]
Title: Re: Fraktálok assemblyben
Post by: Zozosoft on 2013.November.03. 19:20:32
Nem semmi!
Title: Re: Fraktálok assemblyben
Post by: endi on 2013.November.03. 20:09:29
nagyon jó!
ha emuban no limitre állítjuk a sebességet, és a z80 sebességet is jó nagyra, akkor marha hamar lefut
Title: Re: Fraktálok assemblyben
Post by: geco on 2013.November.03. 20:40:59
Nagyon jó, az elején még néztem, hogy változik a kép turbó módban, aztán meg a végét :D
Title: Re: Fraktálok assemblyben
Post by: Zozosoft on 2013.November.03. 20:53:26
Quote from: IstvanV
Még néhány konvertált fraktál rajzoló program:
Brutális ez a tempó!
Title: Re: Fraktálok assemblyben
Post by: Povi on 2013.November.04. 09:13:31
Quote from: IstvanV
Fraktál rajzolás témában itt egy újabb program azoknak, akiknek van türelmük kb. 82 percet várni a teljes lefutására (illetve emulátoron gyorsítva kevesebbet). :)
Nagyon jók!
Tetszik a képernyőtörlő rutin! :-) A többit még emésztem...
Title: Re: Fraktálok assemblyben
Post by: Povi on 2013.November.04. 10:06:05
Quote from: IstvanV
Ez 2.31 másodperc alatt fut le, amiből 0.35 s az inicializálás (memória foglalás 640K-s konfiguráción és a képernyő törlése).
hogyan méred az időt?
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.04. 11:52:37
Quote from: Povi
hogyan méred az időt?
Ezzel a Lua scripttel:

[attachurl=#]

Az elején be kell állítani az időmérés kezdetének és a végének a címét, a script futtatása ("Run") után pedig a Step gombbal folytatni az emulációt. Az időt a monitor ablakban írja ki. Alt+W módban is használható.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.04. 13:48:15
Quote from: geco
Nagyon jó, az elején még néztem, hogy változik a kép turbó módban, aztán meg a végét :D
24 bites egészekkel (fix pontos ábrázolás) valamivel gyorsabb lehetne kisebb pontosság árán. Nagyon nagy különbséget nem jelentene, de talán kevesebb, mint egy óra alatt futna le a program. :)
Title: Re: Fraktálok assemblyben
Post by: Zozosoft on 2013.November.04. 13:56:57
A végeredménye ugyanaz lesz a programnak mindig (nincs benne rnd)? Ha igen akkor már csak egy képmentés kéne a végére, és lehetne használni stabilitás tesztnek, pl a 10MHz-es turbó tesztelésére.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2013.November.04. 14:30:16
Quote from: IstvanV
Ezzel a Lua scripttel: timer.lue
biztos én vagyok béna, de nekem runtime error-t ír ki a LUA script futtatásakor...
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.04. 14:33:14
Quote from: Zozosoft
A végeredménye ugyanaz lesz a programnak mindig (nincs benne rnd)?
Igen. Tehát hatékonyabb lenne az eredményt egyszerű képként menteni. :) De az megoldható lenne, hogy választani lehessen a program indításakor, vagy a koordináták beírásával, vagy pedig több előre definiált érték közül (ilyen formátumban egy "kép" csak 16 byte, esetleg valamivel több ha mindegyiknek más palettája lehet).
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.04. 14:39:01
Quote from: Povi
biztos én vagyok béna, de nekem runtime error-t ír ki a LUA script futtatásakor...
A monitor ablakban mi a hibaüzenet ? A script egyébként csak 2.0.8 (ami ugyan elég régi) vagy újabb ep128emu verzión működik.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2013.November.04. 14:40:51
"runtime error while running Lua script"

egyébként 2.0.5-ös... szóval én voltam a ludas... :oops:

2.0.9-cel működik :-)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.04. 19:19:41
Quote from: IstvanV
24 bites egészekkel (fix pontos ábrázolás) valamivel gyorsabb lehetne kisebb pontosság árán. Nagyon nagy különbséget nem jelentene, de talán kevesebb, mint egy óra alatt futna le a program. :)
Valóban, első próbálkozásra ez a módosítás 4916 másodpercről 3430-ra gyorsította a programot. Azonban az eredmény kissé eltér (az első kép az eredeti lebegőpontos verzió, a második pedig a módosított változat):

[attachthumb=#]

[attachthumb=#]

Ennek a programnak egyébként korábban Lua változatát is készítettem, amely megtalálható itt (http://enterpriseforever.com/weboldalak/ep128-hu/msg30318/#msg30318) és itt (http://enterpriseforever.com/weboldalak/ep128-hu/msg30519/#msg30519). Az EP verzióval azonos képhez az alábbi paramétereket kell beállítani:

Code: [Select]
epInit(40, 200, 0x42)
...
x0 = -0.0238281246
y0 = -0.8064778447
x1 = 0.0011718748
y1 = -0.7908528451
...
      local i, r2 = mandelbrot(x0 + ((x1 - x0) * (x / videoWidth)),
                               y0 + ((y1 - y0) * (y / videoHeight)), 4.0, 88)
      i = math.floor(i * 0.125 + ditherTable[(y % 4) + 1][(x % 4) + 1])
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.05. 19:38:10
Quote from: IstvanV
Azonban az eredmény kissé eltér (az első kép az eredeti lebegőpontos verzió, a második pedig a módosított változat):
A hibát túlcsordulás okozta,ezt javítva már csak kisebb eltérés van a kerekítési hiba miatt. Az új verziók:

[attachurl=#]    (lebegőpontos, most 4509 másodperc alatt fut le)
[attachurl=#]    (24 bites fix pontos, 3157 másodperc)

Forráskód:
[attachurl=#]  [attachurl=#]
[attachurl=#]  [attachurl=#]  [attachurl=#]

Hogy valamivel több értelme legyen a programnak, még érdemes lenne beépíteni (választhatóan) több megjeleníthető képet.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.07. 10:08:05
Quote from: Lacika
Kösz! Kicseréltem.
Néhány file hibás (első ránézésre úgy látszik, azért, mert az eredeti VL formátumú file kicsomagolva nem pontosan a megfelelő méretű, és ez a konvertálásban hibát eredményezett). :oops: Ezeket hamarosan javítom.
Title: Re: Fraktálok assemblyben
Post by: Lacika on 2013.November.07. 19:50:21
Quote from: IstvanV
Néhány file hibás (első ránézésre úgy látszik, azért, mert az eredeti VL formátumú file kicsomagolva nem pontosan a megfelelő méretű, és ez a konvertálásban hibát eredményezett). :oops: Ezeket hamarosan javítom.
Ok! Kösz! Várom! ;-)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2013.November.07. 20:55:04
Javított képek (a BASIC programokat újra futtatva, és a képernyőt az epimgconv csomagban található imgsave.lua script segítségével mentve):

[attachurl=#]
[attachurl=#]
[attachurl=#]
[attachurl=#]
[attachurl=#]

Egy újabb konvertált program:

[attachurl=#]
[attachurl=#]

És akiknek van türelmük várni, azoknak egy továbbfejlesztett mandel2.com, amelyben 10 megjeleníthető kép közül lehet választani (a Space billentyű visszatér a "menühöz", az Esc pedig kilép - ezek bármikor használhatók):

[attachurl=#]
[attachurl=#]

A forráskódok fordításához a korábban feltöltött graph.s, math.s, és float.s file-ok is kellenek.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.26. 17:11:06
5:31

ez az algoritmus:
https://www.youtube.com/watch?v=rVQMaiz0ydk
https://bisqwit.iki.fi/jutut/kuvat/programming_examples/mandelbrotbtrace.pdf

a lebegőpontos rutin a HiSoft Pascal-ból

lehetne még gyorsítani, mert sok a lapozás (pl. video RAM 0x8000-től, de a Data és Done tömbök is.

Title: Re: Fraktálok assemblyben
Post by: endi on 2018.July.26. 17:20:46
hú ez jó! tetszik ahogy kirajzolja. és elég gyors is!
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.26. 17:22:51
hú ez jó! tetszik ahogy kirajzolja. és elég gyors is!
128-as iterációval 5:31, 64 iterációval már csak 3.40
Title: Re: Fraktálok assemblyben
Post by: szipucsu on 2018.July.26. 22:11:32
lehetne még gyorsítani, mert sok a lapozás (pl. video RAM 0x8000-től, de a Data és Done tömbök is.
Kb. 1200%-os emu sebességgel igen jó. De alap sebességgel is egész tűrhető idő alatt kirajzolja.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.27. 12:36:51
128-as iterációval 5:31, 64 iterációval már csak 3.40
ó, véletlenül 8 Mhz-re állított emuban néztem :-)
Szóval nagyjából dupla ennyi... :-(
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.27. 14:44:02
https://youtu.be/j05M8akBLCY
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.28. 15:16:39
PC verzió:
[attachurl=1]
[attachurl=2]
[attachurl=3]
(fordítás az itt (https://enterpriseforever.com/ep128emu/ep128emu/msg70792/#msg70792) található MinGW csomaggal: gcc -m32 -Wall -O2 -IC:/mingw32/include mandel.c -o mandel.exe -lmingw32 -lSDL -lSDLmain -lm -s)

EP-s változatban lehetne még próbálkozni a korábbi programokban használt egész számos aritmetikával.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.28. 16:06:31
lehetne még gyorsítani, mert sok a lapozás (pl. video RAM 0x8000-től, de a Data és Done tömbök is.

A tömbök méretét csökkenteni lehetne a képernyőt kisebb részekre bontva és több menetben rajzolva. Így ugyan valamivel kevésbé hatékony az algoritmus, viszont minden elfér lapozás nélkül.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.28. 23:10:12
A tömbök méretét csökkenteni lehetne a képernyőt kisebb részekre bontva és több menetben rajzolva. Így ugyan valamivel kevésbé hatékony az algoritmus, viszont minden elfér lapozás nélkül.
kicsit átvariáltam azóta, a 128x192 pixel Data és Done tömbje pont elfér 48kB-on, most már csak a PutPixel során kell csak lapozni. Az x, y koordinátához tartozó Done tömb most a 0x4000 + 256y + x címen van, a Data tömb pedig 0x4000 + 256y + x + 128 címen.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.28. 23:14:51
PC verzió:
(Attachment Link)
(Attachment Link)
(Attachment Link)
(fordítás az itt (https://enterpriseforever.com/ep128emu/ep128emu/msg70792/#msg70792) található MinGW csomaggal: gcc -m32 -Wall -O2 -IC:/mingw32/include mandel.c -o mandel.exe -lmingw32 -lSDL -lSDLmain -lm -s)

EP-s változatban lehetne még próbálkozni a korábbi programokban használt egész számos aritmetikával.

Hehe, PC-n nem is látszik, hogy rajzol, csak földobja a kész ábrát! :-)

Jaja, gondolkodtam én is a fixpontos cuccon, ha kicsit kigyomlálom a forráskódot, majd kirakom ide is.

Amit még gyorsítottam: az integer -> float konverziót függvény helyett 256 elemű táblázatból oldom meg (a képernyő koordináta sose nagyobb 191-nél), az Iterate fv-ben a 2-vel szorzást (ami a forrásban összeadás), a real szám kitevőjének a növelésével oldom meg (egy darab inc d)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.29. 13:51:16
Ez még nem EP verzió, de már tartalmaz néhány módosítást: fixpontos aritmetika (a tört rész 20 bites) és függőlegesen 4 részre osztott képernyő.
[attachurl=1]    (szerk.: paletta és dither EP-s PIXEL16 módhoz)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.29. 18:47:52
Ep-s, de még lassú. :oops:
[attachurl=1]

[attachurl=2]
[attachurl=3]
[attachurl=4]
[attachurl=5]

A futásidő nagy részét a fixpontos szorzás teszi ki, talán célszerűbb lenne csökkenteni a pontosságot (jelenleg 8.24 bit, ami teljes 32 bites egész szorzást igényel).
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.29. 21:08:16
Kisebb pontosságú és valamivel kevésbé lassú változat:
[attachurl=1]
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.30. 08:44:38
Kisebb pontosságú és valamivel kevésbé lassú változat:
(Attachment Link)
szép lett! nem semmi, hogy még dither-t is raktál bele :-)

viszont tényleg jó lassú :oops:

na most ezt lenne érdemes átírni asm-be, megnézni, mennyit gyorsítana vajon

eredetileg én is a C kódot fordítottam SDCC-vel, és feleekkora felbontással is nagyon lassú volt (persze lebegőpontos számításokkal), azért kezdtem el asm-be
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.30. 08:48:59
tetszik, hogy összevontad a Done és a Data tömböt! :-)
Title: Re: Fraktálok assemblyben
Post by: geco on 2018.July.30. 08:56:41
Szép, fullra gyorsított emuval gyorsan kirajzolja :ds_icon_cheesygrin:
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.30. 09:31:32
lehet szörnyülködni  forráson :-)
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.30. 11:44:32
a szorzó rutin unroll-olásával 5:57-ről 5:13-ra gyorsult

hm...
a 248. sorban lévő ld (iy+05h), b nem is kell, anélkül 5:10 :-)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.30. 11:56:59
na most ezt lenne érdemes átírni asm-be, megnézni, mennyit gyorsítana vajon

Valójában a futásidő kb. 2/3 részét most is az fpMult rutin teszi ki (az előző verzióban 3/4 volt). :oops: Ezt pedig az Iterate() rutin követi, talán célszerű lenne először csak azt átírni asm-re. Itt a bal oldalon látható az fpMult CPU fogyasztása, a kijelölt rész pedig az Iterate:
[attachthumb=1]

Kisebb "csalással" ki lehetne még használni a függőleges szimmetriát, elég lenne csak a kép felét számítani, de akkor más paraméterekkel nem működne.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.30. 17:08:55
Egyelőre javítottam valamennyit az fpMult rutinon, és a négyzetre emeléshez lett egy külön fpSqr. Ezen kívül az Iterate "static" változókat használ, bár ez csak néhány másodperc különbséget jelent. A változtatások 583.5 másodpercről 498.6 másodperce javították a futásidőt 4 MHz-es gépen, de ezen még tovább kellene gyorsítani.

Szerk.: ez most 494.2:
[attachurl=1]

[attachurl=2]
[attachurl=3]
[attachurl=4]
[attachurl=5]

[attachurl=6]
Title: Re: Fraktálok assemblyben
Post by: geco on 2018.July.30. 20:04:34
Nekem látványosan gyorsabbnak tűnt, igaz az ALT+W használatát kb fél percig bírtam nélkülözni :D
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.31. 07:59:57
EA változtatások 583.5 másodpercről 498.6 másodperce javították a futásidőt 4 MHz-es gépen, de ezen még tovább kellene gyorsítani.

Egyébként arányaiban nem sokkal lassabb, mint az én változatom (310 sec), hiszen te nagyobb felbontást használsz (160x200 a 128x192 helyett), és több iterációt (88 a 64 helyett). Egyébként miért pont 88?
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.31. 11:58:02
majdnem 20 mp-et sikerült még faragni, az általános szorzó rutin helyett négyzetre emelő függvény használatával, ami a szorzó rutin kiherélésével jött létre
így most 4:52 az 5:11 helyett :-)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.July.31. 14:59:18
Egyébként miért pont 88?

A paletta mérete miatt, 11 szín 8 árnyalata (ditherelve). Pontosan 88 iterációnál a 12-edik szín jelenik meg, ami fekete.

Kisebb módosításokkal így változott a futásidő:
main: 479.6 s
Iterate: 410.2 s
fpMult: 114.2 s
fpSqr: 202.2 s
PutPixel: 6.4 s
AddQueue: 2.7 s
_divuint + _moduint: 4.4 s

Szerk.: az ri változó törlésével az Iterate még gyorsul 15.2 másodperccel. További minimális gyorsulást eredményez az előjeles 32 bites összehasonlítás előjel nélkülire alakítása.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.July.31. 16:59:52
no, ha valakit érdekel, itt a véglegesnek gondolt futtatható fájl is

most kéne bele egy egérkezelés, és lehetne zoom-olgatni :-)
meg lenne egy időmérő a kép aljában (végül is elférne, van 8 pixelsorom még alul)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.02. 13:53:14
443.9 másodperc, de továbbra is csak C nyelvű az Iterate:
[attachurl=1]

[attachurl=2]
[attachurl=3]
[attachurl=4]
[attachurl=5]

[attachurl=6]

Újdonság, hogy a 0-9 billentyűkkel más paraméterek választhatók (a 0 az alapértelmezett), de ezek a nagyobb nagyítás miatt lassabbak. Célszerű 250 MHz-es Z80-at beállítani. A Stop billentyűvel megszakítható a rajzolás, Space vagy Escape kilép.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.02. 16:58:10
Még lehetne próbálkozni 16 bites egész aritmetikával (pl. 1 bit előjel + 3 bit egész + 12 bit tört rész), ez ugyan nagyításnál már kevés lehet, és figyelni kell a túlcsordulásra, de az alapértelmezett paramétereknél még ilyen pontosság is elfogadható eredményt adhat.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.August.02. 20:45:59
Még lehetne próbálkozni 16 bites egész aritmetikával (pl. 1 bit előjel + 3 bit egész + 12 bit tört rész)
2 bit egész nem lenne elég? ha jól számolom, akkor úgy 3.9999... lenne a legnagyobb ábrázolható szám, de ha r2+i2 >= 4, akkor úgyis a végtelenbe tart, szóval ott elég lenne csak az overflow-t figyelni, nem?
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.02. 21:07:58
2 bit egész nem lenne elég?

Elég lehetne, csak több helyen kell figyelni a túlcsordulásra. De így is gyorsabb lenne a jelenlegi nagyobb pontosságú verziónál.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.August.03. 13:09:05
hevenyészett 2.13 bites fixpontos számításom eredménye:

Code: [Select]
static unsigned char Iterate(int x, int y)
{
unsigned char iter;
long r=x;
long i=y;
for(iter=0; iter<MAXITER; ++iter)
{
long r2 = (r*r)/8192, i2 = (i*i)/8192;
if (r2+i2 >= 32768) break;
i = (r*i)/4096 + y;
r = r2-i2 + x;
}
return iter;
}

úgy vettem észre, hogy a jobbra shift az nem aritmetikai shift-et csinál, ezért az osztás
de nem is a hatékonyság volt a lényeg jelenleg, csak kipróbáltam, hogy működik-e egyáltalán :-)
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.August.03. 13:25:35
úgy vettem észre, hogy a jobbra shift az nem aritmetikai shift-et csinál, ezért az osztás

azért elég okos az SDCC, mert fölismeri, hogy kettő hatványával akarok osztani, szóval megoldja szépen bitforgatással, nem az osztó rutint hívja :-)
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.03. 14:00:34
Valóban jó ötletnek tűnik ez a pontosság, egyelőre 299.8 másodperc lett, de valószínűleg lehetne jobb is:
[attachurl=1]

Szerk.: nagyobb nagyításnál (4, 6 és 7) azonban hibásan működik, itt már kevés a felbontás. :oops:
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.August.03. 14:18:38
Valóban jó ötletnek tűnik ez a pontosság, egyelőre 299.8 másodperc lett, de valószínűleg lehetne jobb is:
mondjuk már szerintem itt is pontatlan egy kicsit, nem teljesen szimmetrikus a vízszintes tengelyre, bár én nem foglalkozok a kerekítési hibákkal.
Title: Re: Fraktálok assemblyben
Post by: endi on 2018.August.03. 14:35:20
ez egyébként mennyivel gyorsabb, mint azok, amik annak idején, az EP idejében készültek?
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.August.03. 15:30:32
ez egyébként mennyivel gyorsabb, mint azok, amik annak idején, az EP idejében készültek?

Én csak azt ismerem, ami az Enterpress-ben jelent meg, de működő változatát még nem láttam. Anno megpróbáltam bepötyögni, de olvashatatlan volt.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.04. 12:08:46
A _mullong is elfogyaszt 33.8 másodpercet, valószínűleg itt:
Code: C
  1.   result = Iterate(minr + x * stepr, mini + y * stepi);
Ezt érdemes lenne átalakítani, hogy az assembly fixpontos szorzó rutint használja.

Szerk.: egyelőre a nagyobb pontosságú verziót módosítottam, ez gyorsult is 443.9-ről 423.9 másodpercre.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.04. 15:57:15
mandel16.com: 276.0 másodperc (rosszabb minőségű kép nagy nagyításnál)
mandel24.com: 423.7 másodperc

[attachurl=1]
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.04. 16:24:46
Összehasonlítás (bal oldalon látható a 24 bites változat):
[attachthumb=1]    [attachthumb=2]

[attachthumb=3]    [attachthumb=4]

[attachthumb=5]    [attachthumb=6]

[attachthumb=7]    [attachthumb=8]

[attachthumb=9]    [attachthumb=10]

[attachthumb=11]    [attachthumb=12]

[attachthumb=13]    [attachthumb=14]
Title: Re: Fraktálok assemblyben
Post by: endi on 2018.August.04. 16:48:20
hát, csak úgy látszik ha különbség ha nagyon figyelek és tudom mit kell nézni (bal oldali kevésbé zajos, jobban érezni a formákat)
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.August.04. 16:48:33
Összehasonlítás (bal oldalon látható a 24 bites változat):
Jó lett! Annyira nem látszik, hogy vészes lenne a 16 bites se!
Hány bit egész részt használsz végül (24 és 16 bites esetben is kíváncsi vagyok, nem néztem még a zip-et, lehet, hogy benne van a forráskódban a válasz) :-)

Ráadás kérdés: szorzás után, amikor visszashift-eljük jobbra az eredményt, akkor hogy szokás kerekíteni?

Nekem az a logikus, hogy a legutoljára kitolt bitet hozzáadjuk az eredményhez.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.04. 17:00:55
Hány bit egész részt használsz végül (24 és 16 bites esetben is kíváncsi vagyok, nem néztem még a zip-et, lehet, hogy benne van a forráskódban a válasz) :-)

A 16 bitesnél maradt a 13 bites tört rész + 2 bit egész és 1 előjel. A 24 bites vezióban 20 bit a tört rész, az egész pedig szorzás előtt 4 bit + 1 előjel, az eredmény azonban -255.99.. és 255.99.. között lehet. Ennél egyébként lehetne pontosabb is, csak a 4.20 elfogadhatóan működött és nem kellett túlcsordulásra figyelni.

Quote
Nekem az a logikus, hogy a legutoljára kitolt bitet hozzáadjuk az eredményhez.

Ez jó megoldás.
Title: Re: Fraktálok assemblyben
Post by: endi on 2018.August.04. 17:06:20
úgy tudom vannak táblázatokkal gyorsított matek rutinok. van sok memóriánk (bár erre talán nem sok), ki kéne próbálni.
úgy tudom a mai procikban is hatalmas táblázatok vannak ilyen célra.
Title: Re: Fraktálok assemblyben
Post by: IstvanV on 2018.August.04. 17:11:28
Táblázatos szorzással próbálkoztam korábban, bár nagy számok szorzásánál nem könnyű jelentős gyorsulást elérni. :oops: Például egyszerű 4x4 vagy 4x8 bites táblázatnál sok időt igényel a részeredmények léptetése és összeadása.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.07. 22:28:34
no, 2.13 bites fix pontos módszerrel (assembly, nem C) most 2:23 a 64 iteráció, holnap viszem az EP klubba.

még egy kicsit szerintem lehetne gyorsítani a szorzó rutin optimalizálásával
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.09. 10:35:07
75 mp (1:15) 64 iterációval úgy, hogy a négyzetre emelés egy 16384 elemű (32kB-os) táblázatból van, így már nem fut 128kB RAM-mal.
A táblázat generálása 1.7 mp.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.13. 12:09:05
Tiny Mandel :-)

8 bites fixpontos számokkal (Q2.5)

http://ep.lgb.hu/jsep/demo/?disk=http%3A%2F%2Fpovi.uw.hu%2Fmfx8.com&diskhack=load&autostart=yes&mem=128
Title: Re: Fraktálok assemblyben
Post by: szipucsu on 2018.September.13. 20:10:50
http://ep.lgb.hu/jsep/demo/?disk=http%3A%2F%2Fpovi.uw.hu%2Fmfx8.com&diskhack=load&autostart=yes&mem=128
Jó gyorsan kirajzolta. :D
Ezt a snapshotot hogyan hoztátok létre?
Title: Re: Fraktálok assemblyben
Post by: lgb on 2018.September.13. 21:06:38
Tiny Mandel :-)

8 bites fixpontos számokkal (Q2.5)

http://ep.lgb.hu/jsep/demo/?disk=http%3A%2F%2Fpovi.uw.hu%2Fmfx8.com&diskhack=load&autostart=yes&mem=128

Wow, ez az jsep meg mux? ;-P Mar total elfelejtettem h oszinte legyek :-O :-O :-O :-O
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.13. 21:47:48
Jó gyorsan kirajzolta. :D
1 mp a a mandelbrot kiszámolása a rajzolással együtt
előtte fut még 0.5 sec, amialatt szorzótáblát készít
még lehetne gyorsítani azzal, hogy kihasználjuk, hogy x tengelyre szimmetrikus :-)
de más terveim is vannak, de az meglepetés :-)
Ezt a snapshotot hogyan hoztátok létre?
föl kell tölteni valahová a futtatható fájlt. Aztán a linkben, ami van a hozzászólásban ki kell cserélni a
http%3A%2F%2Fpovi.uw.hu%Fmfx8.com
szöveget a kérdéses linkre :-)
Title: Re: Fraktálok assemblyben
Post by: szipucsu on 2018.September.13. 22:37:42
föl kell tölteni valahová a futtatható fájlt. Aztán a linkben, ami van a hozzászólásban ki kell cserélni a
http%3A%2F%2Fpovi.uw.hu%Fmfx8.com
szöveget a kérdéses linkre :-)
Akkor ennyivel a hozzászólásokhoz csatolt fájlok is megnyithatók a webes emuban, ha annak a linkjére cseréljük le a linkben a kérdéses részt, és a egyetlen fájlból áll a program? Mert akkor akár a hozzászólásokhoz is lehetne mindig csatolni a webes emus linket. Vagy akár valahogy megoldani, hogy a fórum generáljon egy ilyen linket az egyfájlos EP-s csatolmányokhoz.
Title: Re: Fraktálok assemblyben
Post by: lgb on 2018.September.13. 23:13:15
Akkor ennyivel a hozzászólásokhoz csatolt fájlok is megnyithatók a webes emuban, ha annak a linkjére cseréljük le a linkben a kérdéses részt, és a egyetlen fájlból áll a program? Mert akkor akár a hozzászólásokhoz is lehetne mindig csatolni a webes emus linket. Vagy akár valahogy megoldani, hogy a fórum generáljon egy ilyen linket az egyfájlos EP-s csatolmányokhoz.

Nezd meg az URL-t a kerdojel utan, a fenti peldanal:

disk=http%3A%2F%2Fpovi.uw.hu%2Fmfx8.com&diskhack=load&autostart=yes&mem=128

A disk= parameter egy disk-et definial, _VAGY_ egy specialis modban (amit a diskhack=load mond meg) egy sima futthato EP proggit, amit JSep on-the-fly disk-e konvertal es mint disk eri el aztan, az EP jsep-ben kb nullarol bootol, exdos latja az eloallitott disk-unket, es arrol elindul magatol a program (magatol, ha az autostart=yes is szerepel). A mem=128 nyilvan a RAM meretet definialja.

Tehat, ha van egy EP-s ".com"-od, akkor eleg a fenti reszben a disk= mogotti reszt lecserelni egesz a &diskhack-ig, ami mar marad. Az a sok %3A meg %2A az ugye a : es / escape-elve az url-ben, tehat ez:

http%3A%2F%2Fpovi.uw.hu%2Fmfx8.com

valojaban ez:

http://povi.uw.hu/mfx8.com

Annyi meg a kivanalom, hogy az adott web servernek ahol fenn van a cucc (itt povi.uw.hu) kellhet config, hogy kuldjon egy specialis http header-t a valaszban. Ez azert kell, mert a modern browserek alapbol nem engedik, hogy mas domain-ben levo (itt lgb.hu, mivel ott az jsep) cucc http kerest intezzen egy tok mas domain-be eso webserver fele, ez ugye alapvetoen biztonsagi hiba is lehet. Viszont enlkul az lgb.hu-n futo jsep nem fogja tudni elerni a megadott linken levo cuccot es letolteni maganak a browser memoriajaba, mert egy jol vedett modern browser azonnal rinyalni kezd hogy cross-site scripting attack ... Azzal a configolt plusz http header-rel mondja meg a cel webserver (itt povi.uw.hu pl) hogy felole ok, hogy az lgb.hu hozza akar fordulni, es ez ne legyen attack-nak tekintve a browser altal.

Remelem nem irtam el semmit, stb, mert iszonyat faj a hatam eppen :(
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.14. 20:23:20
Kísérletek Julia-halmazzal:
http://ep.lgb.hu/jsep/demo/?disk=http%3A%2F%2Fpovi.uw.hu%2Fjul8.com&diskhack=load&autostart=yes&mem=128

Kb. 2.8 frame / sec

Geconak köszönet az LPT-ért

hasonló effekt C64-en:
https://youtu.be/wAZ5Nk_ShGU?t=206

kicsit, mintha ott gyorsabb lenne
Title: Re: Fraktálok assemblyben
Post by: ergoGnomik on 2018.September.14. 21:03:13
hasonló effekt C64-en:
https://youtu.be/wAZ5Nk_ShGU?t=206

kicsit, mintha ott gyorsabb lenne
Egyrészt a felbontás 80*50-es, és az effekt ennél lényegesen kisebb területen jelenik meg. Másrészt egyáltalán nem biztos, hogy nem tömörített animáció. Én legalább is el tudom képzelni, hogy viszonylag egyszerű algoritmussal is lehetséges ilyen alacsony felbontású mozgóképet tárolni. Mondjuk nem fogok megpróbálni utána járni.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.14. 21:39:56
Egyrészt a felbontás 80*50-es, és az effekt ennél lényegesen kisebb területen jelenik meg.
Ahogy nézem, ott is ugyanakkora a felbontás, a barna "kör" 62x50 pixeles, én 64x48-at jelenítek meg.
Viszont a C64 verzió nagyon pontatlan, a külső barna körnek sokkal inkább kör alakúnak kéne lennie, nem pedig ilyen szögletesnek, szóval valahogy ők valamit nagyon máshogy számolnak :-)
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.17. 09:39:41
Kísérletek Julia-halmazzal:
http://ep.lgb.hu/jsep/demo/?disk=http%3A%2F%2Fpovi.uw.hu%2Fjul8.com&diskhack=load&autostart=yes&mem=128

Kb. 2.8 frame / sec


Közben gyorsítottam egy kicsit rajta (a link maradt ugyanaz), most már 3.21 FPS átlagosan, vagyis a 72 frame-et 22.46 sec alatt rajzolja ki (az eddigi 25.855 helyett)

még kb. 10%-ot lehetne gyorsítani, ha az iterációt lejjebb viszem, a C64 demóban 8 színt használnak, én 10-et.
Title: Re: Fraktálok assemblyben
Post by: lgb on 2018.September.17. 10:49:11
Közben gyorsítottam egy kicsit rajta (a link maradt ugyanaz), most már 3.21 FPS átlagosan, vagyis a 72 frame-et 22.46 sec alatt rajzolja ki (az eddigi 25.855 helyett)

még kb. 10%-ot lehetne gyorsítani, ha az iterációt lejjebb viszem, a C64 demóban 8 színt használnak, én 10-et.

Egy fontos dolog, az JSep nem emulalja azt, hogy a video memoriaba irni (vagy onnan olvasni, stb) az lassabb, mint nem videomemoriaba. Tehat valodi gepen + jobb emulatoron (ep128emu) valoszinu nem pont ugyanez lenne az eredmeny. Igaz, gondolom sok kulonbseg azert nem lenne, ha nem olyan hatalmas mennyisegu adatot irsz adott ido alatt, illetve, nyilvan nem is ez viszi el az ido nagy reszet amugy sem, hanem a szamitas :)
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.17. 13:14:32
Egy fontos dolog, az JSep nem emulalja azt, hogy a video memoriaba irni (vagy onnan olvasni, stb) az lassabb, mint nem videomemoriaba. Tehat valodi gepen + jobb emulatoron (ep128emu) valoszinu nem pont ugyanez lenne az eredmeny. Igaz, gondolom sok kulonbseg azert nem lenne, ha nem olyan hatalmas mennyisegu adatot irsz adott ido alatt, illetve, nyilvan nem is ez viszi el az ido nagy reszet amugy sem, hanem a szamitas :)

jaja, az lehet, de az időket ep128emu-val mértem :-)
Title: Re: Fraktálok assemblyben
Post by: lgb on 2018.September.17. 14:20:00
jaja, az lehet, de az időket ep128emu-val mértem :-)

Ja, oke, akkor nem szoltam :D
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.September.18. 09:29:16
Közben gyorsítottam egy kicsit rajta (a link maradt ugyanaz), most már 3.21 FPS átlagosan

Azóta tegnap csendben föltornáztam 3.42 FPS-re (nincs fönt a honlapon az a verzió).
Aztán otthon megnéztem igazi gépen, és sokkal gyorsabbnak tűnt, mint emulátoron...
Aztán rájöttem, hogy az otthoni gép alapból kikapcsolja a RAM várakozást, szóval egy OUT 191,12-vel már emun is fölszökött a sebesség átlag 3.98 FPS-re!!! :-D

Ez már eléri a C64 verzió sebességét, szóval lassan lehet köré demo-t építeni :-)
Title: Re: Fraktálok assemblyben
Post by: endi on 2018.September.18. 14:21:14
érdekes lenne karakteres üzemmódban, ahol a karakter nem 1 pixelt jelentene hanem mondjuk egy színátmenet (gracha módban).
esetleg erre kihegyezni a fraktár generátort (tehát nem 1 pixelt generál hanem eleve egy ilyen gradiens pixelt)
Title: Re: Fraktálok assemblyben
Post by: szipucsu on 2018.September.18. 20:34:37
OUT 191,12-vel már emun is fölszökött a sebesség átlag 3.98 FPS-re!!! :-D
A POKE 56,akármennyi, talán 201 meg a megszakításokat kapcsolja ki, attól még gyorsabb lehet. Hát még ha Zzzippel lenne fordítva a program... Ja, azt Assemblyben nem lehet. :D
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.October.10. 14:44:52
75 mp (1:15) 64 iterációval úgy, hogy a négyzetre emelés egy 16384 elemű (32kB-os) táblázatból van, így már nem fut 128kB RAM-mal.
A táblázat generálása 1.7 mp.
No, az István féle LPT trükkel nyertem egy szegmenst, így már elég a 128kB RAM.
Közben kisebb optimalizációkkal lement 62.41 sec-re az idő (ebben benne van a táblázatok generálása is, és emlékeim szerinte a 75 mp-et még out 191,12 nélkül mértem).

Viszont ma újabb fejlemény:
a 2xy = x^2 + y^2 - (x-y)^2 azonosság miatt azt a szorzást, ami az iterációban kiszámolja a 2*r*i értékét, kicserélhető csak összeadásra és négyzetre emelésre (ami ugye meg táblázatból jön). Így már 47.19 sec (és még nincs kioptimalizálva, csak megnéztem, működik-e), MAXITER = 64 még mindig.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.October.11. 16:27:15
na, sikerült az álom fél perc alá leszorítani... 29.78 sec! :-) 64 iterációval!
http://ep.lgb.hu/jsep/demo/?disk=http%3A%2F%2Fpovi.uw.hu%2Fmfx.com&diskhack=load&autostart=yes&mem=128

128 iterációval is csak 41.58 sec!

az ábra nem pont ugyanaz lesz, mint amikor szorzással számolom az i * r-t, szerintem most pontatlanabb, mert három négyzetre emelésből jön a 2ri, és ezért összeadódnak a kerekítési hibák.
Title: Re: Fraktálok assemblyben
Post by: Povi on 2018.October.11. 17:02:12
példaképpen egy belezoom-olt állapot (50x zoom a kezdőképernyőhöz képest):

szerintem nem rossz (mondjuk azért itt már látszik egy-két pixelhiba), a max. zoom, amit elvisel, az 100x zoom, ott már a szomszédos vertikális pixelek távolsága megegyezik a 16 bites fixpontos szám (Q2.13) felbontásával
Title: Re: Fraktálok assemblyben
Post by: geco on 2018.October.12. 09:47:41
na, sikerült az álom fél perc alá leszorítani... 29.78 sec! :-) 64 iterációval!
Szép teljesítmény :)