No sé sobre ‘más difícil’, pero aquí hay algunos problemas importantes en los que se está trabajando en este momento:
- GPGPU: las GPU pueden ser muy rápidas con el ajuste y la selección de algoritmos correctos, pero son extremadamente frágiles y difíciles de programar. Además, solo ciertas clases de algoritmos funcionan de manera eficiente: la sincronización, la divergencia del flujo de control y los patrones de acceso a la memoria son muy importantes. ¿Cuáles son algunas optimizaciones arquitectónicas que se pueden hacer para mejorar esto? ¿Agrega un grupo de estructuras especializadas, cada una de las cuales se utiliza para diferentes conjuntos de aplicaciones, o realiza optimizaciones de uso general? ¿Cuál es el punto de equilibrio correcto, si lo hay, entre hacer que las GPU sean eficientes y hacerlas fáciles de programar?
- Multinúcleo heterogéneo: los arquitectos y diseñadores ya están sobrecargados de trabajo, y la Ley de Moore, que establece que el transistor cuenta el doble cada 18 meses, significa que necesitan encontrar algo que ver con esos transistores. Actualmente, el plan en la industria es gastar una cantidad increíble de energía optimizando el diseño de un procesador, y cortar y pegar un montón de esos en un solo chip. Sin embargo, se ha demostrado que el diseño de varios procesadores optimizados para diferentes puntos y la elección de cuándo usarlos de manera efectiva tienen un mayor rendimiento y una mayor eficiencia energética. ¿Cómo se hace esto mientras se mantiene constante el esfuerzo de ingeniería? ¿Cuáles son los puntos correctos para optimizar? ¿Cómo eliges cuándo usar qué núcleo? ¿Con qué frecuencia cambias entre núcleos?
- Aceleradores dedicados: el moderno SoC (System on Chip) ya tiene muchos dispositivos de acelerador dedicados que solo se activan en momentos específicos, por ejemplo, DSP, códecs de video / audio, etc. ¿Qué pasa con aceleradores aún más especializados, por ejemplo, un acelerador que acelera su web? navegación o un acelerador para Angry Birds? ¿Cómo sería ese acelerador? ¿Cuántos aceleradores tienes? ¿Cuál es el punto correcto para optimizar: nivel de perfil, nivel de aplicación, nivel de secuencia de instrucciones? ¿Qué pasa si Angry Birds se actualiza a v2.0, todavía puede usar el acelerador? ¿Qué pasa si ya nadie juega a Angry Birds? El diseño arquitectónico lleva muchos años, ¿cómo puede predecir qué aplicaciones acelerar? ¿Cómo se hace todo esto mientras se mantiene bajo el esfuerzo de ingeniería?
- Computación aproximada: esta es una de las modas actuales más populares. Algunas aplicaciones (principalmente en multimedia) no se preocupan por la precisión perfecta: realmente no se puede ver la diferencia entre un # 204feb sombreado de píxeles frente a un # 204fea. Además, algunas clases de aplicaciones, a saber, la heurística, ni siquiera tienen respuestas “correctas” en primer lugar, ¡fueron aproximaciones para empezar! Por ejemplo, al entrenar una red neuronal de hardware, puede intercambiar un poco de precisión al tiempo que mejora significativamente la eficiencia energética. Sin embargo, hay muchos problemas con esto. El hecho de que su acelerador aproximado funcione bien en las entradas A, B y C no significa que funcione bien en la entrada D, especialmente si la entrada D ni siquiera existía antes del lanzamiento del producto. ¿Cómo teóricamente garantizas la calidad del servicio? ¿Es posible una prueba de QoS con cosas como las redes neuronales? ¿Qué tipo de aplicaciones puedes acelerar? ¿Dónde trazas la línea para “suficientemente bueno”? ¿Tiene un acelerador de “computación aproximada” de talla única o tiene múltiples aceleradores diseñados para múltiples aplicaciones? ¿Deberían estos aceleradores informáticos aproximados ser reparados o adaptarse en tiempo de ejecución?