%{{{}}}
%
% Teor'ia de Arquitectura de Computadores
% Ultima revisi'on: Oct 1996 ~
%
%{{{  Def del documento
%{{{  Estilo
\documentstyle[spanish,a4paper,
%minitoc,
epsf]{book}   % un libro en espa~nol
%\usepackage{minitoc}
\textheight = 22 cm             % altura de la pagina escrita
\textwidth  = 15 cm             % anchura de la pagina escrita
\hoffset    = -2 cm             % unos 3 centimetros a la izquierda
\voffset    = -2 cm             % unos 2 centimetros hacia arriba
%\input{macros.tex}              % algunas cosillas en latex
%\makeindex                      % Indice de palabras
%\def\mtctitle{Contenidos}       % Para que minitoc escriba 'Contenidos'
%\def\mlftitle{Figuras}          % idem con 'Figuras'
%\def\mlttitle{Tablas}           % idem con 'Tablas'
%\setcounter{tocdepth}{6}        % profundidad de la tabla de contenidos
%\setcounter{minitocdepth}{6}
%\setcounter{secnumdepth}{6}
%}}}
\begin{document}                % comienza el documento
%{{{  Titulo y autor
%\title{Compresi'on de datos}
%\author{Vicente Gonz'alez Ruiz}
%\maketitle
%\dominitoc
%\tableofcontents
%\faketableofcontents
%\newpage
%}}}
%{{{  Partes del estilo libro
% part
% chapter
% section
% subsection
% subsubsection
% paragraph
% subparagraph
%}}}

\newcount\nEJEM         % Declaramos un contador de ejemplos.
\nEJEM=1                % Y lo reseteamos.
\def\Delimitador        {$$\star ~~ \star ~~ \star$$}
\def\Eq #1              {Eq.(\ref{#1}) }
\def\Dim#1#2 {{\mathrm #1\over  #2}}
\def\Label#1 {\label{#1}{~~\bf\mathtt [#1]}}

% % % % % % %
%           %
%  Ejemplo  %
%           %
% % % % % % %
\def\Ejemplo #1#2 {
\begin{quote}
 {\bf Ejemplo \thechapter.\the\nEJEM.\space}{\sl #1}
\end{quote}
\begin{quote}
 {\bf Soluci\'on:}
 {#2}
 \end{quote}
 \advance\nEJEM by 1
}


%}}}
%{{{  Introducci'on a la Arquitectura de Computadores
%\chapter*{Introducci'on a la Arquitectura de Computadores}
%\addcontentsline{toc}{starchapter}{Introducci'on}
%\markboth{Introducci'on}{Introducci'on}
%}}}
%{{{  Rendimiento de un Computador
\chapter{Rendimiento de un Computador}
%\minitoc
%{{{  Definici'on de Rendimiento
\section{Definici'on de Rendimiento}
%{{{  Rendimiento
\subsection{Rendimiento}
El rendimiento es un t'ermino utilizado en muchos 'ambitos y dependiendo
de esto puede tomar diferentes significados. En general, podemos decir que
el rendimiento ($R$) es la cantidad de trabajo ($W$) que se realiza por
unidad de tiempo ($t$):

\begin{equation}
R={W\over t}
\Label{R1}
\end{equation}
%}}}
%{{{  Rendimiento de una computadora
\subsection{Rendimiento de una computadora}
En el caso de definir el rendimiento de una computadora, la \Eq{R1} se
escribe como:
\begin{equation}
R={W\over t}
\Label{R2}
\end{equation}
donde $W$ es el n'umero de programas ejecutados y $t$ es el tiempo de
ejecuci'on consumido. Con esto podemos afirmar que el computador que realiza
la misma cantidad de trabajo que otro y en menos tiempo es el m'as r'apido
y por tanto el que mayor rendimiento posee.

Con el objetivo de aumentar el rendimiento de un ordenador, esto es, intentar
realizar el m'aximo n'umero de trabajos por unidad de tiempo, se inventaron
los SO multitarea, tal como el UNIX. Frente a un SO monotarea como es MS-DOS,
UNIX trata de mejorar el rendimiento de una computadora cuando tenemos dos
o m'as programas ejecutandose simultanemente. Cuando el sistema adem'as de
ser multitarea es multiusuario, el rendimiento se diferencia en dos
necesidades que compiten por la CPU: (1) minimizar el tiempo de respuesta de
los comandos interactivos y (2) maximizar el n'umero de trabajos ejecutados
por lotes.
%}}}
%}}}
%{{{  M'edidas de Rendimiento
\section{M'edidas de Rendimiento}
Veamos las diferentes formas de medir el rendimiento de una computadora:
%{{{  El Tiempo de CPU
\subsection{El Tiempo de CPU}
El tiempo es la medida del rendimiento de un computador: el computador que
realiza la misma cantidad de trabajo en el m'inimo tiempo es el m'as
r'apido. El tiempo de ejecuci'on de un programa o tiempo de CPU ($T_{CPU}$)
se mide se mide en segundos por programa.
En sistemas multiusuario (UNIX) el sistema operativo puede medir diferentes
tiempos con el comando {\tt time}:
\begin{verbatim}
Sun Microsystems Inc.   SunOS 5.5.1     Generic May 1996
peke% time gzip -d fichero
10.5u 2.3s 1:07 19%
peke%
\end{verbatim}
donde la {\tt u} indica el tiempo de usuario (tiempo consumido por el
comando en la CPU, memoria, disco, I/O, todo), la {\tt s} indica el tiempo
de sistema (tiempo consumido por el sistema operativo). A continuaci'on 1:07
Es el tiempo real de ejecuci'on, que depende fundamentalmente de la carga
del sistema. Por 'ultimo, 19\% es el porcentaje de tiempo de CPU consumido
por el comando {\tt gzip -d fichero}. Es decir:
$$
{10.5 + 2.3 \over 67} \times 100 = 19\%
$$

El tiempo de CPU puede calcularse a partir de las siguientes m'etricas
de rendimiento: el n'umero de ciclos de reloj consumidos por un programa
($C$) y la duraci'on del ciclo de reloj ($t$) (o de su frecuencia $f$):
\begin{equation}
t=C\times T={C\over F}
\Label{t-CPU}
\end{equation}
Esta f'ormula aclara al dise~nador de hardware que puede mejorar el
rendimiento reduciendo la duraci'on del ciclo de reloj o el n'umero de
ciclos que se necesitan para ejecutar un programa. Como veremos, aumentar
la frecuencia tambi'en est'a relacionado con aumentar el n'umero de ciclos.
%{{{  Ejemplo 1.1
\Ejemplo
{Nuestro programa favorito se ejecuta en 10 segs en un el computador A que
funciona a 100 MHz. Estamos tratando de eyudar a un dise~nador de
computadores que construye una m'aquina B, que ejecutar'a este programa en
6 segs. El dise~nador ha determinado que es posible un incremente
sustancioso en la frecuencia de reloj, pero este incremento afectar'a al
resto del dise~no de la CPU, haciendo que la m'aquina B necesite 1.2 veces
el n'umero de ciclos que la m'aquina A. > Qu'e frecuencia de reloj deber'a
utilizar el dise~nador ?.}{Conociendo
que $T_{CPU-A}=10$ segs, y que $f_A=100$ MHz, podemos calcular el
n'umero de ciclos de reloj consumidos por el programa en esta computadora:
$$
C_A=10 {\mathrm segs\over prog}\times 100M {\mathrm ciclos \over segs}=
10^9 {\mathrm ciclos\over prog}
$$
Como sabemos que la CPU-B aumenta el $\overline{CPI}$ en un factor de 1.2,
sustituyendo en la \Eq{t-CPU}, tenemos que para la CPU-B:
$$
6 {\mathrm segs\over prog}={10^9 {\mathrm ciclos\over prog}
\times 1.2 \over F_B{\mathrm ciclos\over seg}}
$$
De donde despejando:
$$
F_B={1.2\times 10^9 {\mathrm ciclos\over prog}\over 6 {\mathrm segs\over
prog}}= 200 {\mathrm MHz}
$$}
%}}}

El n'umero de ciclos de reloj consumidos por un programa ($C$) es una
m'etrica que depende del n'umero de instrucciones del programa o recuento de
instrucciones ($I$) y del
n'umero de ciclos de reloj medio por instruccion ($CPI$), que es el n'umero
medio de ciclos de reloj que cada instrucci'on necesita para ejecutarse.
Se da un valor promedio porque normalmente no todas las instrucciones se
ejecutan con un n'umero igual de ciclos. Por tanto:
\begin{equation}
C=I\times \overline{CPI}
\Label{Ciclos}
\end{equation}
%{{{  Ejemplo 1.2
\Ejemplo {
Supongamos dos implementaciones de una misma arquitectura del repertorio de
instrucciones. La m'aquina A tiene una duraci'on del ciclo de reloj de 10
nsegs y un $CPI=2.0$ para un programa dado, mientras que la m'aquina B tiene
una duraci'on del ciclo de relof de 20 nsegs y un $CPI=1.2$. > Qu'e m'aquina
es m'as r'apida y cuanto ?}{
Puesto que ambas m'aquinas implementan la misma arquitectura, sabemos que
cada m'aquina ejecuta el mismo n'umero de instrucciones $I$. Por tanto,
podemos calcular el n'umero de ciclos de reloj gastados en cada m'aquina:
$$
C_A=I\Dim{inst}{prog} \times 2.0\Dim{ciclos}{inst}
$$
$$
C_B=I\Dim{inst}{prog} \times 1.2\Dim{ciclos}{inst}
$$
Por tanto, sustituyendo en la \Eq{t-CPU}, para la m'aquina A:
$$
t_{CPU-A}=C_A\times T_A=2.0I\Dim{ciclos}{prog} \times 10n\Dim{segs}{ciclo} =
20n\times I\Dim{segs}{prog}
$$
Y para la m'aquina B:
$$
t_{CPU-B}=C_B\times T_B=1.2I\Dim{ciclos}{prog} \times 20n\Dim{segs}{ciclo} =
24n\times I\Dim{segs}{prog}
$$
Es claro que la m'aquina A es m'as r'apida. La rapidez viene dada por la
relaci'on entre los tiempos de ejecuci'on:
$$
{R_A\over R_B}={t_{CPU-B}\over t_{CPU-A}}={24n\times I\Dim{segs}{prog} \over
20n\times I\Dim{segs}{prog} } =1.2
$$
Luego la m'aquina A es 1.2 veces m'as r'apida que la m'aquina B.}
%}}}

Sustituyendo la \Eq{t-CPU} en la \Eq{Ciclos} obtenemos la
equaci'on  b'asica del rendimiento en t'erminos del recuento de
instrucciones $I$, del n'umero medio de ciclos por instrucci'on $CPI$ y
de la duraci'on del ciclo de reloj $T$.
\begin{equation}
t=I\times \overline{CPI}\times T={I\times \overline{CPI}\over F}
\Label{t-CPU1}
\end{equation}
Esta expresi'on es particularmente 'util porque separa los tres factores
clave que afectan al rendimiento. Podemos usarla para comparar dos
implementaciones diferentes o para evaluar un dise~no alternativo si
conocemos su impacto sobre estos tres par'ametros. El par'ametro $I$ depende
b'asicamente de la tecnolog'ia del compilador o de nuestra habilidad para
programar en ensamblador si estamos usando un ensamblador. El par'ametro $T$
depende de la tecnolog'ia de integraci'on en ese instante ya que integrar
con menos micras supone construir dados m'as peque~nos que van a transmitir
menos calor al encapsulado porque su superficie es menor y por lo tanto se
puede aumentar la frecuencia de reloj. El 'unico par'ametro que puede manupular
el arquitecto de procesadores es el $\overline{CPI}$ y esto es lo que se
estudia en esta asignatura.
%{{{  Ejemplo 1.3
\Ejemplo{Un dise~nador de compiladores est'a tratando de decidir entre dos secuencias
de c'odigo para una m'aquina particular. Los dise~nadores hardware han
suninistrado la siguiente informaci'on:\label{ejemplo_sec}
$$
\begin{tabular}{|c|c|}
\hline
Clase de Instrucci'on & $CPI$ \\
\hline
A                     & 1 \\
B                     & 2 \\
C                     & 3 \\
\hline
\end{tabular}
$$
Para una instrucci'on particular de un lenguaje de alto nivel, el escritor
de compiladores est'a considerando dos secuencias de c'odigo que requieren
los siguientes recuentos de instrucciones:
$$
\begin{tabular}{|l|c|c|c|}
\hline
Secuencia      & \multicolumn{3}{c|}{Recuentos de instrucciones} \\
\cline{2-4}
de c'odigo     & A & B & C \\
\hline
1              & 2 & 1 & 2 \\
2              & 4 & 1 & 1 \\
\hline
\end{tabular}
$$
> Qu'e secuencia de c'odigo ejecuta m'as instrucciones ?. > Cu'al ser'a m'as
r'apida ?. > Cu'al es el $\overline{CPI}$ para cada secuencia ?.}{La
secuencia 1 ejecuta $2+1+2=5$ instrucciones, mientras que la secuencia 2
ejecuta $4+1+1=6$ instrucciones. Por tanto, la secuencia 1  ejecuta menos
instrucciones.
\\
Para averiguar que m'aquina es la m'as r'apida podemos ver cu'al secuencia
de instrucciones consume menos ciclos de reloj ya que la arquitectura es la
misma. Puesto que el $CPI$ no es constante, calculamos el n'umero total de
ciclos consumidos por la secuencia mediante:
\begin{equation}
C=\sum_{i=1}^{n} (CPI_i\times C_i)
\Label{ciclos_totales}
\end{equation}
donde $n$ es el n'umero de instrucciones distintas del repertorio. Por
tanto:
$$C_1=(2\times 1)+(1\times 2)+(2\times 3)=10\Dim{ciclos}{secuencia} $$
$$C_2=(4\times 1)+(1\times 2)+(1\times 3)=9\Dim{ciclos}{secuencia} $$
Por tanto la secuencia 2 es la m'as r'apida.
\\
Por 'ultimo vamos a calcular los $CPI$ totales de cada secuencia.
Sustituyendo en la \Eq{Ciclos} y despejando:
$$
CPI_1={C_1\over I_1}={10\Dim{ciclos}{sec} \over 5\Dim{inst}{sec} }
=2\Dim{ciclos}{inst}
$$
$$
CPI_2={C_2\over I_2}={9\Dim{ciclos}{sec} \over 6\Dim{inst}{sec} }
=1.5\Dim{ciclos}{inst}
$$}
%}}}

En el caso de estar trabajando con una carga de trabajo (un conjunto de
programas), el tiempo de ejecuci'on de la carga $t_{WL}$ puede calcularse
como:
\begin{equation}
t_{WL}=\sum_{i=1}^n w_i\times t_i
\end{equation}
donde $n$ es el n'umero de trabajos diferentes de la carga, $w_i$ es la
frecuencia de aparici'on del trabajo $i$-'esimo y $t_i$ es el tiempo de
ejecuci'on del trabajo $i$-'esimo.
%}}}
%{{{  Otras "M'etricas de Rendimiento"
\subsection{Otras "M'etricas" de Rendimiento}
%{{{  MHz
\subsubsection{MHz}
Las m'etricas de rendimiento f'acilas de entender por los potenciales
compradores de computadoras han sido v'astamente utilizadas. Cualquiera
conoce que en un computador digital todos los elementos son sincronizados
con un reloj y que si este oscila a m'as velocidad los eventos ocurrir'an
antes y por lo tanto los programas se ejecutar'an en menos tiempo. Esta
comparaci'on es cierta entre computadoras con el mismo repertorio de
instrucciones y mismo n'umero de ciclos por instrucci'on para cada una de
ellas. En resumen, podemos atender a la frecuencia de reloj cuando ambas
m'aquina posean id'entico procesador.

Por otro lado ha de tenerse en cuenta que el procesador no es el 'unico
hardware presente en la computadora y que la memoria, los buses y el
sistema de entrada/salida emplean tambi'en bastante tiempo en la ejecuci'on
de los programas, y que estos dispositivos pueden funcionar as'icronamente,
por lo que un aumento en la velocidad del reloj no los har'a funcionar a
m'as velocidad. Por ejemplo, si comparamos dos m'aquinas 486 una a 25 MHz y
la otra a 33 MHz, sabremos que el procesador va m'as r'apido en la segunda
pero no si los programas se ejecutan m'as r'apidamente porque no conocemos
de cuandos nsegs son los chips de memoria, ni de cuandos msegs es el tiempo
de acceso al disco, etc. Una computadora no es s'olo procesador.
%}}}
%{{{  MIPS
\subsubsection{MIPS}
Una m'etrica intuitiva que da cierta idea de la potencia de una m'aquina
son los {\bf MIPS} (Millones de Operaciones Por Segundo). Se definen como:
\begin{equation}
{\mathrm MIPS}={I\over t\times 10^6}
\Label{MIPS1}
\end{equation}
Sustituyendo en la \Eq{MIPS} la definici'on de $t$ dada en la
\Eq{t-CPU} obtenemos que:
\begin{equation}
{\mathrm MIPS}={F\over \overline{CPI}\times 10^6}
\Label{MIPS2}
\end{equation}
Esta f'ormula muestra que MIPS es una medida de la frecuencia de ejecuci'on
de instrucciones para una m'aquina en particular. A esta medida en ocasiones
tambi'en se denomina {\bf MIPS nativo}. Es claro que m'aquinas m'as r'apidas
tienen una frecuencia en MIPS m'as alta. Lo bueno de MIPS es que es una
medida f'acil de comprender pero tiene 3 serios defectos:
\begin{enumerate}
\item No podemos comparar m'aquinas con diferentes repertorios de
instrucciones porque MIPS no expresa la complejidad de cada instrucci'on,
es decir, no dice nada de la cantidad de trabajo que realiza cada
instrucci'on.
\item Los MIPS son variables para una misma m'aquina e incluso para un
mismo programa, pues depende de si el c'odigo ha sido optimizado y de los
$CPI$ de la instrucciones usadas.
\item Los MIPS pueden aumentar inversamente al rendimiento.
\item Los MIPS s'olo hablan del procesador y no del resto del hardware
del computador que tambi'en influye en el tiempo de ejecuci'on.
\end{enumerate}
Para poner de manifiesto este 'ultimo problema vamos a ver el siguiente
ejemplo:
%{{{  Ejemplo 1.4
\Ejemplo{Suponer una computadora que ejeucta las tres clases de instrucciones
especificadas en el ejemplo de la p'agina \pageref{ejemplo_sec}. Supongamos
adem'as que para compilar el mismo programa usamos dos compiladores
diferentes:
$$
\begin{tabular}{|l|c|c|c|}
\hline
C'odigo de     & \multicolumn{3}{c|}{Recuentos de instrucciones en millones} \\
\cline{2-4}
               & A & B & C \\
\hline
Compilador 1   & 5 & 1 & 1 \\
Compilador 2   & 10 & 1 & 1 \\
\hline
\end{tabular}
$$
Suponer que la frecuencia de reloj es de 100 MHz. > Qu'e secuencia de c'odigo
se ejecutar'a con m'as rapidez de acuerdo con los MIPS ?. > Y deacuerdo con
el tiempo de ejecuci'on ?.}{Vamos a calcular los MIPS deacuerdo con la
\Eq{MIPS2}. Para ello debemos de saber primero los $\overline{CPI}$ que
arroja cada compilador. Si sustituimos la \Eq{ciclos_totales} en la
\Eq{Ciclos} obtenemos la siguiente expresi'on:
\begin{equation}
\overline{CPI}={\sum_{i=1}^{n}(CPI_i\times C_i) \over I}
\Label{CPI}
\end{equation}
Por tanto, podemos usar la \Eq{CPI} para calcular los valores de
$\overline{CPI}$ de cada secuencia de c'odigo:
$$
\overline{CPI_{C1}}={5M\Dim{inst}{prog} \times 1\Dim{ciclo}{inst} +
1M\Dim{inst}{prog} \times 2\Dim{ciclos}{inst} +
1M\Dim{inst}{prog} \times 3\Dim{ciclos}{inst} \over
(5M + 1M + 1M)\Dim{inst}{prog} } =
{10\Dim{ciclos}{prog} \over 7\Dim{inst}{prog} } = 1.43\Dim{ciclos}{inst}
$$
$$
\overline{CPI_{C2}}={10M\Dim{inst}{prog} \times 1\Dim{ciclo}{inst} +
1M\Dim{inst}{prog} \times 2\Dim{ciclos}{inst} +
1M\Dim{inst}{prog} \times 3\Dim{ciclos}{inst} \over
(10M + 1M + 1M)\Dim{inst}{prog} } =
{15\Dim{ciclos}{prog} \over 12\Dim{inst}{prog} } = 1.25\Dim{ciclos}{inst}
$$
Ahora podemos usar la \Eq{MIPS2} par calcular los MIPS:
$$
MIPS_1={100M\Dim{ciclos}{seg} \over 1.43\Dim{ciclos}{inst} \times 10^6} =
69.9
$$
$$
MIPS_2={100M\Dim{ciclos}{seg} \over 1.25\Dim{ciclos}{inst} \times 10^6} =
80.0
$$
\\
Ahora vamos a calcular los tiempos para comprobar si los MIPS coinciden
con el rendimiento real. Para ello usamos la \Eq{t-CPU1}:
$$
t_{CPU-C1}={(5+1+1)\times 10^6\Dim{inst}{prog} \times 1.43\Dim{ciclos}{inst}
\over
100\time 10^6\Dim{ciclos}{seg} } = 0.10\Dim{segs}{prog}
$$
$$
t_{CPU-C2}={(10+1+1)\times 10^6\Dim{inst}{prog} \times 1.25\Dim{ciclos}{inst}
\over
100\time 10^6\Dim{ciclos}{seg} } = 0.15\Dim{segs}{prog}
$$
Quiere decir esto que el compilador 1 es mejor pues construye programas que
se ejecutan m'as r'apidamente y sin embargo arroja una cantidad de MIPS
menor.
}
%}}}

Una situaci'on particular en la que los MIPS son especialmente enga~nosos
es cuando se habla de {\bf MIPS pico}. Este valor se obtiene cuando la
mezcla de instrucciones minimiza el $\overline{CPI}$, aunque esta mezcla
sea totalmente in'util.
%}}}
%{{{  MFLOPS
\subsubsection{MFLOPS}
Los MFLOPS dan una idea de la potencia de una computadora para ejecutar
aplicaciones cient'ificas y presenta una ventaja sobre los MIPS: las
operaciones reales en una aplicaci'on cient'ifica dependen de la
aplicaci'on y de del repertorio de instrucciones de la m'aquina. As'i,
sea cual sea la computadora, para ejecutar un programa dado, el n'umero de
operariones en punto flotante es constante. Se define as'i:
\begin{equation}
{\mathrm MFLOPS}={P\over t\times 10^6}
\Label{MFLOPS}
\end{equation}
Su uso por tanto es menos enga~noso que los MIPS pero tiene los siguiente
inconvenientes:
\begin{enumerate}
\item Los repertorios de instrucciones de punto flotante no es el mismo en
todas las computadoras. Por ejemplo, en el CRAY-2 no existe divisi'on
implementada en HW y por lo tanto debe de programarse mediante SW. Si
comparamos el CRAY-2 con el Motorola 68882 que si la tiene y calculamos el
n'umero de MFLOPS que alcanzan ambas m'aquinas veremos que el CRAY-2 tiene
m'as porque ejecuta instrucciones en punto flotante m'as sencillas para
realizar la divisi'on. Cualquiera de ellas se ejecuta antes que la divisi'on
pero el conjunto de ellas se ejecuta usando m'as tiempo que la instrucci'on
de divisi'on por HW del Motorola 68882. El CRAY-2 obtiene m'as MFLOPS cuando
dividiendo ser'ia m'as lento.
\item Existen aplicaciones en las que no se usa la unidad de punto flotante,
como en el ejemplo de un compilador o de un gestor de bases de datos, o en
un sistema operativo. Hablar de MFLOPS no dice nada acerca de la velocidad
a la que se van a ejecutar este tipo de aplicaciones. Por tanto, para un
mismo programa, el n'umero de MFLOPS puede variar. S'olo hablan de la
velocidad de la unidad en punto flotante (FPU: Floating Point Unit) y no
del resto de la m'aquina.
\item Cuando se especifican los MFLOPS no se dice nada de que tipo de
operaci'on se trata y resulta que no todas las operaciones en punto flotante
consumen el mismo tiempo. Por ejemplo, una suma en punto flotante siempre se
ejecuta m'as r'apido que una multiplicaci'on o una divisi'on porque se
realizan menos c'alculos en la FPU.
\end{enumerate}
Lo mismo que ocurre con los MIPS, tambi'en es posible hablar de {\bf
MFLOPS pico} durante un determinado proceso en el que 'unicamente se
realizan operaciones en punto flotante que tienen $\overline{CPI}$ m'inimo.
Esta medida es muy enga~nosa, pues la mayor'ia de las aplicaciones
cient'ificas nunca se ejecutan de esta manera.
%}}}
%{{{  SPEC
\subsubsection{SPEC}
SPEC (System Performance Evaluation Cooperative) se fund'o en 1988 por DEC,
MIPS, SUN, HP, etc, para ejecutar un conjunto especial de programas de
prueba en todas sus m'aquinas. Entre ellos podemos citar a gcc, espreso,
spice, nasa7, .... La principal ventaja de esta m'etrica fu'e hablar de
tiempo de ejecuci'on, lo que mide la velocidad de funcionamiento de todo
el computador y no 'unicamente de la CPU o de la FPU.

El conjunto de programas que forman SPEC puede variar a lo largo del
tiempo debido principalmente a dos razones: (1) porque el programa deja de
tener inter'es computacional o (2) porque alguno de ellos es muy
optimilzable por el compilador que lo detecta como programa de prueba y
lo sustituye por c'odigo m'aquina optimizado a mano, lo que no representa
una situaci'on real. Cuando se realiza alguna revisi'on, se habla de
SPEC<a~no> por lo que una misma m'aquina puede tener diferentes valores de
SPEC dependiendo de la revisi'on de los programas de prueba. Este tipo de
programas de test (benchmarks) se empezaron a usar porque cuando se
constru'ia una nueva m'aquina o bien no se dispon'ia de compilador o bien
este se encontraba en un estado muy precoz. Esto supon'ia que no era posible
compilar y ejecutar aplicaciones reales porque eran demasiado grandes de
ensamblar o el compilador no las pod'ia manejar.
%}}}
%}}}
%}}}
%{{{  El Coste
\section{El Coste}
El dise~nador de computadores debe tener en mente: (1) maximizar el
rendimiento (2) minimizando el coste. Existe un dominio de dise~no de alto
rendimiento, en el cual este es el objetivo principal (supercomputadores).
En el otro extremo se intenta minimizar el coste y es el rendimiento el que
te encuentra en un segundo plano (ordenadores personales y cl'onicos). La
mayor'ia de los usuarios se preocupan tanto del coste como del rendimiento.
En el coste de una m'aquina influyen: (1) el coste de los componentes, (2)
el coste de la mano de obra, (3) los gastos de investigaci'on (4) el
marketing y (5) el margen de beneficios.

Es el coste lo que hace realmente desaparecer una familia de computadores
porque existe otra que proporciona el mismo rendimiento a menor coste.
Esto se pone de manifiesto en la siguiente gr'afica en la que cuando
la familia de la micro-computadores alcanza el rendimiento de la familia
superior, esta deha de fabricarse.
%{{{  Rendimiento VS Tiempo
\begin{figure}
 \centerline{\epsfxsize=7.62 cm \epsfbox{rendimientoVStiempo.eps}}
 \label{Z-order}
 \caption{The Z-order of a squared image with $4 \times 4$ pixels}
\end{figure}
%}}}
%}}}
%{{{  La Ley de Amdahl
\section{La Ley de Amdahl}
Nos habla de la mejora en el tiempo de ejecuci'on introducida cuando
mejoramos alg'un componente del sistema que no necesariamente se ha de usar
todo el tiempo. Sea $f$ la fraci'on del tiempo en que usamos la mejora,
$t_{uso}$ el tiempo de utilizaci'on de la mejora y $t$ el tiempo total de
ejecuci'on:
\begin{equation}
f={t_{uso}\over t}\leq 1
\Label{frac}
\end{equation}
Se $\alpha$ el factor de mejora, es decir, cuantas veces es m'as r'apido el
componente mejorado. La {\bf Ley de Amdahl} nos calcula el nuevo tiempo de
ejecuci'on mejorado $t_{mej}$ en funci'on del altiguo tiempo de ejecuci'on
$t=t_{ant}$:
\begin{equation}
t_{mej}=t_{ant}(1-f)+t_{ant}\times {f\over \alpha}
\Label{Amdahl}
\end{equation}
Es decir, $t_{mej}$ es igual al tiempo de ejecuci'on no afectado por la
mejora m'as el tiempo de ejecuci'on afectado por la mejora.
%{{{  Ejemplo 1.5
\Ejemplo{Supongamos una computadora que ejecuta un programa en 100 segs de
los cuales el 80\% del tiempo (80 segs) se emplean en operaciones de
multiplicaci'on. > Cu'anto habr'ia que mejorar la velocidad de la
multiplicaci'on si deseamos que el programa se ejecute 5 veces m'as
r'apido ?}{Aplicando la definici'on de la ley de Amdahl:
$$
20 {\mathrm segs} = 100 {\mathrm segs}\times (1-0.8)+100
{\mathrm segs}\times {0.8\over \alpha}
$$
$$
\alpha={80\over 0}\Rightarrow\alpha=\infty
$$
Luego es imposible ejecutar el programa 5 veces m'as r'apido.}
%}}}

%}}}
%}}}
%{{{  Salida
\end{document}
%}}}

