Registre renombrat

De la Viquipèdia, l'enciclopèdia lliure

A l'arquitectura d'ordinadors, el canvi de nom de registre és una tècnica que abstraeix registres lògics dels registres físics. Cada registre lògic té un conjunt de registres físics associats. Quan una instrucció de llenguatge de màquina fa referència a un registre lògic concret, el processador transposa aquest nom a un registre físic específic sobre la marxa. Els registres físics són opacs i no es poden fer referència directament sinó només mitjançant els noms canònics.[1]

Aquesta tècnica s'utilitza per eliminar les dependències de dades falses derivades de la reutilització de registres per instruccions successives que no tenen cap dependència real de dades entre elles. L'eliminació d'aquestes dependències de dades falses revela més paral·lelisme a nivell d'instrucció en un flux d'instruccions, que es pot explotar mitjançant tècniques diverses i complementàries com ara l'execució superescalar i fora d'ordre per a un millor rendiment.[2]

Enfocament del problema[modifica]

En una màquina de registre, els programes estan formats per instruccions que operen sobre valors. Les instruccions han d'anomenar aquests valors per tal de distingir-los entre ells. Una instrucció típica podria dir: "afegir i i posa el resultat ”. En aquesta instrucció, , i són els noms de les ubicacions d'emmagatzematge.

Per tenir una codificació d'instruccions compacta, la majoria dels conjunts d'instruccions del processador tenen un petit conjunt d'ubicacions especials a les quals es pot referir amb noms especials: registres. Per exemple, l'arquitectura del conjunt d'instruccions x86 té 8 registres enters, x86-64 en té 16, molts RISC en tenen 32 i IA-64 en té 128. En els processadors més petits, els noms d'aquestes ubicacions corresponen directament a elements d'un fitxer de registre. Les instruccions diferents poden trigar diferents quantitats de temps; per exemple, un processador pot ser capaç d'executar centenars d'instruccions mentre una única càrrega de la memòria principal està en curs. Les instruccions més curtes executades mentre la càrrega està pendent acabaran primer, de manera que les instruccions s'acaben fora de l'ordre original del programa. L'execució fora d'ordre s'ha utilitzat a les CPU d'alt rendiment més recents per aconseguir alguns dels seus guanys de velocitat.

Considereu aquest fragment de codi que s'executa en una CPU fora d'ordre:

	r1  m[1024]
	r1  r1 + 2
	m[1032]  r1
	r1  m[2048]
	r1  r1 + 4
	m[2056]  r1

Les instruccions de les tres línies finals són independents de les tres primeres instruccions, però el processador no pot acabar r1  m[2048] fins al m[1032]  r1 anterior m[1032]  r1 està fet (en fer-ho en cas contrari escriuria un valor incorrecte). Aquesta restricció s'elimina canviant els noms d'alguns dels registres:

	r1  m[1024]
	r1  r1 + 2
	m[1032]  r1
	r2  m[2048]
	r2  r2 + 4
	m[2056]  r2

Ara les últimes tres instruccions es poden executar en paral·lel amb les tres primeres. El programa s'executarà més ràpid que abans eliminant qualsevol aturada a causa d'una dependència de dades falses.

Moltes CPU d'alt rendiment implementen aquest canvi de nom al maquinari per aconseguir un paral·lelisme addicional. En objectius sense una detecció de flux de dades adequada, els bons compiladors detectarien seqüències d'instruccions independents i escolliran registres diferents durant la generació de codi.

Història[modifica]

L'IBM System/360 Model 91 va ser una de les primeres màquines que admetia l'execució fora de servei d'instruccions; va utilitzar l'algorisme de Tomasulo, que utilitza el canvi de nom de registre.

El POWER1 és el primer microprocessador que va utilitzar el canvi de nom de registre i l'execució fora de servei el 1990. El disseny original de l'R10000 no tenia ni cues de problemes col·lapsants ni codificació de prioritat variable, i com a resultat va patir problemes d'inanició; de vegades, la instrucció més antiga de la cua no s'emetria fins que ambdues descodificacions d'instruccions s'aturaven completament per manca de registres de canvi de nom, i totes les altres instruccions havien tingut estat emès. Les revisions posteriors del disseny que van començar amb l' R12000 van utilitzar un codificador de prioritat parcialment variable per mitigar aquest problema.

La microarquitectura P6 va ser la primera microarquitectura d'Intel a implementar tant l'execució fora d'ordre com el canvi de nom del registre. La microarquitectura P6 es va utilitzar als microprocessadors Pentium Pro, Pentium II, Pentium III, Pentium M, Core i Core 2. El Cyrix M1, llançat el 2 d'octubre de 1995,[3] va ser el primer processador x86 que va utilitzar el canvi de nom de registre i l'execució fora d'ordre. Altres processadors x86 (com NexGen Nx686 i AMD K5) llançats el 1996 també van incloure el canvi de nom del registre i l'execució fora d'ordre de les operacions RISC μ (en lloc d'instruccions x86 natives).[4][5]

Referències[modifica]

  1. «[https://courses.cs.washington.edu/courses/cse471/07sp/lectures/Lecture4.pdf Reorder Buffer: register renaming and in- order completion]» (en anglès). [Consulta: 28 novembre 2023].
  2. «Complex Pipelining:Out-of-Order Execution,Register Renaming,and Exceptions» (en anglès). [Consulta: 28 novembre 2023].
  3. «Cyrix 6x86 Processor» (en anglès).
  4. «NexGen Nx686» (en anglès).
  5. «PC Mag Dec 6, 1994» (en anglès). Ziff Davis, 06-12-1994.