Escuché de personas que usan FPGA para mejorar el rendimiento de sistemas que hacen cosas como minería de monedas de bits, comercio electrónico y plegamiento de proteínas.

¿Cómo puede competir una FPGA con una CPU en rendimiento cuando la CPU normalmente se ejecuta al menos un orden de magnitud más rápido (en términos de velocidad de reloj)?

Comentarios

  • La FPGA hace todo a la vez.

Responder

CPU Los «s son dispositivos de procesamiento secuencial. Dividen un algoritmo en una secuencia de operaciones y las ejecutan una a la vez.

Los FPGA son (o pueden configurarse como) dispositivos de procesamiento paralelo. Un algoritmo completo puede ejecutarse en un solo tic del reloj o, en el peor de los casos, con muchos menos tic del reloj de los que necesita un procesador secuencial. Uno de los costos de la complejidad lógica aumentada es típicamente un límite inferior al que se puede sincronizar el dispositivo.

Teniendo en cuenta lo anterior, las FPGA pueden superar a las CPU en ciertas tareas porque pueden hacerlo. la misma tarea con menos tics de reloj, aunque a una frecuencia de reloj general más baja. Las ganancias que se pueden lograr dependen en gran medida del algoritmo, pero al menos un orden de magnitud no es atípico para algo como una FFT.

Además, debido a que puede construir múltiples unidades de ejecución paralela en una FPGA, Si tiene un gran volumen de datos que desea pasar a través del mismo algoritmo, puede distribuir los datos a través de las unidades de ejecución paralela y obtener más órdenes de magnitud de rendimiento superior al que se puede lograr incluso con una CPU de varios núcleos.

El precio que paga por las ventajas es el consumo de energía y $$$ «s.

Comentarios

  • +1; FPGA sin embargo no son tan dinámicos como las CPU, por lo que las CPU suelen ser más adecuadas para PC
  • » El precio que paga por las ventajas es el consumo de energía y $$$ ‘ s. «: esto suele ser cierto, pero puedes vencer directamente a una máquina Intel Xeon de alta gama con varios $ 1000 con un Xilinx Spartan-6 de gama baja $ 50 por muchos algoritmos. Pero eso generalmente requiere mucho tiempo de ingeniería y puede terminar con un diseño muy personalizado que solo funciona para una aplicación y es difícil de cambiar. Por lo tanto, la compensación no es solo poder y dinero, sino también tiempo de desarrollo, reutilización y flexibilidad del algoritmo. (Aunque puede discutir tiempo == dinero.)
  • markt, acerca de su última oración, ¿no son ‘ t FPGAs de mucha menor potencia que las CPU? Existe una amplia gama de dispositivos tanto para CPU como para FPGA, pero si observamos los que se utilizan para cosas como la minería de monedas de bits, no ‘ t las CPU utilizadas para esos tareas que consumen mucha más energía que las FPGA que se utilizarían?
  • @David: Cuando se habla de minería de Bitcoin, la métrica relevante es la cantidad de hashes por vatio. Markt se refiere al consumo de energía total. Es decir, una FPGA determinada puede consumir 3 veces la potencia de una CPU típica, pero ser mucho más de 3 veces más rápida en la minería de Bitcoin; entonces para Bitcoin eso ‘ es una victoria.
  • @Billy: el número de hashes por vatio · segundo, no por vatio.

Respuesta

Markt tiene esto en su mayor parte correcto, pero voy a arrojar mi 2 centavos aquí:

Imagina que te dije que quería escribir un programa que invirtiera el orden de los bits dentro de un entero de 32 bits. Algo como esto:

int reverseBits(int input) { output = 0; for(int i = 0;i < 32;i++) { // Check if the lowest bit is set if(input & 1 != 0) { output = output | 1; // set the lowest bit to match in the output! } input = input >> 1; output = output << 1; } return output; } 

Ahora mi implementación no es elegante, pero estoy seguro de que está de acuerdo en que habría algunas operaciones involucradas en hacer esto, y probablemente algún tipo de bucle. Esto significa que en la CPU, ha pasado más de 1 ciclo para implementar esta operación.

En una FPGA, simplemente puede conectar esto como un par de pestillos. Obtiene sus datos en algún registro, luego los conecta al registro diferente en orden inverso de bits. Esto significa que la operación se completará en un solo ciclo de reloj en la FPGA. Por lo tanto, en un solo ciclo, el FPGS ha completado una operación que le tomó a su CPU de propósito general muchos miles de ciclos para completar. Además, probablemente puede conectar algunos cientos de estos registros en paralelo. Entonces, si puede mover algunos cientos de números a la FPGA, en un solo ciclo terminará esas miles de operaciones cientos de veces, todo en 1 ciclo de reloj FPGA.

Hay muchas cosas que un La CPU de propósito general puede hacerlo, pero como limitación, configuramos instrucciones simples y generalizadas que necesariamente tienen que expandirse en listas de instrucciones simples para completar algunas tareas. Así que podría hacer que la CPU de propósito general tenga una instrucción como «orden inverso de bits para registro de 32 bits» y darle a la CPU la misma capacidad que la FPGA que acabamos de construir, pero hay un número infinito de instrucciones útiles posibles, por lo que solo coloque los que justifiquen el costo en las CPU populares.

Los FPGA, CPLD y ASIC le brindan acceso al hardware sin procesar, lo que le permite definir operaciones locas como «descifrar bytes cifrados AES256 con clave» o «decodificar fotogramas de video h.264». Estos tienen latencias de más de un ciclo de reloj en un FPGA, pero se pueden implementar de maneras mucho más eficientes que escribir la operación en millones de líneas de código ensamblador de propósito general. ¡Esto también tiene el beneficio de hacer que el FPGA / ASIC de propósito fijo para muchas de estas operaciones sea más eficiente en energía porque no tienen que hacer tanto trabajo extraño!

El paralelismo es la otra parte que marca señaló, y aunque eso también es importante, lo principal es cuando un FPGA paraleliza algo que ya era costoso en la CPU en términos de ciclos necesarios para realizar la operación. Una vez que empiezas a decir «Puedo realizar en 10 ciclos FPGA un tarea que toma a mi CPU 100,000 ciclos, y puedo hacer esta tarea en paralelo 4 elementos a la vez, «¡puedes ver fácilmente por qué una FPGA podría ser mucho más rápida que una CPU!

Entonces ¿Por qué no usamos FPGA, CPLD y ASIC para todo? Porque en general es un chip completo que no hace más que una operación. Esto significa que, aunque puede hacer que un proceso se ejecute muchos órdenes de magnitud más rápido en su FPGA / ASIC, no puede cambiarlo más tarde cuando esa operación ya no sea útil. La razón por la que no puede (generalmente) cambiar una FPGA una vez Lo que está en un circuito es que el cableado para la interfaz es fijo y normalmente el circuito no incluye componentes que le permitirían reprogramar la FPGA en una configuración más útil. Hay algunos investigadores que intentan construir módulos híbridos FPGA-CPU, donde hay una sección de la CPU que es capaz de ser recableada / reprogramada como una FPGA, lo que le permite «cargar» una sección efectiva de la CPU, pero ninguno de estos han llegado al mercado (hasta donde yo sé).

Comentarios

  • Para el ejemplo de inversión de bits (y todos los demás tareas de intercambio / selección) no ‘ realmente toma 1 ciclo de reloj, toma 0. En su ejemplo, toma 1 ciclo de reloj almacenar datos en un pestillo , que no es la misma operación. Se necesita 1 ciclo de reloj, ya sea que invierta los bits o no. La operación de invertir los bits es 0 ciclos de reloj; sin gastos generales, solo enrutamiento diferente. La diferencia no es solo semántica, especialmente cuando estás comenzando a sumar cosas. Por ejemplo, ¿cuánto tiempo se tarda en desplazar una palabra de 32 bits hacia abajo 3 bits, luego intercambiar cada dos mordiscos y luego invertirlos?
  • » FPGA-CP híbrido Módulo U «: han estado en el mercado durante mucho tiempo (consulte xilinx.com/products/silicon-devices/ soc / zynq-7000 / index.htm para uno moderno y exitoso), pero incluso sin soporte especial, la combinación de software & HDL se realiza comúnmente implementando una CPU suave en el interior FPGA en la estructura.
  • @wjl Usted ‘ tiene razón en que técnicamente no se necesitan ciclos para realizar la operación en sí. Sin embargo, diría que su ejemplo es solo semánticamente diferente, principalmente porque hacer esas tres operaciones se traduce lógicamente en un patrón de bits fijo (es decir, comienzo con b1b2b3b4 y termino con b3b1b4b2). Este fue mi punto en toda la respuesta. Estaba tratando de señalar que describir una operación como una serie de pasos con frecuencia solo es necesario cuando tienes un conjunto de instrucciones fijo / arreglo de puerta.
  • @wjl: La forma en que David-gardner hizo la pregunta, parece estar diciendo » CPU » es equivalente a una CPU Intel o AMD x86 / x86_64 con alta frecuencia, canalización y optimización. Hay muchas » CPU » suaves, pero ninguna de las diseñadas para sentarse en un FPGA puede sincronizarse como un i7, ni tampoco casi tan optimizados o capaces. En cuanto a los híbridos, quise decir algo como esto: newsroom.intel.com/docs/DOC-1512 , que aparentemente existe
  • el Zynq realmente no es ‘ un procesador tan malo (ARM Cortex-A9, lo mismo que funciona con tabletas, etc.), pero estoy de acuerdo en que sería mucho más increíble tener un FPGA integrado con un x86_64 de alta velocidad. =)

Respuesta

Todas las otras respuestas populares presentadas aquí hablan de diferencias literales entre FPGA y CPU. Señalan la naturaleza paralela de la FPGA frente a la naturaleza secuencial de una CPU, o dan ejemplos de por qué ciertos algoritmos podrían funcionar bien en una FPGA. Todos son buenos y verdaderos, pero sin embargo, sugeriría que hay una diferencia más fundamental entre CPU y FPGA.

¿Cuál es el denominador común entre un FPGA y una CPU? Es que ambos están construidos sobre silicio. Y en algunos casos, literalmente, los mismos procesos de silicio.

La diferencia fundamental son las abstracciones que apilamos sobre ese silicio. No es posible para un ser humano comprender todos los detalles de un único diseño de CPU moderno, desde el silicio hasta el IC empaquetado. Entonces, como parte del proceso de ingeniería, dividimos ese complejo problema en problemas manejables más pequeños que los humanos pueden entender.

Considere lo que se necesita para convertir ese silicio en una CPU en funcionamiento. Aquí hay una vista algo simplificada de las capas de abstracción necesarias para ese objetivo:

  1. Primero tenemos ingenieros que saben cómo crear transistores a partir de silicio. Saben cómo diseñar pequeños transistores que absorben energía y cambian a una velocidad de 10 o incluso 100 de gigahercios, y saben cómo diseñar transistores robustos que pueden impulsar señales con suficiente potencia para enviarlas fuera de un paquete IC y a través de una PCB. a otro chip.

  2. Luego tenemos diseñadores de lógica digital que saben cómo unir esos transistores en bibliotecas con cientos de celdas lógicas diferentes. Puertas lógicas, chanclas, muxes y sumadores, por nombrar algunos. Todo en una variedad de configuraciones.

  3. A continuación, tenemos varios grupos de ingenieros que saben cómo juntar esos bloques digitales (y a veces analógicos) para formar bloques funcionales de nivel superior como transceptores de alta velocidad, controladores de memoria, predictores de rama, ALU, etc.

  4. Luego tenemos diseñadores de CPU para diseñar diseños de CPU de gama alta reuniendo esas unidades funcionales en un sistema completo.

Y no se detiene ahí. En este punto, tenemos una CPU en funcionamiento que ejecuta código ensamblador, pero ese no es un lenguaje en el que la mayoría de los programadores escriben en estos días.

  1. Podríamos tener un compilador C que compila en ensamblador código (probablemente a través de alguna representación intermedia)
  2. Podríamos agregar otra abstracción sobre C para obtener un lenguaje orientado a objetos
  3. Podríamos incluso escribir una máquina virtual sobre C o C ++ para que podamos interpretar cosas como el código de bytes de Java

Y las capas de abstracción pueden continuar desde allí. El punto importante aquí es que esas capas de abstracción se combinan para producir un sistema basado en CPU que escala masivamente y cuesta una pequeña fracción de un diseño de silicio personalizado.

SIN EMBARGO, el punto importante que se debe hacer aquí es que cada abstracción también tiene un costo en sí misma. El diseñador de transistores no crea el transistor perfecto para cada caso de uso. Construye una biblioteca razonable, por lo que a veces se usa un transistor que consume un poco más de energía o un poco más de silicio de lo que realmente se necesita para el trabajo en cuestión. Y de manera similar, los diseñadores de lógica no construyen todas las celdas lógicas posibles. Pueden construir una puerta NAND de 4 entradas y una puerta NAND de 8 entradas, pero ¿qué sucede cuando otro ingeniero necesita una NAND de 6 entradas? Utiliza una puerta NAND de 8 entradas y conecta 2 entradas no utilizadas, lo que da como resultado la pérdida de recursos de silicio y potencia de cintura. Y así asciende por la cadena de abstracciones. Cada capa nos da una forma de manejar la complejidad, pero al mismo tiempo nos cobra un costo incremental adicional en términos de silicio y potencia.

Ahora compare esas abstracciones con lo que se necesita para una FPGA. Esencialmente, las abstracciones FPGA se detienen en el # 2 en la lista anterior. La FPGA permite a los desarrolladores trabajar en la capa lógica digital. Es algo más sofisticado que eso porque las CPU están codificadas de forma rígida en esta capa y las FPGA deben configurarse en tiempo de ejecución (que, por cierto, es la razón por la que las CPU suelen ejecutar frecuencias mucho más altas), pero la verdad esencial importante es que eso está lejos pocas abstracciones para FPGA que para CPU.

Entonces, ¿Por qué una FPGA puede ser más rápida que una CPU? En esencia, es porque la FPGA utiliza muchas menos abstracciones que una CPU, lo que significa que el diseñador trabaja más cerca del silicio. No paga los costos de todas las muchas capas de abstracción que se requieren para las CPU. Codifica en un nivel más bajo y tiene que trabajar más duro para lograr un poco de funcionalidad, pero la recompensa es un rendimiento más alto.

Pero, por supuesto, hay un lado negativo para menos abstracciones también. Todas esas abstracciones de CPU están ahí por una buena razón. Nos brindan un paradigma de codificación mucho más simple, lo que significa que más personas pueden desarrollar fácilmente para ellos. Eso, a su vez, significa que existen muchos más diseños de CPU y, por lo tanto, tenemos enormes beneficios de precio / escala / tiempo de comercialización de las CPU.

Así que ahí lo tiene. Los FPGA tienen menos abstracciones y, por lo tanto, pueden ser más rápidos y más eficientes en energía, pero difíciles de programar. Las CPU tienen muchos diseños de abstracciones para que sean fáciles de desarrollar, escalables y económicas. Pero renuncian a la velocidad y el poder en el comercio por esos beneficios.

Comentarios

  • Además, FPGA ‘ s están diseñados usando bloques repetitivos simples que son para realizar tareas lógicas simples. Están hechos a medida para determinados tipos de tareas.Las CPU ‘ s, OTOH, tienen muchas partes funcionales complejas, todas haciendo cosas diferentes. Se podría considerar que una CPU es un grupo de muchos dispositivos FPGA diferentes (después de todo, ‘ es solo silicio, electrónica y matemáticas). Entonces, ‘ no se trata de abstracciones, sino ‘ de complejidad. Las CPU ‘ son dispositivos complejos formados por muchos tipos diferentes de dispositivos eléctricos, mientras que una FPGA está formada por unos pocos. Una CPU es una escopeta, mientras que una FPGA es un rifle.

Responder

Mientras que las otras respuestas son todas correctas , ninguno de ellos todavía aborda el ejemplo de minería de bitcoins de su pregunta, que de hecho es un ejemplo decente. La minería de Bitcoin implica calcular repetidamente una función de hash criptográfica, SHA-256 del resultado de otro cálculo SHA-256, de datos donde solo cambia un entero de 32 bits, hasta que el hash resultante tiene ciertas propiedades. Cada SHA-256 consta de 64 repeticiones del mismo algoritmo que incluyen adiciones de 32 bits, cambios de bits y algunas operaciones más de manipulación de bits.

Si programa este bucle en una CPU de 32 bits (o más) , encontrará que su conjunto de instrucciones es muy adecuado para la tarea — SHA-256 fue diseñado para ejecutarse eficientemente en CPU. Aún así, solo usará quizás el 2% del área de silicio de una CPU moderna, con funcionalidad intensiva en áreas como almacenamiento en caché, multiplicación, división, operación de punto flotante, predicción de ramificación y brach, etc., ya sea que no se use en absoluto o no pueda proporcionar un aumento significativo del rendimiento para esta tarea en particular.

En hardware configurable como un FPGA, simplemente implementa solo ese 2% y optimiza aún más olvidándose de la ejecución del código, en lugar de diseñar puertas para calcular directamente cada uno de los Esas subfunciones que a menudo se repiten. Canalizadas de tal manera que cada una de ellas pasa un resultado al siguiente ciclo de reloj, y se repite 128 veces (y con una lógica adicional especial en la que cada SHA-256 comienza y termina), se termina obteniendo un resultado cada ciclo de reloj (para tal vez 100 millones de hashes por segundo en un FPGA anunciado para admitir 300 MHz en una lógica más simple que esta) mientras que en una CPU moderna, podría esperar un resultado cada pocos miles de ciclos de reloj por núcleo, digamos 10 millones de hashes por segundo ond en una CPU de varios núcleos y varios GHz.

Si este ejemplo en particular es de su interés, es posible que desee echar un vistazo a mi relacionado respuesta acerca de los aspectos internos de los mineros ASIC en bitcoin.stackexchange, ya que muchos mineros FPGA funcionan de la misma manera utilizando hardware configurable en lugar de hardware personalizado. En aras de la integridad: hay otras posibilidades, como limitar o evitar la canalización que describí a favor de una paralelización más trivial mediante el uso de múltiples hashers SHA-256 independientes. Dependiendo de las restricciones dadas por los componentes internos de su FPGA y su tamaño total , que incluso puede ofrecer un mejor rendimiento, aunque sería menos eficiente en términos de recuento de puertas y sobrecarga de enrutamiento si tuviera la libertad perfecta para diseñar todo el chip, no solo la configuración de una FPGA.

Comentarios

  • Eso ‘ es un punto muy bueno sobre la utilización del silicio.
  • Pero tal vez (¡involuntariamente!) sea engañoso, considerando que un FPGA consiste en celdas algo complejas con muchas puertas físicas, de las cuales una aplicación típica nuevamente solo usa una fracción, lo que permite a sus fabricantes anunciar recuentos de puertas equivalentes en un intento de decirle cuánto podría valer todo eso en un » típico » aplicación …

Responder

Las respuestas anteriores, aunque correctas, pierden el punto sobre por qué los FPGA (y los ASIC personalizados) son especialmente buenos para los cálculos de bitcoins.

La ventaja real es que una gran proporción de los cálculos de SHA-256 son operaciones lógicas (por ejemplo, cambios de bits) que se pueden realizar en alambrado. Cuando se hacen de esta manera, requieren 0 ciclos de reloj.

Otra ventaja importante es que las FPGA son mucho más eficientes en energía (es decir, MIPS por vatio) que las CPU, por lo que la cantidad de energía requerida para los cálculos es mucho mayor menos. Esto es importante porque el costo de extraer un bitcoin depende de la cantidad de electricidad que use para hacerlo.

Los chips ASIC son más eficientes energéticamente que los FPGA, por lo que pueden ejecutar el mismo código de manera mucho más económica. También puedes meter más unidades de ejecución a bordo para hacerlas más rápidas. La desventaja es que el costo de hacer un ASIC personalizado es muy alto, por lo que necesitaría vender bastantes chips para cubrir el costo de fabricación.

Las GPU también se usan para hacer bitcoins, pero como son mucho menos energéticamente eficientes, han estado perdiendo terreno frente a los FPGA y los ASIC personalizados.

Comentarios

  • Si observa el algoritmo hash de Monero, también conocido como cryptonight, verá que una implementación de FPGA es casi imposible debido a la gran cantidad de memoria necesaria para acceder de forma aleatoria (2 MB). Una CPU tiene la ventaja en este caso.
  • @ lucas92 ¿no puedes integrar la RAM en FPGA para acomodar la cantidad de memoria necesaria?
  • Probablemente ganó ‘ t tiene suficientes elementos lógicos en el FPGA para ello.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *