Random brojevi u C# nisu nimalo random

poruka: 99
|
čitano: 19.961
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
offline
Re: Random brojevi u C# nisu nimalo random
gorky96 kaže...

 

Nemas blage veze o ćemu govoriš.

Je li ovo kraj bisera nadovezanih na očitu stvar da treba alocirati random seed prije ulaska u petlju, a onda kroz petlju Next() metodom dobiti sekvencu slučajnh brojeva.

Malo me podsjeća na one beskorisne opće forume kad se ovakvi svađaju o tom mogu li krave biti ljubičaste, pa neki pametnjaković primjeti da netko nije stavio zarez na pravo mjesto, pa nadmoćno optuži sve druge za "nepismenoist".

 

Uglavnom, kao što reče pokojni pjesnik Anton Šoljan: "miroljubiv čovjek sam, a pomalo već i star", pa mi nije ni do gorespomenutih općih foruma, niti bih volio da se razina njihove komunikacije primjeni ovdje.

Iliti drukčije rečeno:

"dokazuj se kodom, a ne ovakvim rečenicama".

Poruka je uređivana zadnji put ned 20.5.2012 12:20 (Floki).
16 godina
odjavljen
offline
Re: Random brojevi u C# nisu nimalo random
gorky96 kaže...

Prvo sam pokrenuo puno procesa da procesor bude 100% koristen.

Onda sam pokrenuo program i uslikao sliku.

 

Nakon toga sam zavrsio te programe i pokrenuo opet program.

Tesko za shvatiti?

 

 

Nemas blage veze o ćemu govoriš.

Oprosti, čisto si mogao istaknuti da govoriš o nizu jedinica u rezultatu. Ovako mi je promaklo, a vidim da nisam ni jedini.

 

To opet ne dokazuje da je tvoj pristup ispravan. Kao što je već x puta rečeno, nativna .net Random klasa nije dobro rješenje za kritične primjene, tako da nema smisla obogaljiti kod da bi nekako jedva radio sa Random klasom, već naći neki bolji random generator ukoliko je primjena takva da je to kritično.

Big wheel keep on turning, Proud Mary keep on burning, Trolling, trolling, trolling on the river.
17 godina
offline
Re: Random brojevi u C# nisu nimalo random
rustweaver kaže...
workload kaže...
U C-u ne postoje reference, već samo pokazivači, i tamo & znak predstavlja samo unarni "address operator".

Ne postoje kao tip podatka, da, ali se i dalje proslijedivanje adresa varijabli putem adresnog operatora u C-u kolokvijalno naziva "pass by reference", iako to nije ista stvar kao u npr C++ koji ima bas definirane reference.

 

workload kaže...
Ovo nije da te napadam, vjerujem da razumiješ kak' to sve funkcionira, samo dosta je bitno da se stvari zovu svojim imenom da ne bi bilo previše nesporazuma u komunikaciji.

Sve pet. C# je daleko izvan moje zone djelovanja, mislio sam da je dovoljno slican da cu se moci provuci sa svojim objasnjenjima, ali ocito ne. Bolje da me ti ispravis sada, nego netko drugi kasnije :D

U C# stvari su postavljene malo drukčije nego u C i C++,

Postoje vrijednosni i referencni tipovi čije je ponašanje ovakvo:

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class ReferencniTip
    {
        public int broj;
    }
    struct VrijednosniTip
    {
        public int broj;
    }
    class Program
    {
        static void Main(string[] args)
        {
            ReferencniTip referencniTip = new ReferencniTip();  //instanca ref tipa
            VrijednosniTip vrijednosniTip = new VrijednosniTip(); //instanca vrijed. tipa

            referencniTip.broj = 5; //dodjela vrijednosti člana ref tipa
            vrijednosniTip.broj = 5; //dodjela vrijednosti članu vrijednosnog tipa

            ReferencniTip noviReferencniTip = referencniTip; // instanca dodjeljivanjem
            VrijednosniTip noviVrijednosniTip = vrijednosniTip; // instanca dodjeljivanjem

            noviReferencniTip.broj = 10; //promjena vrijednosti člana ref tipa
            noviVrijednosniTip.broj = 10; //promjena vrijednosti člana vrijednosnog tipa

            Console.WriteLine(referencniTip.broj); //ispis je 10 jer se promjenom vrijednosti člana u noviReferencniTip promjenio i ovaj
            Console.WriteLine(vrijednosniTip.broj); //ispis je 5 jer za vrijednosne tipove vrijedi semantika kopiranja
        }
    }
}

 

Još kad se ovom dodaju ključne riječi out i ref koje se mogu dodati vrijednosnim tipovima, pa tako zahvatiti vrijednost iz metoda promjenom u referencni tip, ili s out jednostavno označiti parametar izlaznim:

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

    class Program
    {
        static void Metod(out int broj)
        {
            broj = 10;
        }
        static void Main(string[] args)
        {
            int broj;
            Metod(out broj);
            Console.WriteLine(broj); //ispis je 10

        }
    }
}

 

U stvari, pokazivači i reference, koji se koriste u C i C++.  kod ovog načina rada nam ne trebaju.

15 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Floki kaže...

U C# stvari su postavljene malo drukčije nego u C i C++,

Vidim ^^

 

Moram priznati da mi je sve ovo novo. Ja nisam dosao dalje od pokazivaca :)

U svakom slucaju hvala tebi i workloadu na utrosenom vremenu da mi objasnite razlike.

Oscar-Mike-Golf Whiskey-Tango-Foxtrot
17 godina
offline
Re: Random brojevi u C# nisu nimalo random
rustweaver kaže...
Floki kaže...

U C# stvari su postavljene malo drukčije nego u C i C++,

Vidim ^^

 

Moram priznati da mi je sve ovo novo. Ja nisam dosao dalje od pokazivaca :)

U svakom slucaju hvala tebi i workloadu na utrosenom vremenu da mi objasnite razlike.

U stvari, ovo je čak lakše od pokazivača

čim imaš referencni tip, ne trebaš pokazivače, a za vrijednosni staviš keyword ref ukoliko treba i gotovo.

16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Programko kaže...

Zanimljiv post al mi neke stvari nisu baš najjasnije 1) kako možeš znati dali je neka instrukcija prefetchana 2) ne poništavali se problem s jmp/je/jne s pipeliningom? Sorry, ako je moje pitanje glupo al taj low level ja zaj... za skužit.

Odgovorit cu ti u rikverc jer je prvo pitanje malo kompliciranije:

Dakle, pipelining ne rijesava problem sa jumpovima jer iako CPU ima tech koji se zove branch prediction, prediktor je poprilicno jednostavan i izgubi se cim pattern nije always true, always false ili naizmjenicni true/false. Izvrsavanje single instrukcije ide u nekoliko faza, nisam tocno siguran ali mislim da su: dekodiranje, citanje memorije, izvrsavanje instrukcije, pisanje u memoriju. Ne koriste sve instrukcije 2 i 4 fazu, ali sve instrukcije prolaze kroz njih.

 

Prije svega, orijentirajmo se samo na 64bitne procesore jer mi je jednostavnije pisati samo za jednu arhitekturu, pravila vrijede i za ostale ali se brojevi mijenjaju.

 

Kako znati da li je funkcija prefetchana?

Nazalost, ne mozes nikako za sigurno to 'isprogramirati', jer CPU nema otvoren interface prema tim pomocnim sklopovima. Jedino sto mozes je upogoniti profiler koji ce ti pokazati ratio cache hit/misses na odredjenim breakpointovima, i onda mozes izmjeriti da li ti neki dio koda valja ili ne. Ako ti je ratio uzasan, to znaci da ti:

1. s arhitetskog gledista, algoritam ne valja, jer ako ti algoritam thrasha cache znaci da obavlja previse posla odjednom. Jednostavno rijeseno sa podjelom u manje funkcije/metode

2. podaci nisu linearno alocirani u memoriji

 

<napisao sam gomilu teksta, ali nemam vremena urediti, pa cu postati kasnije... moram raditi trenutno>

We are the ones that will open your mind, leave the weak and the haunted behind
16 godina
neaktivan
offline
Random brojevi u C# nisu nimalo random

Uf, stvarno sam si uzeo vremena...

 

Dakle..
Zaboravio sam dodati u proslom postu - pipelining pomaze tome da svaki tick mozes odraditi vise instrukcija zbog toga jer ako si prefetchao tocne instrukcije, onda dijelovi pipelinea odradjuju drugacije stvari - dok recimo prvi pipe izvrsava instrukcije, pipe prije njega cita memoriju, a pipe prije toga dekodira slije-slijedecu instrukciju.

 

Da bi prefetch radio punom parom, bitno je pametno organizirati podatke u memoriji, dva najbitnija koncepta su kolokacija i poravnavanje (alignment).

Kolokacija znaci da podaci koji se koriste zajedno budu pospremljeni blizu u memoriji, tako da ih se moze prefetchati. Primjerice, ako imas operaciju mnozenja velikog broja vektora sa matricom, onda je pametno poslagati vektore linearno u memoriju jedan za drugim, tako da prefetch moze pripremiti podatke u L1 cache za CPU prije nego instrukcija koja ih treba dodje na izvrsavanje - sto danas nije jednostavno s obzirom da za jedan takt sabirnice, procesor odradi visestrukto taktova (multiplier). Prvo da objasnim alignment tako da vidis kako podaci dolaze na cache, pa da ti objasnim kako kolocirati podatke tako da budu na cacheu cim ih procesor zatreba.

 

Poravnavanje znaci da podatke koji su u memoriji mozes povuci u minimalnom broju citanja. Primjerice, imas 3D float vektor i 4D vector, koji zauzimaju 12 i 16 byteova, floatovi su x,y,z, w. Ako alociras dva takva vektora u cistu memoriju, to znaci da kad CPU dohvaca drugi vektor, mora odraditi vise od dvije memory read operacije koliko je potrebno za vektor na boundaryu, zasto?

Jer prvi vektor lezi na adresi 0x0, i zauzima slijedecih 12 byteova. 64bitni procesor ce procitati 8 byteova u tiru, sto znaci prva dva floata (x i y), i onda opaliti jos jedan read da procita treci float (z) i prvi float drugog vektora (x2). Naravno, svi ovi readovi se odmah pisu i u L1 cache, efektivno ga thrashajuci s podacima koji su nam korisni (matrica npr) jer upisujemo vrijednosti koje su nam nepotrebne.

Drugi vektor lezi na adresi 0xC (12), a 12 ne mozes faktorizirati sa 8. To znaci da ce procesor prvo procitati 8 byteova pocevsi od adrese 0x8, i maskirati prva 4 bytea, ostavivsi samo x2. Nakon toga, slijedeci read cita y2 i z2 sa 0x10 (16), i onda jos jedan read koji cita w2 i smece. Vektori su mi nekakav realworld primjer, ali oni vec sadrze dosta velike datatipove (float). Uzmi za primjer char koji je velik samo 1 byte, i onda nakon njega neki veliki podatak (array 64 bitnih pointera), i vidjet ces kako zbog alignmenta, trebat ce ti dvostruko veci broj citanja iz memorije nego kad bi bili poravnati, a istovremeno thrashas cache kao veliki jer zbog tog jednog bytea van alignmenta (char), citas po 7 byteva smeca koje maskiras kasnije da bi podatak dosao u registar.

Sveukupno, 5 citanja iz memorije - 5 zauzetih cache linija (koje mogu biti 32 ili 64 bytea). Jedna cijela linija je thrashana zbog loseg alignmenta.

Kako rijesiti problem? Jednostavno - poravnas vec3 na boundary od 16 byteova, sto znaci da ce zadnjih 4 bytea biti padding, odnosno izgubljena memorija. No objekt koji slijedi vec3 u memoriji ce biti poravnan na boundary.

Kako odrediti alignment? Ovisi od compilera do compilera. Ako me sjecanje ne vara, u MSVC-u dodas qualifier __declspec(align(x)) ili nesto tako prije nego deklariras ime tipa (ex: struct __declspec(align(16)) Vec3 {};). U GCC-u na kraju tipa dodas __attribute__((aligned(x))) (ex: struct Vec3 { ... } __attribute__((aligned(16)));

 

Dakle, kako onda kolocirati poravnane podatke da odmah budu na cacheu? U C-u ili C++u, dosta jednostavno - napises svoj alokator, po mogucnosti po uzoru na STL (preko templatea) umjesto in-place alokatora. U svojem alokatoru odredis memory poolove za tipove podataka za koje znas da moraju lezati jedan uz drugi i te adrese vracas, primjerice, uzmes u startu 64MB za vektore i 64MB za matrice. Sve alocirane vektore slazes u prvi pool, jedan za drugim, a sve matrice u drugi. Kad krene mnozenje, CPU ce u prvom tiru traziti matricu koju ce zakaciti negdje u cache, a nakon toga kad krene mnozenje (ex: modelviewmatrix * obj.vertexArray), prefetch moze bez pardona samo kupiti vektore i pisati ih na cache. Umjesto da idlea jer nema podataka, CPU ce doslovce svaki takt odraditi sve cetiri faze pipelinea.

Pritom, imaj na umu takodjer da procesor ne poznaje pointer kao specijalni tip podatka. Iako korisni, pointeri nemaju sto traziti u optimiziranom kodu, zasto? Jer CPU mora prvo procitati pointer, a nakon toga ga dereferencirati.

Prakticno, ako mozes saznati velicinu svoje kolekcije unaprijed - prealociraj memoriju i napravi array, i ako treba fasadiraj ga s nekim custom templatiziranim vektorom - mislim da cak mozes koristiti i STL vector<> ako gurnes u template vlastiti alokator, jer default implementacija koristi copy constructor.

 

Isto dosta bitno, a vezuje se na prosli post o jumpovima je tipican 'isDirty' check koji ljudi znaju ugurati tu i tamo jer misle da pomaze.

Zabluda.

"isDirty" je jump, i moze bez pardona unistiti prefetch jer CPU ne moze zakljuciti da li su podaci dirty ili ne prije nego evaluira jump, i ako je pogrijesio u predikciji - dovidjenja do slijedeceg bus cyclea. Ako je taman pokupio instrukcije, i recimo da imas neki moderni procesor sa multiplierom ~20x (nemam dume koliko se multiplieri krecu danas :-)) - znaci da ce vec treci tick procesor odustati jer je krivo prediktirao instrukcije i ostalih 17 tickova ce idleati bez posla.

 

Danas ljudi ne mare previse za ovo, ali PowerPC-evi su, primjerice, bacali Exception kad bi podaci bili van alignmenta. PS3 ne baca exception, ali pravilno poravnavanje podataka i kolokacija cine razliku izmedju 12FPS-a i 60FPS-a. Zato devovi 'mrze' PS3, jer ne znaju efektivno iskoristiti njegov cell processor, a sve se vrti upravo oko ovih jednostavnih stvari. Uopce nije tesko izracunati alignment za faktor od 8 (ili 4 na 32bitnom procesoru) i dodati alignment u svoj datatip. Vec to ce pomoci oho-ho kod vecine aplikacija. Ako se radi serijska obrada podataka, dakle processing nad nekakvim arrayem ili kolekcijom - napisati alokator nije tako tesko a moze ubrzati stvar i do 30% bez izmjene algoritma!

 

 

BTW - sorry autoru na offtopic i na tldr. Nisam imao pojma u koju drugu temu staviti.

We are the ones that will open your mind, leave the weak and the haunted behind
Poruka je uređivana zadnji put sri 23.5.2012 2:02 (Deus ex machina).
 
6 0 hvala 7
17 godina
neaktivan
offline
Random brojevi u C# nisu nimalo random

Uh, uh, ovo je vec blize mojem podrucju :D. O kakvim to protocnim strukturama govorimo? Na razini ALU-a, memorijske jedinice, memorijske sabirnice, prirucne memorije ili na razini CPU-a?

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
Poruka je uređivana zadnji put sri 23.5.2012 2:11 (1domagoj1).
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

Uh, uh, ovo je vec blize mojem podrucju :D. O kakvim to protocnim strukturama govorimo? Na razini ALU-a, memorijske jedinice, memorijske sabirnice, prirucne memorije ili na razini CPU-a?

Koristeci hrvatske termine, definitivno cu shvatiti o cemu govoris :-P Govori engleski pal, so that the whole world understands ;-)

We are the ones that will open your mind, leave the weak and the haunted behind
Poruka je uređivana zadnji put sri 23.5.2012 2:22 (Deus ex machina).
17 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Deus ex machina kaže...

Koristeci hrvatske termine, definitivno cu shvatiti o cemu govoris :-P Govori engleski pal, so that the whole world understands ;-)

:D

Znaci, pipelining. Na razini ALU-a, MU-a, memory bus-a, cachea ili CPU-a? :P

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

:D

Znaci, pipelining. Na razini ALU-a, MU-a, memory bus-a, cachea ili CPU-a? :P

CPU instruction pipeline: http://en.wikipedia.org/wiki/Instruction_pipeline

Ne idem u arhitekturu CPU-a, vec samo u granicama kako maximalno iskoristiti moderni CPU. Dodaj ako imas stogod da sam propustio!

 

Btw - mozda da netko zatrazi mijenjanje naslova, jer smo ga debelo zaglavili u sasvim drugo podrucje.

 

Steta sto nema gorkya da nas malo poduci o ovome i da par VisualBasic primjera, kad smo svi neznalice.

We are the ones that will open your mind, leave the weak and the haunted behind
Poruka je uređivana zadnji put sri 23.5.2012 2:34 (Deus ex machina).
17 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Deus ex machina kaže...

CPU instruction pipeline: http://en.wikipedia.org/wiki/Instruction_pipeline

Ne idem u arhitekturu CPU-a, vec samo u granicama kako maximalno iskoristiti moderni CPU. Dodaj ako imas stogod da sam propustio!

 

Btw - mozda da netko zatrazi mijenjanje naslova, jer smo ga debelo zaglavili u sasvim drugo podrucje.

 

Steta sto nema gorkya da nas malo poduci o ovome i da par VisualBasic primjera, kad smo svi neznalice.

Dakle, CPU pipeline.


Ugrubo ga mozemo podijeliti na dvije faze (dva stagea): fetch i execute. U biti, prvi RISC procesor, RISC I je imao tako rijesen instruction pipeline, samo sa IF (instruction fetch) i EX (execute).

 

E sad, naravno za faktor ubrzanja obrade veci od 2 treba nam vise pipeline segmenata, a to mozemo dobiti ako podrobnije pogledamo dijagram stanja (state diagram) jednog instrukcijskog ciklusa (instruction cycle). To bi islo otprilike ovako:

 

1) instruction address calculation - dakle, odredujemo adresu instrukcije koja ce se sljedeca izvrsiti. Adresa se dobiva tijekom faze fetch i to povecanjem registra PC (program counter). To je malo zaje*banije kod CISC procesora, posto je tamo iznos promjenjiv i ovisi o vrsti instrukcije (nisu fiksne duljine). Ako se govori o RISC-u tu su stvari jednostavnije posto je iznos povecanja PC-a stalan i ovisi o zrnatosti memorije (memory granularity) i fiksnoj duljini instrukcije. Ovo stanje (iac) moze biti aktivno i u EX fazi ako se radi o instrukciji grananja.
2) instruction fetch - samo ime govori, pribavlja se instrukcija iz memorije. Ovisno o organizaciji memorijskog sustava pribavlja se iz I&D cachea ili main memorije (RAM, jel)

3) instruction operation decoding - dekodiranje operacijskog koda instrukcije da se odredi vrsta operacije i operandi

4) operand address calculation - odreduje se adresa operanda. Moze se referencirati operand u nekom od registara u registarskom skupu procesora (lagano). Moze se referencirati operand u memoriji ili I/O podsustavu - vec teze i moze postati relativno slozeno pogotovo kod CISC arhitekture.

5) operand fetch - dohvacanje operanda. Opet, ovisno o organizaciji mem. sustava, to moze biti iz I&D cachea, glavne memorije ili iz samog skupa registara. oac i of se mogu izmjenjivati ukoliko treba dohvatiti vise operanda.

6) data operation - izvodenje operacije koja je specificirana op kodom instrukcije.

7) result address calculation - racunanje odredisne adrese rezultata. Moze opet biti I&D cache, main mem. ili neki I/O podsustav. Takoder i registar u skupu registara procesora.

8) result store - pohrana rezultata. Upis u memoriju, registar ili I/O podsustav. Takoder i rac i rs se mogu izmjenjivati ukoliko je rijec o instrukcijama s visestrukim rezultatima.

 

Sad ovo malo analiziramo i mogli bi fino napraviti pipeline s 5 segmenata:

IF - instruction fetch

ID-OF - dekodiranje instrukcije (instruction decoding) i dohvat operanda (operand fetch)

EX - execute, izvrsavanje instrukcije

ME(M) - memory access, pristup memoriji

WB - write back, upis rezultata ili podataka

 

IF - pribavljamo instrukciju iz cachea i to onu na koju pokazuje PC, a PC se automatski uveca za 4 (govorim o 32-bitnim RISC procesorima s bajtnom zrnatoscu - byte granularity). To se izvodi pomocu potpunog zbrajala (full adder) u segmetu IF. Zatim se pribavljena instrukcija i obnovljeni PC dostavljaju ID-OF-u preko pipeline registra IF/ID-OF

ID-OF - zatim ta instrukcija iz IF/ID-OF registra ulazi u instruction register segmenta ID-OF i tu se dekodira. Ovo je sad bitno, u isto vrijeme s dekodiranjem op koda dohvacaju se operandi (operand fetch) i privremeno se spremaju u pipeline registru ID-OF/EX.

 

Zasto je moguce u isto vrijeme dekodirati op kod i dohvacati operande? Naime, ako je rijec o instrukciji tipa register-register, tada operandi dohvaceni iz skupa registara zaista i jesu podaci koje trazimo. Ako je u pitanju load/store instrukcija ili branch instrukcija, opet je sve okej jer se dalje ti dohvaceni podaci koriste u EX segmentu za oblikovanje efektivne adrese memorijske lokacije kojoj cemo pristupiti u MEM segmentu. Ako se dode do zakljucka da je dekodirana instrukcija branch instrukcija, tada se oblikovana adresa u EX segmentu (a privremeno je spremljena u EX/MEM pipeline registru) povratnom vezom (feedback valjda) salje u IF segment i onda se preko multipleksora MUX upisuje u PC.

 

EX - u EX-u se izvrsava logicka ili aritmeticka operacija nad dohvacenim podacima. Opet, ako je rijec o load/store ili branch instrukcijama, tad se ALU koristi za izracunavanje efektivne adrese koju trebamo u MEM segmentu ili u slucaju brancha u IF segmentu (feedback).

 

MEM - ako je rijec o load instrukciji, koristimo efektivnu adresu iz EX za pristup podatku u cacheu. Taj se podatak zatim privremeno sprema u MEM/WB pipeline registar. Ako je rijec o store instrukciji, podatak iz EX/MEM registra sprema se u memoriju. Ako je rijec o AL instrukciji, nema aktivnosti u MEM segmentu jer su to instrukcije tipa reg-reg i ne koriste pristup memoriji. Rezultat takve AL operacija direktno se prosljeduje pipeline registru MEM/WB.

 

WB - upisivanje podatka natrag u skup registara. Ako je rijec o load instrukciji ili AL instrukciji, podatak koji je bio pohranjen u pipeline registru MEM/WB upisuje se u neki registar u skup registara. Ako je rijec o store instrukciji u WB se nista ne dogada.

 

E sad, naravno, tu postoji faza "punjenja" pipelinea i uspostavljanja istoga. Nakon nekog vremena utrosenog na "punjenje" pipelinea (4ts) dolazi dugi period gdje su svi segmenti aktivni. Isto je i za "praznjenje". To uglavnom jako lijepo izgleda, ide IF, pa onda novi IF dok se onaj stari nastavlja na ID-OF, pa onda dolazi novi IF, ID-OF od onog drugog IF-a te se onaj prvi ID-OF nastavlja na EX itd...

 

E sad, tu postoje i razno-razni hazardi i njihovi podtipovi: strukturni hazard (structural hazard), podatkovni (data hazard), upravljacki hazardi (control hazards) i nacini za njihova rjesavanja itd itd, to mi se neda jer je vec ful kasno i tako to, jel. xD

 

Napomena, ovo je pisano za RISC procesore gdje je sve to lijepo i pravilno, isto se moze primjeniti kod CISC procesora, samo je to malo drugacije posto razni stageovi mogu razlicito trajati ovisno o tipu instrukcije pa tu dolazi do natjecanja za pipeline segmente pa se to rjesava onda na malo drugacije nacine. Ovo je ugrubo podjela, ovisno o procesoru pipeline moze biti izveden i drugacije (s recimo, vise segmenata). Takoder treba imati i na umu, da su danasnji procesori poprilicno komplicirani i da nema stroge RISC/CISC podjele.

 

Uglavnom, nadrobih hrpu gluposti koja nema veze s nicim, kome se neda citati, sry. :D

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

Ma super je post! Nisam citao detalje o arhitekturi CPU-a valjda 10 godina... planiras biti CPU designer?

 

Apropos RISC-ova i CISC-ova: kao sto sigurno znas, razlikuju se samo u instruction setu (reduced vs. complex). No, ako izuzmes "velike" CPU-ove - vecina PIC-ova i AVR-ova danas su RISC procesori :-) Ali cuo sam da je neki link uspio scompilirati neki Linux micro kernel za ATmega16 :-)

We are the ones that will open your mind, leave the weak and the haunted behind
15 godina
neaktivan
offline
Random brojevi u C# nisu nimalo random

Ja neznam kako je došlo do ovog ravoja teme ali ok. Kad ste već počeli...

Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
King of Games kaže...

Ja neznam kako je došlo do ovog ravoja teme ali ok. Kad ste već počeli...

To si ti kriv! Rekao si da se neces brinuti o alokacijama i vidi sta si izazvao!!! :-D

We are the ones that will open your mind, leave the weak and the haunted behind
17 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Deus ex machina kaže...

Ma super je post! Nisam citao detalje o arhitekturi CPU-a valjda 10 godina... planiras biti CPU designer?

 

Apropos RISC-ova i CISC-ova: kao sto sigurno znas, razlikuju se samo u instruction setu (reduced vs. complex). No, ako izuzmes "velike" CPU-ove - vecina PIC-ova i AVR-ova danas su RISC procesori :-) Ali cuo sam da je neki link uspio scompilirati neki Linux micro kernel za ATmega16 :-)

Hm, ne bas, zanimljivo je, ali nije da me sad bas toliko privlaci. A osim toga imas svega par firmi na svijetu koje se time bave, tri vece za opcenamjenske procesore (Intel, AMD, ARM) i tu jos neke manje firme, te onda jos imas firme kao Atmel, Microchip Technology (PIC) i sl. Ali smatram da je to prilicno korisno znati, stoga sam i otisao na racunalno inzinjerstvo.

 

Tako je RICS i CISC se razlikuju u instruction setu, a upravo to komplicira CISC :D. CISC ima takve lude instrukcije za sve i svasta, sto komplicira samu arhitekturu, a da ne pricam onda jos i o posljedicama toga, milijun i jedan nacin adresiranja, instrukcije razlicite velicine i trajanja (neke traju 1 takt, neke 3, 4...), itd itd...

 

Jes, PIC-ovi i AVR-ovi su RISC procesori, oba Harvardska arhitektura ako se ne varam.

 

A cuj, Linux kernel bi se valjda i za kamen mogao iskompajlirati te bootati OS s istoga {#}.

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
Poruka je uređivana zadnji put sri 23.5.2012 23:22 (1domagoj1).
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

....

Tako je RICS i CISC se razlikuju u instruction setu, a upravo to komplicira CISC :D. CISC ima takve lude instrukcije za sve i svasta, sto komplicira samu arhitekturu, a da ne pricam onda jos i o posljedicama toga, milijun i jedan nacin adresiranja, instrukcije razlicite velicine i trajanja (neke traju 1 takt, neke 3, 4...), itd itd...

 

Jes, PIC-ovi i AVR-ovi su RISC procesori, oba Harvardska arhitektura ako se ne varam.

 

A cuj, Linux kernel bi se valjda i za kamen mogao iskompajlirati te bootati OS s istoga {#}.

Ali zato sa tim ludim instrukcijama lijepo pomnozis dva vektora u jednom ticku :-) Mene to odusevljava, jos da vidis kako se razgalim kad vidim da mi je compiler sam to skuzio i scompilirao assembly koji to koristi :-)

 

Ovo zadnje, da vec nemam sign koji volim, evo ga :-D Rofl :-D

We are the ones that will open your mind, leave the weak and the haunted behind
13 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
King of Games kaže...

Ja neznam kako je došlo do ovog ravoja teme ali ok. Kad ste već počeli...

Ma tema je super, čim uhvatim vremena detaljno ću isčitati i podjeliti TU i Hvala na mnoge postove. Ti si dobio ono što si tražio, ali ovo je super za naučiti dosta toga, pogotovo ovaj post iznad od 1domagoj1, arhiva...

Jest da je gorky96 malo valjao gluposti, ali... {#}

13 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

A osim toga imas svega par firmi na svijetu koje se time bave, tri vece za opcenamjenske procesore (Intel, AMD, ARM) i tu jos neke manje firme, te onda jos imas firme kao Atmel, Microchip Technology (PIC) i sl. Ali smatram da je to prilicno korisno znati, stoga sam i otisao na racunalno inzinjerstvo.

 

 

Tako je RICS i CISC se razlikuju u instruction setu, a upravo to komplicira CISC :D. CISC ima takve lude instrukcije za sve i svasta, sto komplicira samu arhitekturu, a da ne pricam onda jos i o posljedicama toga, milijun i jedan nacin adresiranja, instrukcije razlicite velicine i trajanja (neke traju 1 takt, neke 3, 4...), itd itd...

 

Jes, PIC-ovi i AVR-ovi su RISC procesori, oba Harvardska arhitektura ako se ne varam.

 

 

Nedostaje ti na popisu bivša Motorola (sadašnji Freescale) i njihov 68k (sada se prodaje pod raznim HC i HCS verzijama)?

Mislim da još uvijek prestižu i Atmel i Microchip po broju prodanih komada.

Tu je još i gomila manjih firmi koje modificiraju 8051/8052 (prije par godina sam radio nešto s jednom varijantom 8051 na 100MHz :D ).

 

Uz to dolaze još firme koje sada više-manje čine Renesas (Hitachi, Mitsubishi, NEC).

Kod nas nisu toliko poznati, jer su Atmel i Microchip bili dovoljno jeftini za hobi razvoj pa su zbog toga i popularni, ali NEC procesori i mikrokontroleri su također imali dobar dio tržišta.

Za razliku od Atmela i Microchipa, kod njih ima i nešto CISC jezgri u upotrebi.

 

Uređaji gdje se još radi CPU dizajn za manje količine su raznorazni ZigBee, XBee i slični radiokomunikacijski uređaji male snage.

Radio sam nedavno nešto s jednim koji je kao CPU imao neku od IP jezgri sa OpenCores stranice. :)

 

A što se tiče PIC-eva i AVR-ova, zadnji "mali" PIC-evi su oni iz PIC24 obitelji (16-bitna jezgra sa dodanim DSP ekstenzijama), a PIC32 ima MIPS jezgru.

Atmel je napravio svoj AVR32 i kao i za PIC32, osim naziva firme to više nema veze s onim 8-bitašima.

 

Mikrokontroleri danas uglavnom koriste Harvard arhitekturu, ali donedavno najpopularniji ARM za embedded tržište (ARM7TDMI) je rađen po von Neumann-ovoj.

 

Ovo je sada debeli oftopik.

16 godina
odjavljen
offline
Random brojevi u C# nisu nimalo random

Radio sam jedan simulatoričić ruleta (testirali smo teoriju jel se duplanjem uloga nakon promašaja može zaraditi) pa sam se sjetio ove teme. Koristi Random klasu (seed je vrijeme u milisekundama) pa ju tu možete vidjeti u akciji.

 

To je ta Random klasa (ostatak sourcea na PP, ružan je ko smrt pa da mi se ljudi ne smiju ovdje {#})

 

        private void randomizer()
        {
            // randomizer, daje broj u rasponu 0-36 na osnovu sistemskog vremena
           
            Random rnd = new Random(DateTime.Now.Millisecond);

            for (int i = 0; i < 100; i++)
            {
                rezultat = rnd.Next(0, 36);
            }
        }

 

Link na program (skenirano sa Avirom i BitDefenderom na uploadu). I screenshot.

Baš i nemam sreće... Baš i nemam sreće...
http://nighthawk-software.blogspot.com/
Poruka je uređivana zadnji put čet 7.6.2012 18:02 (Sum_of_all_fears).
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Sum_of_all_fears kaže...

...

Ne razumijem bas teoriju?

Jel ideja ta da su sanse da pogodis 50/50, pa ako duplas ulog, eventually ces naletjeti na pogodak i tako otplatiti gubitak?

We are the ones that will open your mind, leave the weak and the haunted behind
16 godina
odjavljen
offline
Re: Random brojevi u C# nisu nimalo random

Da, to je teorija.

http://nighthawk-software.blogspot.com/
17 godina
online
Random brojevi u C# nisu nimalo random

S obzirom da šanse nisu 50-50, uzalud ti trud :)

Always code as if the one ending up maintaining your code is a violent psychopath who knows where you live
Moj PC  
1 0 hvala 0
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
Sum_of_all_fears kaže...

Da, to je teorija.

vidio screense , zgodno izgleda , nažalost beskorisno. rulet ima 37 brojeva. 1 - 36   + 0. Ako i igraš recimo samo na boju pokrivaš uvijek jedno polje manje tako da kad tad padaš u vodu.Kuća je osigurala dobitak čim si kročio tamo. Presumpcija da su šanse 50:50 je kriva , dobro ako imaš good luck tu večer , dižeš lovu.Idi par večeri ili tjedana za redom i teorija pada u vodu na dno kao beton. 

 

50:50 != (18 + 19);

 

Iskušano.

 

Svejedno , zgodno izgleda programčić.

17 godina
neaktivan
offline
Random brojevi u C# nisu nimalo random

Pa ono, ako cemo uzeti u obzir zakon velikih brojeva u teoriji vjerojatnosti koji kaze da kod velikog broja npr. bacanja novcica omjer izmedu pojavljivanja glave i pisma ce teziti jednakom broju. Taj veliki broj bacanja je kad bacanja teze u beskonacnost :D, pa stoga sumnjam da Sum ima vremena igrati rulet u beskonacnost, stoga da, kuca ipak dobiva :P

 

Vjerojatnosti inace imaju veliku ulogu u kvantnoj mehanici, stvari zbilja postaju zanimljive kad se malo ude u dubinu. Iako strasno neintuitivne i zbrkane.

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

Pa ono, ako cemo uzeti u obzir zakon velikih brojeva u teoriji vjerojatnosti koji kaze da kod velikog broja npr. bacanja novcica omjer izmedu pojavljivanja glave i pisma ce teziti jednakom broju. Taj veliki broj bacanja je kad bacanja teze u beskonacnost :D, pa stoga sumnjam da Sum ima vremena igrati rulet u beskonacnost, stoga da, kuca ipak dobiva :P

 

Vjerojatnosti inace imaju veliku ulogu u kvantnoj mehanici, stvari zbilja postaju zanimljive kad se malo ude u dubinu. Iako strasno neintuitivne i zbrkane.

 

Vidi molim te moj post ispred svog. Ovdje nije riječ o omjeru 50:50 kao kod pismo glava na novčiću.

ponovo :: radi se o 37 brojeva 1-36 + 0

Ako ideš na 50:50 opciju onda pokrivaš npr samo parne brojeve ili neparne ili samo crvenu ili .......

U svakom slučaju jedan broj je više u samom startu na strani kuće.

Pokriješ recimo crveno = 18 polja za tebe 

Kuća u tom trenu ima crno = 18 + 0(zeleno) = 19

 

 

Inače da je vjerovatnost neinuitivne prirode općenito je više nego točno.

Konkretno na ruletu svjedočio sam puno puta da pada npr. crno toliko za redom da pop....š

Rekord je bio koliko se sjećam 19 puta za redom jedna te ista boja, bilo prije par godina , dugo već nisam kročio tamo.

 

you can't win the house

 

Poruka je uređivana zadnji put pet 8.6.2012 12:13 (nik_02).
17 godina
neaktivan
offline
Random brojevi u C# nisu nimalo random

Krivo si shvatio. Nema veze novcic, primjer s novcicem je tek to, primjer.

 

Ovisi kako su ta polja na ruletu rasporedena, nisam se nikad zanimao za rulet pa ne znam. Ali po ovoj slici sto si stavio, moze se izracunati vjerojatnost da kuglica padne u zeleno podrucje ili da padne u crveno ili u neko od ova dva bijela, ili kak to vec ide. Kad bi igrali jako puno igara (ali bez nekakve manipulacije, da sloze mehanizam tako da se jedna vrijednost dobiva vise od druge i sl.), dobili bi upravo rezultate koje smo izracunali. Prema tom zakonu, jel.

 

Ali to ne znaci odigrati 5, 10, 20 igara. To nije velik broj. Mozda oko tisucu odigranih, par tisuca ili cak par stotina tisuca i onda ces poceti primjecivati u svoj toj masi igara da se pojavljuje "pravilnost" koju smo izracunali.

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
 
0 0 hvala 0
16 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
1domagoj1 kaže...

Krivo si shvatio. Nema veze novcic, primjer s novcicem je tek to, primjer.

 

Ovisi kako su ta polja na ruletu rasporedena, nisam se nikad zanimao za rulet pa ne znam. Ali po ovoj slici sto si stavio, moze se izracunati vjerojatnost da kuglica padne u zeleno podrucje ili da padne u crveno ili u neko od ova dva bijela, ili kak to vec ide. Kad bi igrali jako puno igara (ali bez nekakve manipulacije, da sloze mehanizam tako da se jedna vrijednost dobiva vise od druge i sl.), dobili bi upravo rezultate koje smo izracunali. Prema tom zakonu, jel.

 

Ali to ne znaci odigrati 5, 10, 20 igara. To nije velik broj. Mozda oko tisucu odigranih, par tisuca ili cak par stotina tisuca i onda ces poceti primjecivati u svoj toj masi igara da se pojavljuje "pravilnost" koju smo izracunali.

 

I GIVE UP.

Ne znam kako ti nije jasno nakon što sam ti napisao već par puta da 18/19 != 1 , priložio sliku , naveo primjer itd.....

 

Tko je shvatio , shvatio , tko ne po parsto kuna u džep i pravac ispitat teoriju ili možda par soma eura da igra traje duže pa ipak možda pobijedimo svemir... ha ha ha

 

FINAL:

TEŠKO JE KUĆU DOBITI I NA KRATKE STAZE A NA DUGE KOJE SE POZIVAŠ ; PA UPRAVO U NJIMA I GUBIŠ SVEEEE.

Ajde vidi zadnjih 5-6 postova i pročitaj doslovno svaku riječ , ne prolazi kroz njih letimice.

 

log-out

I GIVE UP.

 

 

17 godina
neaktivan
offline
Re: Random brojevi u C# nisu nimalo random
nik_02 kaže...
log-out

I GIVE UP.

Same here.

 

Ionako je offtopic.

C provides a programmer with more than enough rope to hang himself. C++ provides a firing squad, blindfold and last cigarette.
16 godina
odjavljen
offline
Random brojevi u C# nisu nimalo random

Da se razumijemo, nisam ja razvio teoriju (nemam ja vremena za takve bedastoće {#}) nego 2 frenda. Ja sam njima uporno govorio da šanse nisu 50-50 a oni su rekli da nema veze, da vrijedi probat. Rekao sam da im treba i 0 (zeleno) u ulogu al su rekli da nije potrebna, da nju računaju kao promašaj i da igraju samo sa crvenom/crnom. Pa sam im napravio program po njihovim željama.

 

A teorija ne vrijedi, to je jasno. The house always wins.

 

[edit] - svrha ovog (za mene) je bilo učenje - generiranje random broja, utvrđivanje raspona u kojem se broj nalazi i "igranje" sa dobivenim vrijednostima. Zgodna vježbica.

http://nighthawk-software.blogspot.com/
Poruka je uređivana zadnji put pet 8.6.2012 13:08 (Sum_of_all_fears).
Moj PC  
1 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice