Archive

Archive for November, 2013

La Ley de Kurzweil, una extensión de la Ley de Moore

November 21st, 2013

La ley de Kurzweil es una extensión temporal y tecnológica de la Ley de Moore. Por todos es bien conocida la Ley de Moore que Gordon E. Moore enunció en 1965. Esta ley nos dice que el número de transistores que tiene un chip se dobla cada 24 meses, es decir, que la densidad de transistores en los chips se duplica cada dos años. Dado que además se dan otras mejoras tecnológicas, esto se suele reflejar en que la potencia de los ordenadores se multiplica por 2 cada 18 meses. Una tendencia similar se aplica a otro tipo de dispositivos electrónicos como la red, la memoria, etc. Es más, si nos ceñimos a la lista de los ordenadores más potentes del mundo, top500.org, la potencia de estos se duplica cada 14 meses, en los últimos 20 años la potencia de los superordenadores se ha multiplicado por 500.000.

Primer circuito integrado de la historia, de J. Kilby.

Primer circuito integrado de la historia, de J. Kilby.

La Ley de Moore tiene una gran relevancia porque predijo un crecimiento exponencial de la potencia de los ordenadores, y la electrónica en general, tan solo 7 años después de la creación del primer circuito integrado y esta se sigue cumpliendo con gran precisión casi 50 años después de enunciarla a pesar del enorme incremento supone una ley de crecimiento exponencial.

Si bien la Ley de Moore es muy conocida, no lo es tanto la Ley de Kurzweil. Esta Ley nos dice que la potencia de cálculo ha ido creciendo exponencialmente desde la creación de las primeras máquinas capaces de computar automáticamente mediante el uso de tarjetas perforadas a principios del siglo XX.

En la figura inferior se muestra la evolución temporal del número de operaciones por segundo que realizaban diferentes máquinas a un costo fijo. Como podemos observar las máquinas mecánicas a base tarjetas perforadas inventadas a principio del siglo XX fueron mejorando e incrementando su potencialmente durante 35 años hasta que las primeras máquinas con relés electromecánicos tomaron el relevo. Evidentemente, los relés electromecánicos responden mucho más rápido que los mecánicos y esta tecnología se usó durante un breve periodo hasta que en la década de los 40 fueron totalmente sustituidos por las válvulas de vacío, elementos totalmente electrónicos y que no dependen de lentos movimientos mecánicos. Las válvulas de vacío dieron paso tras dos décadas a los transistores, dispositivos equivalentes pero construidos con materiales semiconductores mucho más baratos, longevos, con consumos mucho menores, etc. con los que se construyeron las computadoras en la década de los 60. Y finalmente tras las tarjetas perforadas, los relés electromecánicos, las válvulas de vacío y los transistores llegamos al quinto paradigma tecnológico: el circuito integrado. En realidad, este representa un paso adicional en el que los transistores se han miniaturizado y se integran varios en el mismo dispositivo, la tecnología electrónica se ha basado en estos dispositivos desde 1970.

Kurzweil law

Ley de Kurzweil

Tras 40 años de evolución cada vez se ve más cerca el fin evolutivo de esta tecnología. La miniaturización de los transistores es el proceso fundamental que ha permitido el aumento de la potencia de estos dispositivos al poder integrar más transistores en la misma área, mantener el consumo eléctrico a raya, reducir las distancias en los elementos, etc.  Pero parece que esta minitaturización va a encontrar no un límite tecnológico, sino con uno físico. El transistor, elemento fundamental de los circuitos integrados tiene dos modos en los que se puede cambiar y que lo hacen funcional: el estado de corte, cuando no pasa corriente por el transistor y el estado de operación cuando si pasa corriente. La miniaturización del transistor está llevando a que se construyan unos transistores tan pequeños que llegará un momento que la distancia entre la entrada y salida de la corriente será tan pequeña que será imposible colocar el transistor en modo de corte al no poder crear una barrera lo suficientemente eficaz como para impedir el paso de corriente. Esto es porque cuando la barrera se haga lo suficientemente pequeña en el modo de corte todavía habrá suficiente corriente debido al conocido efecto túnel de la mecánica cuántica, es decir, no será posible poner el transistor en modo de corte.  Siempre ha sido difícil determinar cuando se llegará a este límite, ahora se sitúa en el año 2026. Esto no significa necesariamente el avance tecnológico se detendrá, sino que seguramente surgirá otro nuevo paradigma tecnológico que sustituya al agotado transistor tradicional. Las grandes compañías tecnológicas lo saben y trabajan en ver que tecnología despuntará y se posicionará como el próximo paradigma tecnológico.

 
 
 

HPC

Comando while de Linux

November 18th, 2013

Regla mnemotécnica

while: Mientras en ingles.

While

El comando while es una instrucción de control de flujo que permite ejecutar una serie de comandos repetidamente sobre la base de una condición dada, es decir, genera un bucle. Cuando la condición deje de cumplirse, la ejecución del programa saldrá del bucle y no realizará más iteraciones. En los bucles while siempre hay que asegurarse de que siempre exista la condición que nos sacará del mismo, sino, entraremos en los peligrosos bucles infinitos donde se ejecuta la secuencia infinitamente. En caso de suceder esto es útil saber que podemos pulsar CTRL+C que mata el comando en curso.

Estructura del comando while

El comando while tiene la siguiente estructura

while [ condicion ]
do
    comandoA
    comandoB
done

donde los comandos entre do y done se ejecutan mientras se cumple la condición y se pueden poner tantos comandos como se desee. Si deseamos escribirlo en una línea este queda como:

while [ condicion ]; do comandoA ; comandoB ; done

Algunas expresiones que podemos usar como condición ya las ilustramos con el comando condicional if y puedes consultarlas en ese enlace. Se puede usar el comando continue para saltar a la siguiente iteración del bucle y el comando break para interrumpirlo. Veámoslo mejor con unos ejemplos.

 

Ejemplos Básicos

Aquí tenemos un bucle básico con while

i=1
while [ $i -le 10 ]
do
    echo "Estamos en la iteración $i"
    ((i++))
done

donde se imprimirá en pantalla "Estamos en la iteración 1", 2, 3, etc. hasta 10. Cuando ya no se cumple que i es menor o igual (-le: less or equal) a 10 se sale del bucle. ((i++)) es equivalente a i=$(($i+1)) e incrementa el contador i en una unidad. Ahora vamos a  ejecutar el mismo bucle pero saltándonos la iteración 4.

i=0
while [ $i -le 10 ]
do
    ((i++))

    if [ $i == 4 ]
    then
        continue
    fi
    echo "Estamos en la iteración $i"
done

Vemos que cuando i==4 vuelve de nuevo al inicio del bucle y no ejecuta la orden echo. Es importante como hemos cambiado el incremento del índice i al principio del bucle. Si estuviese al final el bucle se quedaría ejecutándose infinitamente con el valor i=4. Si en vez del comando continue hubiésemos usado el comando break, en la iteración 4 habría terminado la ejecución del comando while, se rompe el blucle, y continuaría con el script. También podemos crear un bucle infinito y usar el comando break para salir de él. En el siguiente ejemplo si el fichero abort no existe el bucle se ejecuta infinitamente, en el momento en que se crea el fichero abort, se detecta mediante el if, se sale del bucle.

while [ 1 == 1 ]
do
    echo "Estoy en el bucle."

    if [ -f abort ]
    then
        echo "El fichero abortar exite. Saliendo..."
        break
    fi
done

Por supuesto, también se pueden ejecutar bucles anidados, unos dentro de otros, como en el siguiente ejemplo.

i=1
while [ $i -le 5 ]
do
    #Para cada i un buble descendente hasta el valor i
    j=5
    while [ $j -ge $i ]
    do 
        echo "Estamos en la iteración i=$i j=$j"
        ((j--))
    done
    ((i++))
done

 

Ejemplos en un entorno de cálculo

Ejemplo 1:  Ejecutar el comando qstat -u $USER cada 30 minutos, donde $USER es una variable de entorno que define al usuario. La ejecución del bucle no modifica la condición de salida por lo que estamos ante un bucle infinito.

a=1
while [ $a == 1 ]
do
    qstat -u $USER
    #Esperamos sin hacer nada 1800 segundos, 20 minutos
    sleep 1800
done

Ejemplo 2: Mandar 10 trabajos (1.pbs, 2.pbs, …,10.pbs) a un sistema de colas PBS/Torque con el comando qsub:

x=10
while [ $x != 0 ]
do
    qsub $x.pbs
    x=$(echo $x-1 | bc)
done

o en una sola línea:

x=10; while [ $x != 0 ]; do qsub $x.pbs; x=$(echo $x-1 | bc); done

 

 

Comandos Avanzados, Linux