Sivut

Kommentit (134)

Neutroni
Seuraa 
Viestejä31925

Kyttääjä kirjoitti:
Joskus 80 tai 90 -luvulla tuli Yleltä ohjelma, jossa oli laskettu Mandelbrotin joukon zoomausvideo. Jos olisi käytettävissä laskutehoa, suunnittelisin ja värittäisi fraktaalizoomausvideon ajan kanssa. Näillä laskutehoilla kaaokseen sisältyvää järjestystä saisi laskea kymmenen vuotta, jotta saisi aikaiseksi muutaman minuutin zoomausvideon.

Siinä videossa ei menty kovin syvälle, ja sen laskisi nykyaikaisella PC:llä (joka on tehokkaampi kuin senaikaiset supertietokoneet) tunnissa. En edelleen tajua mitä ihmettä haluat laskea, jos tarvitset vuosia prosessoriaikaa. Niin kuin tuossa linkitetyssä videossa näkyy, Mandelbrot toistaa itseään ikuisesti. Saat hyvin kauniita videoita varsin maltillisilla ajoilla. Ilmeisesti sinulla on jokin oleellisesti suorituskykyä rampauttava ongelma jossain.

Lainaus:
Maksimi-iteraatiosyvyyteen tarvitsee harvoin mennä, mutta se on 2048 tai 4096, jotta mustia aukkoja ei tule.

Jos lasketaan 1080 x 720 HD videota ja käytetään 2*2 antialiasointia ja 4096 maksimisyvyyttä, yksi frame tarvitsee maksimissaan 13 miljardia iterointia (jos koko kuva-ala on joukon alueella, mikä on sinänsä epämielenkiintoinen alue). Jos nyt arvioidaan maltillisesti, että PC pystyy miljardiin iterointiin sekunnissa, se tekee 13 sekuntia per frame. Tunnissa laskee siis 276 frametta eli 4.6 s 60p videota. Yön yli 10 tunnissa laskee jo melkein minuutin ja vuorokaudessa vajaat kaksi minuuttia. Ja tuo siis jos ollaan koko ajan mustalla alueella.  Käytännössä näyttävimmät rakenteet ovat joukon ulkopuolella ja sinun arvioimalla keskimääräisellä iteraatiomäärällä (jonka voin vahvistaa omasta kokemuksesta päteväksi kiinnostavalla alueella) frameja tulee liki kymmenkertainen määrä. Vartin videon renderöi vuorokaudessa, ja pitempään täytyy jo keksiä jotain erikoista, jotta se ei alkaisi toistaa itseään liikaa.

Lainaus:
Jos Maksimi-iteraatiosyvyys on esimerkiksi 256, kuva täyttyy mustista aukoista jo muutaman zoomauksen jälkeen. Keskimääräinen iteraatiosyvyys on (värien perusteella) jotain 256-512 luokkaa.

Tuokin on minusta erikoinen kuvaus asialle. Minä koen, että se (yleensä musta) joukko levähtää jos iteraatiomäärä on liian pieni.

Kyttääjä
Seuraa 
Viestejä967

Neutroni kirjoitti:
En edelleen tajua mitä ihmettä haluat laskea, jos tarvitset vuosia prosessoriaikaa. Niin kuin tuossa linkitetyssä videossa näkyy, Mandelbrot toistaa itseään ikuisesti. Saat hyvin kauniita videoita varsin maltillisilla ajoilla. Ilmeisesti sinulla on jokin oleellisesti suorituskykyä rampauttava ongelma jossain.

Voi olla niinkin päin, ettet ole koskaan yrittänyt laskea tarkasti kaaokseen sisältyvää järjestystä, etkä sen vuoksi hahmota, kuinka paljon prosessointia se vaatii. Kyllä sen kaaoksen laskee sekunneissa, jos tarvitsee vain yksi iteraatioluuppi per pixeli.

Vertaa oheista mössöä viestissä 47 laskettuun kaaoksen järjestykseen. Mittakaava on sama:

xmin=-0.76006996596715525880, xmax=-0.76006996304403351420
ymin=+0.08282731035370781425, ymax=+0.08282731320668973440

Sisältö jatkuu mainoksen alla
Sisältö jatkuu mainoksen alla
Kyttääjä
Seuraa 
Viestejä967

Ohessa on laskettu samaan kuvaan kompleksitason, j ja k -akselin sekä l ja m -akselin Mandelbrotin joukot. Kuvat menevät limittäin niin, että luultavasti zoomauksessa ne eivät leikkaa. Pitää laskea niitä zoomauksia paremmalla ajalla.

Neutroni
Seuraa 
Viestejä31925

Kyttääjä kirjoitti:
Voi olla niinkin päin, ettet ole koskaan yrittänyt laskea tarkasti kaaokseen sisältyvää järjestystä, etkä sen vuoksi hahmota, kuinka paljon prosessointia se vaatii. Kyllä sen kaaoksen laskee sekunneissa, jos tarvitsee vain yksi iteraatioluuppi per pixeli.

Vertaa oheista mössöä viestissä 47 laskettuun kaaoksen järjestykseen. Mittakaava on sama:

xmin=-0.76006996596715525880, xmax=-0.76006996304403351420
ymin=+0.08282731035370781425, ymax=+0.08282731320668973440

Yritätkö keskiarvoistaa tuota hienodetaljia? Sitten se menee harmaaksi (tai keskiarvoksi niistä väreitä mitä käytät). Käytä ennemmin jotain sopivaa funktiota, joka saturoituu kohti maksimia. Esim. juuria, logaritmeja tai rationaalifunktiota tai niiden yhdistelmiä. Se siistii tuota ylihienojen detaljien aluetta paljon paremmin ja antialiasointiin riittää 2*2 näytteen keskiarvoistus (tai 3*3, jos haluat hifistellä tai laskea yksittäisiä kuvia).

Minun esimerkkikuvassa maksimi on 4096. Iteraatioarvoihin käytetään funktiota 0.5*pow(i,0.3) ja tuloksen desimaaliosa määrää värin, joka käy punaisesta valkoisen kautta siniseen ja taas valkoisen kautta punaiseen. En ole kovin hyvä luomaan hienoimpia mahdollisia väripaletteja, kuten ehkä huomaa, mutta tuon funktion vaikutus pitäisi näkyä. Tuon kuvan laskemiseen ja näytölle piirtämiseen tuon kokoisna menee ehkä noin kolmasosasekunti.

Antialiasointi tehdään sitten niin, että lasketaan joka pikselille 2 x 2 väriarvoa (r, g ja b), ja keskiarvoistetaan ne. Ei iteraatioiden määrää tai välituloksia. Minä teen niin, että lasken iteraatioiden määrän taulukkoon ja säädän sitten värit erikseen, niin ei tarvitse laskea fraktaalia joka kerta erikseen.

Käyttäjä18034
Seuraa 
Viestejä329

HuuHaata kirjoitti:
Satunnaisuudella tarkoitan tässä siis termistä fluktuaatiota fysiikassa, tai jotain muutakin satunnaisuuden muotoa, joka aiheuttaa sen ettei kaksi simulaatiota koskaan ole samanlaisia.

Onpas upeita kuvia fraktaaleista, kiitos, suorastaan aiheuttavat myönteisiä elämyksiä.

Siihen aikaan kun tietokoneiden laskureilla jo jotain teki, kiinnosti ohjelmoida Mooseksen kirjoissa mainitut tähtitieteelliset maininnat ja verrata siihen, mitä mainittiin tapahtuneen kansan historiassa. Jos tapahtumat olisivat ristiriidassa tähtitieteen kanssa, kriitikot olisivat oikeassa uskotellessaan, että tapahtumat ovat keksittyjä tai kirjoitettu jälkeenpäin.

Esim ohjelmointi laskuriin sukuluetteloiden aika Jeesuksesta Aabrahamiin. Laskuri näytti, että Egyptistä lähtö oli 1513 eaa, ja niisankuun 14 päivästä, jolloin oli täysikuu, kului tietty määrä päiviä jolloin mannaa alkoi tulla ja sen oli oltava tietty viikonpäivä suhteessa pääsiäisyönä tapahtuneen lähdön viikonpäivän kanssa. Ei ollut ristiriitaa.

Samalla metodilla saattoi laskea sen vuoden, jolloin Jeesus syntyi ja jolloin teloitettiin, koska Raamatussa ja sen ulkopuolisessa historiassa mainitaan, millaisia ilmiöitä (mm. auringon pimennykset) kyseisinä aikoina tapahtui. Nehän oli merkitty muistiin, koska niiden yhteydessä mainittiin tunnettujen hallitsijoiden hallitusvuosien aika, suhteessa Jeesuksen syntymävuoteen.

Tietokoneella oli helppo laskea, mitä auringonpimennykset olivat täysiä, mitkä osittaisia, ja nähdä niistä, mikä oli oikea, ja siten todeta, että Jeesuksen maanpäällä olemisen aika voidaan helposti tarkistaa 2000 vuotta myöhemmin tähtitieteen ja tietokoneen laskurin avulla.

Myös se oli kiinnostava aihe laskea väestönlaskentakaaviolla, montako ihmistä kuului kansaan Egyptistä lähdettäessä ja todeta, että väkimäärää ei oltu liioiteltu, kuten jotkut väittävät.

Kyttääjä
Seuraa 
Viestejä967

Neutroni kirjoitti:
Minun esimerkkikuvassa maksimi on 4096. Iteraatioarvoihin käytetään funktiota 0.5*pow(i,0.3) ja tuloksen desimaaliosa määrää värin, joka käy punaisesta valkoisen kautta siniseen ja taas valkoisen kautta punaiseen

Voisi mennä jakeluun paremmin, jos laitat iterointifunktion näytille? Ymmärrän  asioita enemmän vasta sen jälkeen, kun on itse tehnyt (debugannut koodin) ja testannut.

Eusa
Seuraa 
Viestejä17097

Kivahan näitä on kokeilla. Vuonna 1983 oli varsin kärsivällisyyttä vaativaa puuhaa.

Hienorakennevakio vapausasteista: (1+2¹+3²+5³+1/2¹*3²/5³)⁻¹ = 137,036⁻¹

Neutroni
Seuraa 
Viestejä31925

typedef struct frame_str {
double kx,ky; //keskipiste
double koko; //koko (lyhyempi sivu keski-koko - keski+koko)
double dx,dy; //derivaatan suunta
double jx,jy; //piste julian laskemista varten
unsigned int w,h; //framen koko
unsigned int maxit; //iteraatioiden määrä
unsigned int tyyppi;
unsigned int antialias;
unsigned int framenum; //framen numero animaatiossa
unsigned int w4,br; //4:llä jaollinen leveys ja bitmapin rivin pituus tavuina
unsigned int liput; //liput kertovat laskentathreadeille mitä halutaan
unsigned char *bmap; //kuva bitmap -formaatissa
double *data; //data raakana (antialiasoinnin verran suurempana kuin koko)
struct vari_str *vari; //väristruktuuri
} str_frame;

Neutroni
Seuraa 
Viestejä31925

//Laskee rivin Mandelbrotia eksponentilla 2
//26.9.2015
void frakMandelbrot2(str_frame *fr, unsigned int rivi, double *data)
{
  __m256d ix0={0.5,1.5,2.5,3.5},ix,x0,xker;
  __m256d ax,ay,bx,by,bx2,by2,t,cnt;
  __m256d v1={1.0,1.0,1.0,1.0},v4={4.0,4.0,4.0,4.0};
  double a,b,lx,ly;
  unsigned int x,y,xm,tst;
  int i;

  if(fr->w > fr->h) {                                                //lasketaan koko pitemmässä suunnassa
    ly=fr->koko; lx=fr->w*ly/fr->h;
  } else {
    lx=fr->koko; ly=fr->h*lx/fr->w;
  }

  xm=(fr->w*fr->antialias+3) & (~3);                                  //x-rivin pituus 4:lle jaolliseksi
  a=2.0*lx/xm;   xker=_mm256_broadcast_sd(&a);
  a=fr->kx-lx;   x0=_mm256_broadcast_sd(&a);

  for(y=0;y<fr->antialias;y++) {                                     //lasketaan antialiasoinnin verran rivejä
    a=fr->ky+ly*(-1.0+2.0*(rivi+(0.5+y)/fr->antialias)/fr->h);   //y-koordinaatti
    ay=_mm256_broadcast_sd(&a);
    ix=ix0;
    for(x=0;x<xm;x+=4) {
      ax=_mm256_mul_pd(xker,ix);
      ax=_mm256_add_pd(ax,x0);

      bx=ax; by=ay;
      i=0; cnt=_mm256_xor_pd(ax,ax);
      do {
        bx2=_mm256_mul_pd(bx,bx);
        by2=_mm256_mul_pd(by,by);
        t=_mm256_add_pd(bx2,by2);
        t=_mm256_cmp_pd(t,v4,_CMP_LT_OQ);
        tst=_mm256_movemask_pd(t) & 15;
        if(tst==0) goto Valmis;
        i++; if(i>fr->maxit) goto Valmis;
        t=_mm256_and_pd(t,v1);
        cnt=_mm256_add_pd(t,cnt);

        by=_mm256_mul_pd(bx,by);
        by=_mm256_add_pd(by,by);
        by=_mm256_add_pd(by,ay);
        bx=_mm256_sub_pd(bx2,by2);
        bx=_mm256_add_pd(bx,ax);
      } while(1);
Valmis:
      _mm256_store_pd(data,cnt); data+=4;
      ix=_mm256_add_pd(v4,ix);
    }
  }
}

Neutroni
Seuraa 
Viestejä31925

Tuo funktio laskee siis iteraatiot. Threadit varaavat ja laskevat rivin kerrallaan, kunnes frame on valmis.

Haluatko kenties koko sorsan? Se on tehty Microsoftin Visual Studiolla (2015) ja siinä on jotain Microsoftin spesifisiä juttuja (ja tietytsi se kutsuu Windowsin APIa).

Kyttääjä
Seuraa 
Viestejä967

Neutroni kirjoitti:
Tuo funktio laskee siis iteraatiot. Threadit varaavat ja laskevat rivin kerrallaan, kunnes frame on valmis.

Haluatko kenties koko sorsan? Se on tehty Microsoftin Visual Studiolla (2015) ja siinä on jotain Microsoftin spesifisiä juttuja (ja tietytsi se kutsuu Windowsin APIa).

Tuossa riittää debugaamista ja ymmärtämistä aivan riittämiin. Visual Studion koodi ei sellaisenaan käänny Borlandilla.

Eusa
Seuraa 
Viestejä17097

Mielipiteeni: ei ole mielekästä zoomailla tunnettuja fraktaaleja vaan kehittää omalla matematiikalla.

Hienorakennevakio vapausasteista: (1+2¹+3²+5³+1/2¹*3²/5³)⁻¹ = 137,036⁻¹

Sivut

Suosituimmat

Uusimmat

Sisältö jatkuu mainoksen alla

Uusimmat

Suosituimmat