Arhitectură dataflow
Arhitectura de tip dataflow este o arhitectură a unui calculator care contrastează în mod direct tradițional arhitectura von Neumann sau cea de control al fluxului. Arhitecturi de tip dataflow nu conțin un counter (registru al adresei instrucțiunii ce este sau urmează să fie executată) sau (cel puțin conceptual) capacitatea de a executa instrucțiuni este exclusiv determinată pe baza disponibilității argumentelor de intrare ale instrucțiunilor. Deși nicio componentă hardware cu scop general ce folosește o arhitectură de tip dataflow nu a înregistrat niciun succes comercial, acest lucru s-a compensat prin implementarea unei astfel de arhitecturi cu succes în hardware specializate, cum ar fi în cele pentru procesarea a semnalului digital, rețele de rutare, de procesare grafică și, mai recent, în data warehousing. Această implementare a devenit foarte relevantă în multe arhitecturi software actuale, inclusiv când vine vorba despre design-ul motoarelor de căutare în baze de date și a rețelelor de calculatoare cu putere de calcul în paralel.
Arhitecturile de tip dataflow sincronizate tind să ajusteze și să sincronizeze volumul de informații prezente în aplicații ce se desfășoară în timp real. Arhitecturile de tip data flow ce au o natură deterministă permit programatorilor să rezolve task-uri complexe precum sincronizări și accesul la resurse comune.
În anii 1980, precum și începutul anilor 1990, arhitecturile hardware pentru fluxuri de date au reprezentat un subiect major de cercetare. Jack Dennis de la MIT a fost un pionier în ceea ce privește arhitecturile de tip dataflow statice, în timp ce Manchester Dataflow Machine și arhitectura de tip Tagged Token reprezentau două proiecte mari pe partea fluxului de date dinamic.
Design-urile ce folosesc adresarea convențională a memoriei sunt numite mașini cu fluxuri de date statice. Aceste mașini nu permiteau executarea mai multor instanțe ale aceleiași rutine deoarece nu se putea face o distingere între tagurile de memorie. Design-urile ce foloseau conținutul memoriei adresate (CMA) sunt numite mașini cu fluxuri de date dinamice. Acestea folosesc taguri în memorie pentru a facilita paralelismul proceselor.
În mod normal, compilatoarele analizează codul sursă al programului pentru a depista dependențele între instrucțiuni și date pentru a se realiza o organizare mai bună a secvenței de execuție în fișierele de output binare. Instrucțiunile sunt organizate secvențial însă informația despre dependențe nu este înregistrată în fișierele binare. Numai fișierele binare compilate pentru o mașină cu arhitectură de tip dataflow conțin această informative de dependența între date. În loc de a folosi nume de variabile, un compilator de flux de date înregistrează aceste dependențe prin crearea unor taguri unice pentru fiecare dependență. Acordând fiecărei dependențe câte un tag unic, se permite secțiunilor non-dependente din fișierele binare să fie executate în altă ordine decât cea secvențială adică în altă ordine de idei, se pot executa în paralel.
Programele sunt încărcate în CMA-ul (conținutul memoriei adresate) unui computer cu flux de date dinamic. Atunci când toți operanzii unei instrucțiuni ce au fost tag-uiți devin disponibili, acea instrucțiune este marcată fiind gata pentru execuție de către o unitate de execuție. Acest procedeu mai este cunoscut și sub numele de lansarea sau execuția instrucțiunii. Similar, orice instrucțiuni ce se încadrează în normele acestui tip de sistem sunt marcate ca fiind gata pentru execuție. Astfel, ordinea de execuție a instrucțiunilor poate să difere de una secvențială scris în cod.
O instrucțiune, împreună cu operanzii necesari, este trimisă unității de execuție sub forma unui pachet, numit și instrucțiune token. În mod similar, un flux de date procesat este transmit înapoi la CMA sub formă de data token. Procesul de a transmite instrucțiuni și rezultate sub formă de pachete permite execuția acestor instrucțiuni în paralel la o scară mai mare. Rețele cu flux de date trimit instrucțiuni token către unitate de execuție și primesc data tokenuri de la CMA. În contrast cu arhitectura convențională de tip von Neumann, data tokenurile nu sunt păstrate permanent în memorie, ci mai degrabă sunt mesaje ce există numai când acestea sunt transmise.
Deși, datorită numeroaselor cercetări în domeniu, nu s-a putut trece peste câteva probleme legate de:
- Transmiterea eficientă a data tokenurilor într-un sistem de procesare în paralel masiv.
- Transmiterea eficientă a instrucțiunilor token într-un sistem de procesare în paralel masiv.
- Construirea unui CMA destul de mare pentru a stoca toată dependențele unui program real.
Instrucțiunile precum și dependențele acestora s-au dovedit a fi prea ‘meticuloasea‘ și dificil de implementat o metodă pentru a fi transmise eficient într-o rețea mai mare. S-a constatat că timpul de transmisie a unei instrucțiuni și a tagului aferent într-o rețea mare este mai lung decât cel pentru execuția acelei instrucțiuni. Cu toate acestea, execuția out-of-order(EOoO) a devenit o paradigma predominantă în domeniul calculatoarelor încă din anii ‘90. Această paradigmă introduce ideea unei ferestre de execuție. Fereastră de execuție urmează conceptul de ordine secvențială tipice unei arhitecturi von Neumann, însă în cadrul acestei ferestre instrucțiunilor le este permis să fie executate în funcție de ordinea dependențelor existente.