MSI 7970 Lightning - Discussione ufficiale

Pubblicità
Complimenti, sei riuscito a spiegare e a far capire perfettamente a un ignorante come me. Hai un futuro come insegnante di informatica, davvero!
Posso approfittare e chiederti ancora un paio di cose?

Arigatou gozaimasu mau-senpai:inchino:

:asd: grazie; chiedi pure

---------- Post added at 10:40 ---------- Previous post was at 10:09 ----------

:asd: grazie; chiedi pure

ti voglio fare un esempio pratico; mettiamo il caso di voler fare un'addizione fra due numeri salvati in due registri diversi n ed m, ora la somma fra i due esiste un'istruzione asm semplice:

ADD $s $n $m

Questa istruzione salva nel registro s la somma del contenuto dei due registri; questo ha un ritardo di: Tadd = Tfetch + tadd = (2 tao + ta) + tao = 3 tao + ta

Ora la somma si può risolvere anche con un metodo ricorsivo, ovvero questo:

Loop: Beq $m $0 Esci (Branch if equal, ovvero se sono uguali salta all'etichetta, in questo caso se il contenuto del registro m è uguale a quello del registro 0 (che contiene la costante 0) salta all'etichetta Esc)
Addi $n $n 1 (Addiziona una costante al contenuto di un registro)
Addi $m $m -1 (Idem ma con una costante in complemento a due)
Jump Loop (Salto incondizionato)
Esci: Store $s[$i] $n (Scrive il contenuto del registro n in memoria ad indirizzo $s + $i)

Ora passiamo ai ritardi: Tadd = Tfetch + m * (tbeq + taddi + taddi + jump) + tstore = (2 tao + ta) + ((m+1) * (4 tao + ta)) + m * ((3 tao + ta) + (3 tao + ta) + (3 tao + ta) + (4 tao + 2 ta)

Entrambe eseguono una somma, questo per farti capire come può influenzare l'ottimizzazione delle istruzioni :asd:
 
Ultima modifica:
:asd: grazie; chiedi pure
Generalmente che linguaggio si usa per scrivere i giochi?
Per quanto riguarda il linguaggio macchina ne sapevo ben poco, è molto diverso da un linguaggio come c o java?
Per aumentare le prestazioni di un computer quindi la cosa più ovvia da fare sarebbe diminuire questi tempi τ di latenza tra conversione tra linguaggio del software e linguaggio macchina. In che modo è possibile farlo?
I dati che si scambiano cpu e gpu passano dal pci ex per il chipset per arrivare alla cpu giusto?
Grazie ancora professor:ok:

---------- Post added at 10:46 ---------- Previous post was at 10:40 ----------

:asd: grazie; chiedi pure

---------- Post added at 10:40 ---------- Previous post was at 10:09 ----------



ti voglio fare un esempio pratico; mettiamo il caso di voler fare un'addizione fra due numeri salvati in due registri diversi n ed m, ora la somma fra i due esiste un'istruzione asm semplice:

ADD $s $n $m

Questa istruzione salva nel registro s la somma del contenuto dei due registri; questo ha un ritardo di: Tadd = Tfetch + tadd = (2 tao + ta) + tao = 3 tao + ta

Ora la somma si può risolvere anche con un metodo ricorsivo, ovvero questo:

Loop: Beq $m $0 Esci (Branch if equal, ovvero se sono uguali salta all'etichetta, in questo caso se il contenuto del registro m è uguale a quello del registro 0 (che contiene la costante 0) salta all'etichetta Esc)
Addi $n $n 1 (Addiziona una costante al contenuto di un registro)
Addi $m $m -1 (Idem ma con una costante in complemento a due)
Jump Loop (Salto incondizionato)
Esci: Store $s[$i] $n (Scrive il contenuto del registro n in memoria ad indirizzo $s + $i)

Ora passiamo ai ritardi: Tadd = Tfetch + m * (tbeq + taddi + taddi + jump) + tstore = (2 tao + ta) + ((m+1) * (4 tao + ta)) + m * ((3 tao + ta) + (3 tao + ta) + (3 tao + ta) + (4 tao + 2 ta)

Entrambe eseguono una somma, questo per farti capire come può influenzare l'ottimizzazione delle istruzioni :asd:
oddio qui mi hai fatto fare un pò di casino sui ritardi:look::asd:
ma scusa perchè uno dovrebbe inventarsi un loop così inca__ato (sono qui davanti al pc con carta e penna che cerco di capire il set di istruzioni e ritardi:asd:) per fare una operazione così semplice?!

Comunque l'esempio è perfettamente calzante:ok:

Edit: Secondo te quanto ci mette frizz a bannarci dal 3d per ot?:lol:
 
Generalmente che linguaggio si usa per scrivere i giochi?
Per quanto riguarda il linguaggio macchina ne sapevo ben poco, è molto diverso da un linguaggio come c o java?
Per aumentare le prestazioni di un computer quindi la cosa più ovvia da fare sarebbe diminuire questi tempi τ di latenza tra conversione tra linguaggio del software e linguaggio macchina. In che modo è possibile farlo?
I dati che si scambiano cpu e gpu passano dal pci ex per il chipset per arrivare alla cpu giusto?
Grazie ancora professor:ok:

a 22 anni già professore, chiedo al signor Monti se mi assume :sisi: .

1) Linguaggi C++, C, Assembler, linguaggi script proprietari;
2)Abbastanza, il linguaggio macchina sono sequenze di bit, forse quello che intendevi tu è il linguaggio ASM che poi viene assemblato dall'assemblatore e trasformato in codice macchina (del linguaggio ASM ti ho fatto un esempio sopra);
3)Esempio sopra
4)I dati passano per reti sequenziali sotto forma di impulsi che noi interpretiamo come bit, a seconda di come è implementata la rete ed a seconda dell'input hai un certo output, infatti:

sigma(q,x) -> q funzione di transizione dello stato interno (ovvero in un certo stato con un certo imput vai a finire in un altro stato diverso da stato finale)
omega(q,x) -> z funzione delle uscite (ovvero in un certo stato con un input vai a finire in uno stato finale, perciò le uscite non dipendono solo dall'input ma anche dallo stato interno della macchina)

---------- Post added at 10:55 ---------- Previous post was at 10:53 ----------

Edit: Secondo te quanto ci mette frizz a bannarci dal 3d per ot?:lol:

nel mio caso spero niente, essendo entrambi coregionali :lol:

---------- Post added at 10:57 ---------- Previous post was at 10:55 ----------

oddio qui mi hai fatto fare un pò di casino sui ritardi:look::asd:
ma scusa perchè uno dovrebbe inventarsi un loop così inca__ato (sono qui davanti al pc con carta e penna che cerco di capire il set di istruzioni e ritardi:asd:) per fare una operazione così semplice?!

Comunque l'esempio è perfettamente calzante:ok:

semplicemente questo loop agisce in questo modo: abbiamo due numeri n ed m da sommare se m (secondo numero) != 0 allora fai l'incremento +1 di n (primo numero) e decrementi -1 m; questo finchè m non è uguale a 0 ;). Alla fine restituisci n.
 
Ah scusa, inizialmente pensavo che l'ASM di cui sopra coincidesse col linguaggio macchina.
La storia delle funzioni di transito e ti uscita non la sapevo: interessante come cosa.
Queste cose mi intrippano parecchio, sul serio, quasi quanto l'amore della mia vita, la fisica!:love:

Che dire: esaustivo, davvero! Arigatou!

Lascio io una raccomandazione al nostro premier per te!:lol:

---------- Post added at 11:03 ---------- Previous post was at 11:01 ----------

semplicemente questo loop agisce in questo modo: abbiamo due numeri n ed m da sommare se m (secondo numero) != 0 allora fai l'incremento +1 di n (primo numero) e decrementi -1 m; questo finchè m non è uguale a 0 ;). Alla fine restituisci n.
chiaro!
Però con la storia dei ritardi mi sono un pò perso, lasciami ancora un pò di tempo per analizzare la cosa:rolleyes:
 
Ah scusa, inizialmente pensavo che l'ASM di cui sopra coincidesse col linguaggio macchina.
La storia delle funzioni di transito e ti uscita non la sapevo: interessante come cosa.
Queste cose mi intrippano parecchio, sul serio, quasi quanto l'amore della mia vita, la fisica!:love:

Che dire: esaustivo, davvero! Arigatou!

Lascio io una raccomandazione al nostro premier per te!:lol:

ultima cosa, ti scrivo l'istruzione add in microprogramma:

add. R[IR{14..19}]+R[IR{20..25}] -> R[IR{8..13}] | IC+1 -> IC, fetch0 Questo è fatto con assegnamenti in parallelo. Quello che vedi dentro le parentesi grafe sono le posizioni dei bit corrispondenti ai valori all'interno deri registri; le freccie sono gli assegnamenti ai registri e le barre verticali significa che viene eseguito in parallelo.

La moltiplicazione te la mostro giusto per farti divertire ancora :lol::

mul. R[IR{14..19}] -> A | R[IR{20..25}] -> B | 0 -> M, mul0
mul0. (A{0} B{0} = 0 0) 0 -> S, mul1
(= 0 1) 1 -> S | 0-B -> B, mul1
(= 1 0) 1 -> S | 0-A -> A, mul1
(= 1 1) 0 -> S | 0-A -> A | 0-B -> B, mul1
mul1. (zero(B) S B{31} = 0 _ 0) shl(A) -> A | shr(B) -> B, mul1
(= 0 _ 1) shl(A) -> A | shr(B) -> B | M+A -> M, mul1
(= 1 0 _) M -> R[IR{8..13}] | IC+1 -> IC, fetch0
(= 1 1 _) 0-M -> R[IR{8..13}] | IC+1 -> IC, fetch0

La ricorsione è il ragionamento migliore secondo me :love:
 
Senpai sei un super programmatore!:ok:

Adesso per colpa tua dovrò stare sveglio tutta la notte fino a che non ho capito un pò queste istruzioni!:lol:
Dammi qualche riferimento che vado un pò a studiare per la felicità del mio ex prof. di programmazione (C e C++)
 
Senpai sei un super programmatore!:ok:

Adesso per colpa tua dovrò stare sveglio tutta la notte fino a che non ho capito un pò queste istruzioni!:lol:
Dammi qualche riferimento che vado un pò a studiare per la felicità del mio ex prof. di programmazione (C e C++)

:lol: shl significa shift left, viene eseguito da una alu e non fa altro che shiftare i bit verso sinistra di una parola a 32 bit (o 64, dipende dalla specifica dell'alu); quello tra parentesi tonde vicindo all'etichetta, è un case e le varie combinazioni di bit sono le guardie, ovvero i vari casi/combinazioni che possiamo avere, esempio 3 bit possiamo avere 8 casi ovvero 2^3, cioè due valori 0 e 1 elevato per il numero di bit; il trattino basso significa che il valore assunto da quella variabile è indifferente; A{0} significa prendi il bit più significativo ovvero in posizione zero, che il complemento a due si riferisce al segno, se il suo valore è 1 è negativo, altrimenti positivo; zero(B) uscita di una ALU, dopo aver eseguito una sottrazione, non solo fornisce in output il risultato ma anche altri paramentri come il bit di zero, il bit di sgn(segno) ecc, se è impostato a 1 il bit di zero vale 1 perciò la differenza tra i due operandi vale 0 (o la somma fra due numeri di segno opposto), altrimenti il risultato della differenza è diversa da zero. Credo di averti spiegato i punti più critici, ora sta a te capire che fa :D
 
Ultima modifica:
:lol: shl significa shift left, viene eseguito da una alu e non fa altro che shiftare i bit verso sinistra di una parola a 32 bit (o 64, dipende dalla specifica dell'alu); quello tra parentesi tonde vicindo all'etichetta, è un case e le varie combinazioni di bit sono le guardie, ovvero i vari casi/combinazioni che possiamo avere, esempio 3 bit possiamo avere 8 casi ovvero 2^3, cioè due valori 0 e 1 elevato per il numero di bit; il trattino basso significa che il valore assunto da quella variabile è indifferente; A{0} significa prendi il bit più significativo ovvero in posizione zero, che il complemento a due si riferisce al segno, se il suo valore è 1 è negativo, altrimenti positivo; zero(B) uscita di una ALU, dopo aver eseguito una sottrazione, non solo fornisce in output il risultato ma anche altri paramentri come il bit di zero, il bit di sgn(segno) ecc, se è impostato a 1 il bit di zero vale 1 perciò la differenza tra i due operandi vale 0 (o la somma fra due numeri di segno opposto), altrimenti il risultato della differenza è diversa da zero. Credo di averti spiegato i punti più critici, ora sta a te capire che fa :D
la vedo dura che riesca a capire ma grazie degli indizi.
ora vediamo se ne vengo a capo almeno di qualcosa..
mannaggia a te io dovrei studiare "disordered systems physics" che ho tra 10 giorni!:evil::asd:
 
@ mau: ti avevo detto che ce le sentivamo dal boss:lol: continuiamo in pm..:asd:
@ frizz: almeno è spam da veri appassionati e acculturati, infatti aspettavo qualche tua perla!:asd: quindi ti prego non bannarci:asd:
 
Pubblicità
Pubblicità
Indietro
Top