macchine a registri (ram) modelli di costo ram e macchine ...ausiello/infoteorm/3.ram.pdf · teoria...

31
1 PARTE III MACCHINE A REGISTRI Macchine a registri (RAM) Modelli di costo RAM e macchine di Turing Macchine a registri elementari

Upload: vonhan

Post on 16-Feb-2019

218 views

Category:

Documents


0 download

TRANSCRIPT

1

PARTE III

MACCHINE A REGISTRI Macchine a registri (RAM) Modelli di costo RAM e macchine di Turing Macchine a registri elementari

2

3.1 MACCHINE A REGISTRI (RAM: Random Access Machines)

Introdotte da Shepherdson e Sturgis nel 1963 per sviluppare la teoria della calcolabilità con un modello di macchina che fosse un’astrazione ragionevole di un calcolatore (macchina di von Neumann).

• Memoria costituita da un numero arbitrario di celle (registri) indirizzabili direttamente R[1], R[2], ..., R[n] contenenti un intero positivo di un numero qualunque di cifre • Registri speciali: contatore istruzioni (CI) accumulatore R[0] • Nastri di ingresso e di uscita • Unita' centrale in grado di eseguire semplici istruzioni logico-aritmetiche

3

INPUT

............

R1

R2

R3

ALU

ACCUMULATORE

CONT. ISTRUZIONI

OUTPUT

4

Repertorio istruzioni (tipiche di un linguaggio assembler) LOAD, STORE: trasferimenti da registri ad accumulatore e viceversa READ, WRITE: trasferimenti da nastro di input a registri e da registri a nastro di output ADD, SUB, MULT, DIV, REM: operazioni aritmetiche tra accumulatore e registri; il risultato resta nell'accumulatore JGTZ, JEQZ: salti condizionati in base al contenuto dell' accumulatore JUMP: salto incondizionato HALT: terminazione

5

Sintassi delle istruzioni LOAD [ = | * ] operando -> operando: numero STORE [ * ] operando d’ordine di registro ADD [ = | * ] operando -> = operando: SUB [ = | * ] operando operando immediato MULT [ = | * ] operando -> * operando: DIV [ = | * ] operando accesso indiretto REM [ = | * ] operando READ [ * ] operando WRITE [ = | * ] operando JUMP etichetta -> etichetta: numero JGTZ etichetta d’ordine di istruzione JEQZ etichetta HALT etichetta

6

Semantica delle istruzioni (Esempi)

ADD =n R[0]:= R[0]+ n CI:=CI+1 ADD n R[0] := R[0]+ R[n] CI := CI+1 ADD *n R[0] := R[0]+ R[R[n]] CI := CI+1 JGTZ m if R[0]>0 then CI := m else CI := CI+1

7

Programmi per RAM Il programma non e' contenuto in memoria ma e' cablato: ad ogni macchina corrisponde un programma.

8

ESEMPIO - Programma per il calcolo di xy READ 1 lettura di x dal nastro di ingresso READ 2 lettura di y dal nastro di ingresso LOAD =1 STORE 3 inizializzazione del risultato 5 LOAD 2 JEQZ 14 fine ciclo while? LOAD 1 MULT 3 STORE 3 R[3] := x * R[3] LOAD 2 SUB =1 STORE 2 JUMP 5 14 WRITE 3 stampa del risultato HALT

9

3.2 MODELLI DI COSTO PER RAM • Modello a costi uniformi

costo unitario per l'esecuzione di ogni istruzione

ESEMPIO. Eseguire il programma per calcolare xy costa O(y); infatti le 9 istruzioni del ciclo vengono eseguite y volte Critiche: - moltiplicare due interi di 32 bit costa quanto moltiplicare due interi di 1024 bit - accedere ad una memoria di 1 kilobyte costa come accedere ad una memoria di 1 terabyte Vantaggi: il modello ha il pregio di essere molto semplice ed e’ quello più usato quando valutiamo il comportamento di programmi scritti in linguaggio ad alto livello

10

• Modello a costi logaritmici I costi sono proporzionali al numero di bit degli operandi e al logaritmo del numero d’ordine dei registri cui si accede Definiamo la seguente funzione (lunghezza in binario):

l(n) = 1 se n=0 l(n) = int(log n)+1 se n>0 - l'elaborazione di un intero n ha costo l(n) - l'accesso al registro i ha costo l(i)

Vantaggi: la valutazione dei costi e’ più realistica dal punto di vista asintotico (operandi molto grandi, memoria molto grande Critiche: analisi più laboriosa

11

Per eseguire l'istruzione ADD 3 si paga: l (3) per accedere al registro 3 e l(R[3]) + l(R[0]) per eseguire la somma del contenuto del registro 3 e dell’accumulatore. Per eseguire l'istruzione ADD *3 si paga: - l(3) + l(R[3]) per accedere al registro indirizzato dal registro 3 - l(R[R[3]]) + l(R[0])

per eseguire la somma.

12

ESEMPIO - Valutazione con modello a costi logaritmici.

14 WRITE 3 l(3)+l(xy) O(y log x) HALT 1 O(1)

READ 1 l(1)+l(x) O(log x) READ 2 l(2)+l(y) O(log y) LOAD =1 l(1) O(1) STORE 3 l(3)+l(1) O(1) 5 LOAD 2 l(2)+l(y) O(log y) JGTZ 14 l(y) O(log y) LOAD 1 l(1)+l(x) O(log x) MULT 3 l(3)+l(x)+l(xy) O(log x + y log x) STORE 3 l(3)+l(xy) O(y log x) LOAD 2 l(2)+l(y) O(log y) SUB =1 l(1)+l(y) O(log y) STORE 2 l(2)+l(y) O(log y) JUMP 5 1 O(1)

13

La porzione di codice dentro la cornice viene eseguita O(y) volte. Costo di esecuzione totale: O(y2 log x)

14

NOTA BENE. In pratica in situazioni in cui: a) i dati hanno una dimensione prefissata (es: 36 bit) b) le dimensioni della memoria sono prefissate i due modelli coincidono. NOTA BENE. Se le operazioni aritmetiche hanno precisione arbitraria o se si rende necessario l'accesso a memoria secondaria, si deve fare uso di modelli di calcolo analoghi al modello a costi logaritmici anche nell’analisi di complessità di algoritmi scritti in linguaggi ad alto livello

15

3.3 RAM E MACCHINE DI TURING Calcolabilità mediante RAM Def. Una funzione f: Nn →N e' calcolabile da una RAM se esiste un programma P tale che

- se f(x1,...,xn)=y, allora P, attivato con x1,...,xn sul nastro di input, termina con y sul nastro di output

- se f(x1,...,xn) non e' definita, allora P non termina

16

Teorema. Sia M=<{0,1},b,K,q0,F,δ> una MT con nastro seminfinito; esistono una RAM ed un programma P tali che se M calcola q0x|—*qFy e la RAM ha la stringa x nelle celle 2,....,|x|+1 al termine della computazione la RAM ha la stringa y nelle celle 2,....,|y|+1; inoltre la RAM simula T passi di M in tempo O(T log T) nel modello a costi logaritmici. Dim.

Stabiliamo una corrispondenza tra la cella i del nastro di M e la cella i+1 della memoria della RAM. Usiamo la cella 1 della RAM per rappresentare la posizione della testina di M.

17

All'inizio la cella 1 contiene il valore 2 (posizione iniziale della testina di M). P contiene una sequenza di istruzioni per ogni stato di M.

18

Esempio. Se δ(q1,0)=<q2,1,d> e δ(q1,1)=<q3,0,s> allora P contiene il seguente frammento di programma: .................... q1 LOAD *1 acquisizione del contenuto del nastro JGTZ q1' lettura di un 1 o di uno 0? LOAD =1 STORE *1 scrittura di un 1 sul nastro LOAD 1 ADD =1 STORE 1 movimento a destra della testina JUMP q2 aggiornamento dello stato q1' LOAD =0 STORE *1 scrittura di uno 0 sul nastro LOAD 1 SUB =1 STORE 1 movimento a sinistra della testina

19

JUMP q3 aggiornamento dello stato .................... Ogni passo di M e' simulato da al piu' 8 istruzioni ognuna con costo O(log tmax) dove tmax e' il massimo numero di celle usate da M Se M esegue T passi allora tmax ≤ T+1 Costo complessivo O(T log T)

20

Teorema. Data una RAM con programma P che calcola la funzione f esiste una MT M tale che se f(x1,...,xn)=y e sul nastro di input sono memorizzati in binario gli interi x1,...,xn la macchina M termina con la rappresentazione binaria di y sul nastro di output e se f(x1,...,xn) non e' definita M non termina; inoltre se la computazione della RAM ha costo T nel modello a costi logaritmici allora M la simula in O(T2) passi. Dim. M ha tre nastri di lavoro, un nastro di input e un nastro di output. Sul nastro 1 sono memorizzati in binario i dati memorizzati nella memoria della RAM preceduti dal proprio indirizzo rappresentato in binario, cioe': #i1#R[i1]#i2#R[i2]#i3#R[i3] ... #im#R[im].

21

Sul nastro 2 e' rappresentato il contenuto dell'accumulatore. Il nastro 3 e' usato per il funzionamento di M. Per ogni istruzione del programma della RAM, M ha un insieme di stati per eseguire le operazioni. • Istruzioni di salto JUMP, JGTZ, JZERO, HALT:

si controlla se il contenuto dell'accumulatore verifica le condizioni di salto e si gestiscono i corrispondenti cambiamenti di stato

• Istruzioni che non modificano il contenuto della memoria LOAD, ADD, SUB, MULT, DIV, WRITE:

si cerca sul nastro 1 il registro su cui si deve operare

22

si esegue sul nastro contenente la rappresentazione dell'accumulatore l'operazione prevista

23

• Istruzioni che modificano il contenuto della memoria STORE,READ

si trascrive sul nastro 3 il contenuto del nastro 1 a destra del registro da modificare si esegue l'operazione modificando sul nastro 1 la rappresentazione del contenuto del registro da modificare si ricopia sul nastro 1 il contenuto del nastro 3 a destra della cella modificata.

24

Analisi di complessita'. i) Ogni sequenza di transizioni relativa ad una operazione di RAM costa ad M, nel caso peggiore, un tempo dell'ordine della massima lunghezza lungmax del nastro 1 e se la RAM opera con costo totale T allora lungmax ≤ T. Infatti nel modello a costi logaritmici • se sul nastro 1 e' presente l' indirizzo i vuol dire che la RAM ha acceduto almeno una volta al registro Ri e quindi ha pagato almeno una volta log i, d'altro canto l'indirizzo i occupa su nastro 1 proprio log i celle • se sul nastro 1 compare il contenuto del registro i allora la RAM ha pagato almeno una volta log(R[i]) d'altro canto R[i] occupa su nastro 1 proprio log(R[i]) celle quindi lungmax≤T

25

ii) Se la RAM opera con costo totale T le operazioni che essa esegue sono al piu' T In conclusione la MT M opera in tempo O(T lungmax) = O(T2).

26

NOTA BENE 1 • Tutto cio' che si puo' fare (calcolo di funzioni, riconoscimento o accettazione di insiemi, ecc.) con una MT si puo' fare anche con una RAM e viceversa (adottando le opportune convenzioni per la rappresentazione dell'input e dell'output). • Considerato che le RAM corrispondono a semplici programmi Assembler e’ chiaro che il loro potere computazionale coincide con quello dei linguaggi di programmazione ad alto livello. • Tesi di Church-Turing: tutti i modelli di calcolo introdotti per definire la calcolabilita' (e tutti i linguaggi di programmazione) hanno al massimo lo stesso potere computazionale delle MT.

27

NOTA BENE 2

• Una MT ed una RAM con modello a costi logaritmici possono simularsi a vicenda in tempo polinomiale. La stessa cosa non si puo' fare se si considerano RAM con moltiplicazione e costi unitari (Esercizio).

• Per stabilire se un problema ammette una soluzione calcolabile in tempo polinomiale possiamo indifferentemente far riferimento ad una MT o ad una RAM a costi logaritmici.

• Tesi di Cobham. Tutti i modelli di calcolo introdotti per definire la "trattabilita" (calcolabilita' in tempo polinomiale) hanno al piu' lo stesso potere computazionale delle MT operanti in tempo polinomiale. • Questo principio "potrebbe" essere violato dalle macchine quantistiche (fattorizzazione in tempo polinomiale!)

28

3.4 MACCHINE A REGISTRI ELEMENTARI (MREL) Esistono modelli di calcolo ancora piu' elementari delle RAM dotati dello stesso potere computazionale. - Due sole istruzioni di incremento e decremento del contenuto di registri: R[i] := R[i] + 1 R[i] := R[i] - 1 Se il contenuto e' 0 il decremento lascia 0. - Una sola istruzione di salto: IF R[i] = 0 THEN GOTO n (altrimenti prosegui).

29

Altre semplificazioni: - eliminazione di nastri di ingresso e uscita - eliminazione dell'accumulatore - eliminazione dell'indirizzamento indiretto Convenzioni: - all'inizio l'input e' nei registri 1, ..., n - tutti gli altri registri contengono 0 - al termine l'output e' nel registro 1 - la macchina si arresta se si richiede un salto ad un'istruzione che non esiste.

30

Possiamo simulare tutte le istruzioni di una RAM: LOAD 1 ADD 2 STORE 1 si realizza nel seguente modo: IF R[2] = 0 THEN GO TO 6 R[2] := R[2] - 1 R[1] := R[1] + 1 R[3] := R[3] + 1 IF R[4] = 0 THEN GO TO 1 IF R[3] = 0 THEN GO TO 0 R[3] := R[3] - 1 R[2] := R[2] + 1 IF R[4] = 0 THEN GO TO 6

31

Teorema. Ogni funzione f: Nn → N calcolabile con una RAM e' calcolabile con una MREL e viceversa. In conclusione si puo’ osservare come semplici istruzioni di incremento e decremento di registri (contatori) siano sufficienti ad effettuare il calcolo di una qualunque funzione calcolabile. Vari altri risultati hanno mostrato come sia possibile definire modelli di calcolo estremamente elementari. ESEMPIO - Ogni funzione calcolabile puo’ essere calcolata da una RAM con due soli registri.