¿El final de la Ley de Moore llevaría a un renacimiento en el desarrollo de software?

Todavía estamos lejos del límite y no se trata solo de nanómetros. Sí, el canal de un transistor CMOS típico tiene fugas, mientras que los circuitos basados ​​en ellos no son confiables si se reducen demasiado.

Lo que se puede hacer con el estado actual de la tecnología es:

  • reducir elementos un poco más;
  • usar células aisladas (silicio / lo que sea sobre aislador);
  • utilizar materiales mejorados de baja K para aislamiento y puertas de alta K;
  • use diferentes sustratos que no sean Si (GaAs, InSb, C …, diferentes transistores disponibles);
  • Estructuras 3D (interconexiones más cortas, pero problemas con el hundimiento de la energía térmica);
  • interconexiones ópticas (para buses internos y externos, etc.);
  • circuitos asíncronos (menor consumo de energía, pero aún caro para el desarrollo; actualmente se usa solo ocasionalmente);
  • lógica digital programable dedicada (como FPGA, consumo de energía 10–1000x menor que los equivalentes de software; podría usarse para secciones de código críticas, por ejemplo);
  • mayor integración de componentes críticos del sistema (CPU / GPU / memoria / …);
  • otras mejoras tecnológicas y microarquitectónicas,

Por lo tanto, hay suficiente espacio para mejorar el rendimiento de los circuitos digitales durante los próximos 15 a 30 años, especialmente a las velocidades de transferencia de datos que se convierten en un cuello de botella significativo en la actualidad.

Tenga en cuenta que casi todas las técnicas mencionadas son muy caras para la investigación y el desarrollo, mientras que la industria elige soluciones menos costosas y probadas como el paralelismo, etc. Cuando lleguemos al límite, algunas de estas técnicas se aplicarán con seguridad (pero a un precio). Esto ha sucedido muchas veces antes y volverá a suceder.

Por supuesto, se usarán más y más algoritmos que usan paralelismo, mientras que un lenguaje de programación con excelente soporte nativo para implementar ese paralelismo tendrá una gran ventaja sobre otros lenguajes. Probablemente, invertir en el software como componente del sistema es menos costoso al final.

Futuro? Espintrónica, polímeros y / o chips orgánicos (fabricados por bacterias, por ejemplo), computadoras cuánticas (que utilizan incluso entrelazamiento cuántico), transistores superconductores, redes neuronales …

Durante más de una década, la gente ha estado escribiendo bloatware porque la velocidad del hardware les dio un pase gratis.

Los lenguajes dinámicos interpretados y los marcos hinchados han aumentado. Pero todo eso cambió porque el rendimiento por vatio se ha convertido en un cuello de botella ahora.

Andrei Alexandrescu fue contratado por Facebook principalmente para que pudieran servir su contenido con el menor gasto de tiempo y energía. Terminaron escribiendo un compilador de PHP a C ++ y luego otra solución Hackish (juego de palabras) para hacer las cosas más rápido.

Andrei mencionó en algunas conversaciones cómo incluso el 1% de la mejora de la velocidad o el consumo de energía en el backend de Facebook pagaría lo suficiente en ahorros de energía en un año, para pagar su salario durante toda su vida y más.

Ya no es sensato juntar fragmentos de código para crear enormes sistemas escalables y eficientes: la comunidad de node.js probablemente todavía no comprende esto, pero los escritores del motor de JavaScript están asumiendo la carga de la deuda técnica por ellos. En algún momento se golpeará otra pared donde JS simplemente no puede ser más rápido y la hinchazón comenzará a criar su fea cabeza (ya se ve en muchos sitios web).

Ahora es el momento para que todos los codificadores inteligentes comiencen a prepararse para economizar y optimizar, nunca pasará de moda hacer más cosas más rápido, con menos código, y aprenderá mucho más practicando eso, que producir grandes bolas de barro .

MS ha estado promocionando su renacimiento de C ++ como conferencias “GoingNative”, y hay un gran interés en los lenguajes compilados: Rust, Swift, Go, D

Las GPU masivamente paralelas también son algo que debe explotarse al máximo y, ciertamente, no será un paquete Node lo que lo haga.

El aprendizaje automático impone una demanda masiva a la computación, y solo pedirá más a medida que pase el tiempo. En algún momento, su teléfono móvil querrá poder conducir su automóvil por usted.

Se producirá un renacimiento, y los desarrolladores deberían prepararse para él, quizás pensando un poco en las consideraciones de tiempo de ejecución de su código en lugar de “mientras funcione, es bueno”, ¡para empezar!
De lo contrario, puede quedarse atrás, como las personas de DOS se quedaron atrás cuando Windows llegó junto con un modelo impulsado por eventos.

Tengo una perspectiva algo diferente a la expresada por Noam Ben-Ami.

La ley de Moore no está muerta. Ahora estamos en procesos de 10 nm, solo implementados en RAM por una compañía hasta el momento, y aunque Intel ha anunciado que se están deshaciendo de su “tic-tac” de arquitectura-arquitectura retráctil … aún no se ha hecho. Elija un sustrato diferente, y estamos de vuelta en el negocio hasta quizás 3 nm.

El límite absoluto son los sistemas nanomecánicos, lo que significa pequeños conjuntos de átomos y computación termodinámicamente reversible, y así sucesivamente. Excepto las computadoras cuánticas, y una forma fácil de lograr la densidad de la capa de obleas 3D, y otras cosas que podrían suceder para sacar a ese conejo del sombrero.

La Ley de Moore tiene mucho camino por recorrer.


Sin embargo … ya hemos pasado el tren por este acantilado un par de veces.

Y cada vez, ha habido un cambio de enfoque.

Y si bien hemos visto algunas cosas interesantes (léase: tanto útiles como inesperadas ), en su mayoría en torno a algoritmos, en su mayor parte, somos más pobres para la prueba .

Escogeré mis tres caballos favoritos en esta carrera …


Multiplicadores de reloj

Parece una idea ingeniosa, ¿verdad?

Su CPU tiene el doble de velocidad, y todo lo demás permanece a la misma velocidad, y obtiene más ciclos de cálculo para resolver su problema. Solo el cuello de botella en las cosas tiende a ser el ancho de banda de E / S, y eso significa la velocidad del bus por el ancho como un porcentaje de la velocidad del reloj de la CPU frente al tamaño de la línea de caché de la CPU.

Entonces sí: obtuviste CPU más rápidas, y pudiste hacer mucho trabajo en una pequeña cantidad de datos (porque si necesitabas más datos, te enfrentarías al problema de alimentar la CPU lo suficientemente rápido). Pero significaba que tenías tendencia a:

    1. Solo opere en pequeños conjuntos de datos, que limitaron artificialmente los tipos de problemas que incluso intentó resolver con las computadoras
    2. Solía ​​tener un exceso de ciclos de CPU, en comparación con los datos que deseaba procesar, por lo que tendía a escribir un código menos eficiente, porque, oye, estaba arrojando hardware al problema del ciclo de la CPU, por lo que tenía los ciclos para de repuesto

    Pero todo lo que pudimos ver a partir de entonces fueron los problemas relacionados con el cómputo.

    En otras palabras: ¡limitamos los tipos de problemas que incluso intentamos resolver!


    Agrupamiento

    Antes de que hubiera multinúcleo, había agrupación, principalmente porque … éramos terribles en la construcción de multinúcleo.

    Aquí es donde obtuvimos ideas como NUMA (que en realidad no es una mala idea) y multiprocesadores asimétricos (que, hey: todavía tengo mi Commodore Amiga, y además de la CPU 68000, también tiene procesadores separados llamados Agnus, Paula , y Denise chips) de los cuales tenemos la idea de que la GPU es algo separado (tampoco es realmente una mala idea).

    Pero aquí está la idea básica, terrible y horrible que subyace a la agrupación: puede agregar un montón de PC y obtener una supercomputadora .

    A primera vista, parece que es una gran idea. En la práctica, agrega un nodo al clúster, y su mejora no es 2X1 nodo, está más cerca de aproximadamente 1.2X1 nodo. Porque las interconexiones se volvieron aún más lentas .

    Así que tomo una máquina de bus de 32Mhz y 32Mhz, que tiene una velocidad de transferencia máxima de aproximadamente 1Gbit / S, o 100MB / S, y puse esta CPU duplicada que realmente no puedo alimentar lo suficientemente rápido como para mantenerlo ocupado todo el tiempo, y luego lo conecto a otra máquina a 1/10 de esa velocidad 10Mbit / S ethernet.

    Y esa es una supercomputadora … no realmente … es una supercomputadora. Mira cuántos FLOPS ( operaciones de punto flotante por segundo ) tengo cuando los sumas. Er … Siempre y cuando una operación no dependa del resultado de otra, quiero decir.

    Y ahora los únicos problemas que estamos tratando de resolver no son solo aquellos en los que puede lanzar grandes cantidades de ciclos de CPU, en conjuntos de datos relativamente pequeños, son uno en el que las operaciones no dependen de operaciones anteriores.

    El término técnico para esto es embarazosamente paralelo. Y aunque hay algunos problemas interesantes en este dominio, en realidad es un subconjunto de los problemas a los que nos gustaría poder lanzar ciclos de CPU, pero no podemos.

    Pero … pero … ¡Dios mío, mon! Mira los FLOPS!

    En otras palabras: ¡ limitamos aún más los tipos de problemas que incluso intentamos resolver!


    Multinúcleo

    Pero multinúcleo al rescate, ¿verdad? ¿Correcto?

    Multinúcleo resuelve en gran medida muchos de los problemas de interconexión que no pudimos resolver en clustering (incluso con InfiniBand).

    Comenzamos con dos CPU en un chip.

    Factoid : De hecho, participé en el proyecto SMP de FreeBSD; Tenía la segunda máquina FreeBSD que ejecutaba SMP; el primero perteneció a Jeff Vogel, quien realizó el trabajo original en Sun Microsystems. Luego lo arrojó sobre la pared, con un archivo de encabezado omitido intencionalmente, para ver quién estaba realmente interesado en trabajar en él, en lugar de simplemente jugar. Todo el mundo, menos yo, no tenía ni idea de eso durante varios meses.

    2 núcleos: eso sigue siendo bastante inútil; no tiene que ser bueno para escribir un sistema operativo paralelo en ese nivel, porque puede ejecutar el núcleo (principalmente) en uno o dos núcleos, y el otro (si queda) vive en el espacio de usuario ejecutando código.

    La edad de oro del multinúcleo en realidad comenzó en 4 núcleos.

    ¡Finalmente, la barrera de interconexión desapareció! … Volvamos a preocuparnos por el ancho de banda del bus, ¡mientras sigo escribiendo un código vergonzosamente paralelo!

    Smithers! ¡Libera los tamaños de caché!

    Exxxxxxxccceeeelllllent!

    Ahora podríamos operar en conjuntos de datos más grandes.

    Pero aunque el ancho de banda del bus de memoria aumentó un poco, pero no tan rápido como el ancho de banda de interconexión.

    También tuvimos el mismo problema que tuvimos la primera vez que comenzamos con los multiplicadores de reloj: mantener 24 núcleos en un solo dado alimentado. Y no pudimos acceder a los mismos elementos de datos al mismo tiempo, o obtuvimos un IPI para una invalidación de línea de caché (con paquetes discretos) o un aviso de derribo de TLB (para paquetes de caché L2 / L3 compartidos).

    Aquí está mi impresión de un sistema de 16 núcleos:

    Es bastante obvio que la CPU 14 obtuvo el mutex para algunos elementos de datos compartidos a los que todos también necesitan acceder, ¿verdad? ¿Y esa velocidad de reloj, en general, no está mejorando?

    Tenemos técnicas para esto. Podemos usar coloración en caché. Podemos usar NUMA virtual. y así.

    Pero todo se reduce a que, a medida que las personas de hardware construyen máquinas multinúcleo cada vez más grandes, las personas de software dividimos los recursos compartidos en trozos cada vez más pequeños para que no tengamos que compartirlos, y no hay contención.

    De esa manera, cada caracol … er … CPU … puede progresar continuamente, en lugar de detenerse esperando algún recurso compartido.

    El resultado es: volvemos a reforzar la idea de que está bien lanzar ciclos de CPU a nuestros problemas.

    ¿Tenemos un cálculo {A} que debe completarse antes de que otras 4 CPU puedan proceder con un cálculo {B [0], B [1], B [2], B [3]} en paralelo? Bueno, en lugar de pagar la contención, y la latencia, los costos asociados con muchos núcleos … no resolvamos {A} en una sola CPU, resuelva el mismo cálculo en las 4 CPU al mismo tiempo para que podamos hacer el {B} es de inmediato!

    Puede ver a dónde lleva esto: dejamos de intentar resolver problemas de grandes conjuntos de datos; luego pasamos a resolver problemas de grandes conjuntos de datos, pero solo si eran vergonzosamente paralelos, y ahora estamos de vuelta donde comenzamos, repitiendo el ciclo .


    En general: tengo que llamar a un aumento de enfoque en los ejes opuestos, alternativamente: una pérdida neta en el espacio del problema que tratamos de abordar.

    Creo que esto nos hace ciegos al problema (en Pensamiento y resolución de problemas, Toru Sato nos informa que esto se llama una fijación ), y creo que aumentar el tamaño de este punto ciego con el tiempo generalmente es algo malo .

    La ley de Moore ha estado muerta durante un tiempo, y eso ha llevado a algunos cambios en la forma en que las personas escriben el código, pero el término renacimiento no tiene sentido aquí, y también hay muchas otras tendencias en juego:

    Renacimiento significa “renacimiento”, pero el desarrollo de software ha estado en un estado constante de reinvención desde hace mucho tiempo. No es como si pasáramos por una situación de la Edad Media en la que la ingeniería de software se vio envuelta en algún tipo de estado en el que las personas intentaban sacrificar cerdos para que se aprobaran sus pruebas unitarias.

    Lo que ha estado sucediendo es que la ley de Moore dejó de funcionar cuando alcanzamos los límites físicos fundamentales, por lo que la industria cambió a arquitecturas multinúcleo . Además, el software se ha movido a microservicios y arquitecturas informáticas distribuidas , por ejemplo, Hadoop, Spark, RESTful APIs, etc. Todo eso ha llevado a las personas hacia enfoques de programación más funcionales, y eso se ha extendido a la ingeniería de la interfaz de usuario con la composición de funciones puras convirtiéndose en Un enfoque ganador con el auge de React & Redux .

    Entonces estamos viendo un aumento en la programación funcional. Estamos viendo nuevas versiones de varios lenguajes (ES2015, Java 8, nuevas versiones de C #, que han estado en una cadencia rápida durante mucho tiempo) y nuevas plataformas y marcos informáticos que aprovechan estas nuevas características de lenguaje para hacer que la escritura sea más compleja para el usuario interfaces, aplicaciones y sistemas de datos menos dolorosos.

    Y la tasa de innovación no parece estar disminuyendo, ¡con los ciclos de reemplazo de toda la tecnología anterior comprimiéndose en algunos casos a aproximadamente 2 años!

    ¿que importa eso?

    Si los transistores no pueden ser más pequeños, siempre puede tener más en un chip.

    así que no entiendo tu pregunta.

    wle

    LearnLearnLearnLearn