« Forum anonimo (sperimentale)

DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT

6 replies
Last

Buonasera,
premetto che quello che sto chiedendo nasce da una mia mera curiosità, e mi scuso anticipatamente se sono troppo prolisso nella spiegazione e nella richiesta di chiarimento, ma voglio spegnere ogni dubbio, sia per me sia per eventuali colleghi di corso che hanno avuto, stamane, lo stesso dubbio.

In seguito al compitino di stamattina, e confrontandomi con miei colleghi di corso che hanno avuto problemi nello svolgimento del quiz di cui in oggetto, mi sono posto in dubbio sull'operazione di SLT, in quanto studiando, sia dal libro sia dalle lezioni, ho sempre appreso che l'operazione venga implementata anche con una sottrazione nell'architettura MIPS.

Posto questo come assodato, ho invece appreso oggi, dopo il compitino, che la SLT non viene implementata anche con una sottrazione, ma che invece esiste nella ALU una specifica operazione SLT. Quando ho sentito questa affermazione, detto con sincerità, ho inizialmente storto un po' il naso, ma non essendo io molto ferrato in architettura (nonostante sia un corso che mi piace molto) ho deciso di documentarmi e cercare fonti che accreditassero (o che smentissero) questa affermazione.

Studiando e divagando in vari forum, ho solamente trovato una conferma: nel MIPS l'operazione di SLT viene implementata con una sottrazione. Riporto quindi, in sintesi e con una struttura spero comprensibile, quello che ho appreso: 

"nel MIPS l'operazione di SLT viene implementata con una sottrazione, del risultato si considera solo il bit più significativo (quello di segno). Questo perchè a < b viene trasformata in (a-b) < 0. 
Dei 32 bit del risultato (in uscita dalla 32 ALU), si tiene pertanto solamente il bit più significativo che viene portato in uscita come bit 0 (dal mux 0).
Dagli altri mux esce sempre uno zero.
Viene utlizzato un codice del segnale di selezione dell'operazione su più bit (log2(num_operazioni_ALU)) + un segnale che prende il secondo operando negato e imposta a 1 il riporto in ingresso del primo sommatore per trasformare il secondo operando nell'equivalente numero negativo codificato in complemento a 2.
Quindi, in uscita avremo 32 bit di cui solo il bit 0 può assumere valore 0/1; gli altri bit sono sempre 0, in questo senso l'uscita è un flag su 32 bit."

Chiedo gentilmente se è possibile sapere se quanto ho scritto è corretto, o se ci sono errori nel mio ragionamento che portano quindi, contrariamente a quanto penso, l'affermazione di "SLT come specifica operazione" come risposta corretta.

Ringrazio anticipatamente per il tempo eventualmente dedicato.

Andrea Broccoletti


6 replies
  1. Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
    Dal libro di testo, appendice in cui si descrive la ALU MIPS usata come riferimento per il corso - pag.B32 nella edizione che ho consultato io.

    "We need only connect the sign bit from the adder output to the least significant bit to get  set in less than"

    Pag B35, "fig B.5.12 shows the 32-bit ALU...that perform add, subtract, AND, OR, or set in less than"

    1 reply
  2. Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
    Ma e il sign bit come lo trovi?
  3. Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
    Buongiorno,
      ha documentato bene la sua argomentazione, ma per quel che capisco è un po' divergente dalla questione compitino.
    Se vogliamo rispondere alla domanda del compitino ("quando alla ALU sia richiesto, attraverso i suoi ingressi, di effettuare una sottrazione"), allora l'istruzione slt rimane esclusa.
    Ad alcuni di voi ho risposto ieri dicendo "l'istruzione slt chiede a ALU la sua specifica operazione SLT, che usa dentro ALU le porte che fanno la sottrazione *più* le linee "less" e "set", e produce nei 32 bit di uscita di ALU un valore che è 0 o 1, e non il valore della differenza. Diverso è quanto accade per beq, che chiede a ALU la vera e propria sottrazione, con nei 32 bit di uscita la differenza".

    Resta valida l'analisi sul ruolo della sottrazione, effettivamente usata, dentro ALU, per slt, ma fuori ALU l'operazione SLT è indicata distinta, perché vogliamo un diverso output.

    È interessante che perplessità simili sono espresse da altri su Internet, ad esempio in "Why is Set on Less Than an ALU operation" (su Stack Overflow 10 anni fa).

    Buon fine settimana a tutti /Claudio Ferretti
    2 replies
  4. Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
    Il mio dubbio era proprio sul ruolo della sottrazione: il fatto che la SLT sia indicata come operazione distinta, non toglie il fatto che la ALU effettui una sottrazione nella sua implementazione. Ho comunque letto il thread su StackOverflow e credo di aver compreso meglio il tutto ora, la ringrazio.


    Buon fine settimana.

  5. Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
    Mi scuso per l'intromissione, ma vorrei capire meglio - dopotutto siamo qui per comprendere e imparare, e parto dal presupposto di potermi sbagliare in qualsiasi momento. 

    (1) "Se vogliamo rispondere alla domanda del compitino ("quando alla ALU sia richiesto, attraverso i suoi ingressi, di effettuare una sottrazione"), allora l'istruzione slt rimane esclusa."
    Per quanto ho capito la ALU, per come è progettata, esegue tutte le operazioni al suo interno, per poi selezionare il risultato. Quindi tecnicamente la alu "effettua" ogni operazione al suo interno (nei limiti dei segnali in input). Per esempio, quando viene chiesto di fare l'operazione add, essendo Ainvert spento e Bnegate spento, viene "effettuato" anche un normalissimo "AND", e un "OR". Quello che poi discrimina è il risultato selezionato attraverso il mux. Quindi, sempre a livello tecnico, se si ha Ainvert spento e Bnegate acceso l'adder all'interno della ALU effettua una sottrazione, indipendentemente da quale risultato viene poi selezionato attraverso il segnale per l'operazione ALU (i due bit per il mux).
    Naturalmente in quest'ottica qualsiasi domanda del tipo "quando la ALU effettua xxx" perde di significato; si dovrebbero considerare tutte le operazioni che hanno Ainvert spento e Bnegate acceso. Non è sicuramente l'approccio da usare nell'affrontare la domanda nel compitino. Suppongo dunque che la sottrazione debba avere una qualche rilevanza all'interno dell'operazione affinché quest'ultima abbia i requisiti per essere parte della risposta alla domanda.
    Vengo al punto: le operazioni, se non mi sbaglio, che richiedono una sottrazione alla ALU tra quelle proposte (non vorrei ricordare male, dovrebbero essere add, and, beq, j, lw, or, slt, sub, sw) sono la sub naturalmente, beq e slt. Perché? La motivazione per sub è banale; beq esegue una differenza, per poi eseguire un NOR su tutti i 32 bit del risultato - che risulta acceso solo se tutti i bit sono spenti, dunque a - b = 0; slt esegue una differenza, a - b, ne prende l'msb e lo usa per capire se il risultato è negativo (grazie al CA2) e dunque a < b; tutte le ALU restituiscono il valore di "less", per tutte impostato a zero tranne che per la prima - che conterrà il valore di set dell'ultima ALU, ossia l'msb della differenza - permettendo così di avere un risultato "flag", ossia 0...0 oppure 0..01. Per cui, a rigor di logica, l'istruzione slt fa eseguire alla ALU una sottrazione di rilevante importanza (senza la quale dovremmo cambiare il modo in cui calcoliamo il risultato di a < b).

    (2) Ad alcuni di voi ho risposto ieri dicendo "l'istruzione slt chiede a ALU la sua specifica operazione SLT, che usa dentro ALU le porte che fanno la sottrazione *più* le linee "less" e "set", e produce nei 32 bit di uscita di ALU un valore che è 0 o 1, e non il valore della differenza. Diverso è quanto accade per beq, che chiede a ALU la vera e propria sottrazione, con nei 32 bit di uscita la differenza".
    Tento di analizzare, in parallelo, le due istruzioni:
    I) L'istruzione ha bisogno di una sottrazione per poter essere eseguita? Sì, entrambe.
    II) Il risultato della sottrazione è utilizzato per il calcolo del risultato? Sì per entrambe; nonostante nella slt ci interessi "solamente" l'msb, viene de facto eseguita la sottrazione per poterlo calcolare. Quindi entrambe sfruttano il risultato della sottrazione.
    III) L'istruzione richiede hardware aggiuntivo per quanto riguarda la ALU? Sì per entrambe, le linee set e less per slt, il NOR finale per l'output "zero" utilizzato per il beq. Questo è importante perché fa capire che in realtà non ci interessa usare il risultato della sottrazione, ma vogliamo manipolarlo prima di poterlo usare.
    III) La ALU ha nell'output "Result" il risultato della sottrazione? Sì per beq, no per slt, che ha il suo valore.
    IV) Al di fuori della ALU, viene usato il risultato della sottrazione, ovunque sia dato come output, se viene dato come output? No per entrambe.
    V) Cosa cambia dunque? Cambia che l'istruzione beq fa eseguire una sub alla ALU, con quindi result che contiene il risultato della sub, per poi prenderne l'output zero e ignorare result, mentre la slt fa eseguire una sottrazione senza darne in output il risultato, in quanto viene selezionata la linea less anziché quella dell'adder per formare result.
    Quindi con "la vera e propria sottrazione" suppongo che Lei intenda l'operazione sub.
    Quello che concludo è che la domanda sia ambigua, in quanto non si capisce dal testo se per sottrazione si intende l'operazione come concettualmente intesa da un umano, o si debba intendere l'operazione sottrazione, con specifico codice della ALU annesso. La dicitura "attraverso i suoi ingressi" non aiuta lo stesso, in quanto fino a prova contraria per l'istruzione slt gli ingressi della ALU vengono settati per fare una sottrazione, che viene effettivamente usata; che poi non sia data in output ma sia sfruttata attraverso il segnale di set è un altro discorso. Sarebbe stato diverso se la domanda fosse stata "quali istruzioni fanno effettuare alla ALU una sottrazione il cui risultato è nell'output Result", ma così non era. 

    (3) "fuori ALU l'operazione SLT è indicata distinta, perché vogliamo un diverso output".
    Vero, quando eseguiamo un slt non vogliamo il risultato della differenza. Ma a voler ben vedere non vogliamo il risultato della differenza neanche per la beq! L'unica cosa che ci interessa è la differenza rielaborata attraverso la porta nor e quindi il segnale zero per la porta AND che permette, insieme al segnale PCWriteCond, di eseguire l'istruzione beq. Quindi è vero che per la sottrazione e la slt vogliamo output result diverso, ma a questo punto potremmo dibattere sul fatto che beq l'output result, per quanto ho capito, lo ignora proprio. Quindi che scopo ha avere il risultato della sottrazione in result? Nessuno, proprio perché come in slt la sottrazione è puramente funzionale.
    Potremmo in un raptus di follia (sperando di non fare errori logici) dare in input al NOR anziché l'output result del mux dell'ALU a un bit direttamente l'output dell'adder; a questo punto l'output zero sarebbe acceso anche per input diversi rispetto a numeri uguali, per esempio se Ainvert e Bnegate sono spenti e i due numeri sono opposti, la somma sarebbe 0 (è effettuata una somma proprio per Ainvert e Bnegate spenti) e dunque sarebbe acceso il NOR. Basta dare in pasto al NOR anche Ainvert e  Bnegate negato, così che NOR si possa accendere solo se Ainvert è spento e Bnegate è acceso, e si sta pertanto facendo una sottrazione; a - b = 0 implica a = b, dunque avremmo ancora il nostro output zero funzionante. Il vantaggio, o meglio, l'osservazione resa possibile da questa modifica sconsiderata (non tiene conto dell'eventuale overflow, che sarebbe da gestire a parte dato che prendiamo i risultati direttamente dagli adder, chiedo venia se qui non lo tratto) è che così facendo l'unica richiesta affinché sia verificato che a = b è che Ainvert sia spento e Bnegate sia acceso, che è l'unica vera condizione imprescindibile affinché venga fatta una sottrazione. Quindi anche facendo eseguire una slt alla ALU, zero avrebbe il valore corretto esattamente come se avessimo fatto una sub.
    Quello che sto tentando di dire è che non importa neanche a beq che venga eseguita esattamente l'operazione sub (o meglio, per come è fatta la alu che abbiamo visto sì, ma concettualmente no!), il senso è che deve essere eseguita una sottrazione che viene poi sfruttata per ottenere l'informazione desiderata: non ci interessa il risultato della sub all'esterno, tanto che potremmo (come descritto sopra) rimaneggiare in modo da permettere che, sia facendo una sub sia una slt, la beq abbia l'output zero desiderato. Quindi è vero che slt è un'operazione distinta che ha output diverso da quello della sottrazione, ma come la beq dell'output della sottrazione non ci interessa che la sua rielaborazione, quindi anche per la beq vogliamo un diverso output - letteralmente, zero anziché result.


    La mia domanda finale è dunque sull'interpretazione che dobbiamo dare alla domanda - e a tutte quelle che sono dello stesso tipo (richiede un'addizione, e così via). Mi sembra poco corretto penalizzare chi effettivamente ha ragionato sul fatto che la ALU effettua una sottrazione, concettualmente intesa, per fare la slt - mostra che ha capito come è implementata. Allo stesso modo non sarebbe da penalizzare chi ha ragionato nei termini dell'operazione sub e ha quindi giustamente considerato a parte slt. Premetto che non ho avuto la domanda, sono qui solo per capire...

    Ringrazio infinitamente per il tempo e la pazienza dedicatomi e mi scuso per la prolissità del messaggio, buona serata a tutti!
    1 reply
  6. Re: DUBBIO 2 COMPITINO: utilizzo sottrazione per SLT
    Non è certo 'intromissione', questo contributo è lecito e apprezzato, assolutamente.

    Il prof.Sorrenti ha già confermato il proposito di cambiare per il futuro il testo della domanda.
    Che però per me al momento resta valida per la valutazione corrente: il contesto chiaro in cui è formulata, e l'univocità del riferimento, cioè la richiesta fatta alla ALU nel funzionamento del datapath, secondo me mette in secondo piano le analisi su cosa accade dentro ALU, su scopi, intenti, e altri approfondimenti.

    Il problema per me più importante, che magari potremo discutere con un gruppo di vostri rappresentanti, è che le risposte chiuse non permettono mai di chiarire cosa lo studente intendeva esprimere. Forse sarebbe buona cosa per noi e per voi tornare a fare orali per tutti, eventualmente con un filtro minimo a risposte chiuse (anche se già ora chiediamo solo di rispondere a una domanda su tre).

    Buona giornata a tutti /Claudio Ferretti