NPS, transportador, computación automática y de nuevo ... corutinas

1. De nuevo sobre las corutinas


En mi artículo anterior, querido Habr, solo mencioné los problemas de conocimiento de la programación moderna. La discusión que siguió solo confirmó los temores espontáneos que surgieron: los notorios "fundamentos teóricos" se convirtieron inmediatamente en una fuente de desacuerdo. El hecho de que ellos (desacuerdos) puedan no existir o que sean de una naturaleza diferente no parece molestar a la mayoría de los programadores "reales". Además, quizás no sea particularmente interesante, porque los programadores son estimulados principalmente por un interés: código, código y solo código. Bueno, casi "como lo recetó el médico" [1] ...

Al tocar el tema de la corutina en mi artículo y comentarios, no soñé en absoluto sobre cuánto están en la tendencia "actual". Sorprendido, sin embargo, las "pistas de acompañamiento" de mis comentarios con o sin. ¿Para qué, dicen, programadores? Sin embargo, me parece que todo quedó claro después de leer el artículo sobre el C ++ 20 recientemente aprobado y las perspectivas para su desarrollo posterior [2]. Para mi sorpresa, resultó que las corutinas están a la vanguardia de las innovaciones presentes y futuras de mi amado C ++ (ver también la biblioteca CppCoro ).

Bueno, dime, ¿es posible tomar en serio y / o con calma una ceja que, al parecer, se imagina a sí mismo como alguien? ¡Golpea lo que se llama! :(

El trasfondo de mi conocimiento de las corutinas (las llamaré todas a la antigua) es el siguiente. Era necesario paralelizar, pero algo adecuado no lo era. Tuve que inventar, estudiando la literatura disponible. Como resultado, las corutinas fueron rechazadas de inmediato, y los hilos después. La razón es que ambos son métodos estructurales de paralelización de programas, y no modelos computacionales. Pero no quería eso.

La descripción de lo que finalmente llegué aparece en mis artículos anteriores sobre Habré. Esta conversación está lejos de terminar, pero por ahora, ¿cómo se han recordado las corutinas, ya que se han convertido en el tema de una discusión tan acalorada? Lo único son los "puntos" de los procesos de detención / cambio. A diferencia de los subprocesos, permitieron predecir el comportamiento de los procesos que simulan la operación paralela. En teoría, esto también redujo las pérdidas del sistema para la implementación del paralelismo. Pero, sin embargo, en resumen, todo esto fundamentalmente algo no cambió. Y dado que los "puntos" simplemente fueron imitados por los estados del modelo de programación de autómatas (AP), mi conocimiento de las rutinas se completó durante siete.

Pero no podía suponer que la encarnación de las corutinas, ahora llamadas corutinas, me sobrepasara. De esto, y del mío, "ataques" posiblemente injustificados contra ellos, por lo cual pido disculpas sinceramente a los apologistas de Corutin. Probablemente apresurado. Sin embargo, las circunstancias recién descubiertas no afectaron mi actitud hacia las corutinas. Para el nuevo código, para razonar a su favor, nunca vi nada fundamentalmente nuevo. Sin embargo, quiero señalar que las corutinas son más cercanas y claras para mí que los hilos, porque contienen, como dije anteriormente, un análogo del conjunto de estados internos de autómatas finitos (CA).

Sin embargo, deja de arrepentirte. Volvamos a los autómatas que cubren completamente el "tema de la rutina". A continuación, presentaré las capacidades del AP asociado con el modelado de modelos paralelos que son bastante conocidos en teoría y práctica: modelos paralelos escalonados y de canalización de algoritmos. Su solución automática, en mi opinión, parece más visual, natural y simple de lo que se basaría en las mismas rutinas.

2. Formas de algoritmos de niveles paralelos y de canalización


Suponga que necesita calcular la expresión:

y = (((a + b) * (c + d)) + ((e * f) + (q + h))).

Además, deje que se defina el tiempo de ejecución de la operación, definido en unidades arbitrarias de tiempo discreto: medidas en las que la suma toma 1 medida y la multiplicación toma 5 medidas.
Basado en la lógica del cálculo de la expresión, el tiempo de ejecución de las operaciones y el número de variables intermedias, en una realización, la distribución de operaciones por niveles y el número de niveles en sí puede verse, por ejemplo, de la siguiente manera:

t1 = a + b; t2 = c + d; t3 = e * f; t4 = q + h;
Tier0: t1; t2; t3; t4;
Tier1: t5 = t1 * t2; t6 = t3 + t4;
Tier2: t7 = t5 + t6;

Gráficamente esto se muestra en la fig. 1, que muestra dos opciones para la distribución de cálculos en niveles y el tiempo de cálculo fijado en ticks. Su comparación muestra que, en el caso general, una disminución en el número de niveles no significa automáticamente una reducción en el tiempo de cálculo.

imagen
Higo. 1. Forma paralela en niveles para calcular una expresión,

pero se puede considerar una opción más, que ya está representada por una multitud de formas paralelas en niveles que resuelven un solo problema. En la Fig. La figura 2 muestra tal solución. El tiempo de cálculo ha disminuido. La paralelización de NPS también puede ser atractiva teniendo en cuenta su ejecución en sistemas multiprocesador.

imagen
Higo. 2. NPS paralelo

Si gira el gráfico JPF, puede obtener el esquema de computación de tuberías. En él, los elementos del transportador serán niveles, cuyo tiempo de operación se reduce al nivel más lento. En la Fig. La Figura 3 muestra dicho esquema de canalización de la expresión original.

imagen
Higo. 3. Modelo de tubería

Dado que para este ejemplo el tiempo discreto del transportador es de 5 ciclos de reloj, el tiempo de cálculo será aún peor que la peor versión del NPS. Ventajas de la tubería solo en la continuidad de los cálculos.

3. Un modelo de autómata para calcular expresiones.


Si elimina las restricciones en la sincronización de operaciones, el NPS puede convertirse en un circuito que generará el resultado como una tubería, pero sin restricciones relacionadas con la secuencia y el tiempo de las operaciones. Tal diagrama de red lógica con una demostración de la operación de suma (la implementación de la multiplicación es similar) en la forma de un modelo de red de nave espacial se muestra en la Fig. 4.

imagen
Fig. 4. Cálculos de expresiones basadas en una red de máquinas de estados finitos.

Puede ver que la red producirá constantemente un resultado con un retraso de 7 ciclos de reloj, es decir. así como el modelo NPS más rápido (Fig. 7). Sus desventajas incluyen la inestabilidad de salida asociada con las carreras de datos. Por ejemplo, un cambio simultáneo en el valor de las variables en pares de variables g, h y e, f conducirá a un cambio en t4 en el siguiente ciclo de reloj, después de un ciclo de reloj a un cambio en la variable t6 y otro ciclo de reloj a la variable de salida t7 (ver Fig. 1 y Fig. 4) . Al mismo tiempo, después de 5 ciclos de reloj, la variable t3 cambiará, lo que conducirá a un cambio y a la salida de los valores finalmente establecidos de las variables t6, t7.

imagen
Higo. 5. Modelado de NPS con una red de autómatas

En la Fig. La Figura 5 muestra cómo la introducción de un bloque adicional hace posible simular el cálculo de NPS. Del mismo modo, puede simular el modelo de computación canalizada, así como bloquear el cambio en la salida asociada con las carreras de datos.

3 Conclusiones


Sería extraño dudar de que las "imágenes" anteriores no se puedan realizar utilizando corutinas. Eso es solo, para ser honesto, no me gustaría hacer esto. Para mí, es mucho más fácil crear autómatas que implementen las operaciones necesarias y luego, cambiando solo su número y las relaciones entre ellos, implementen el cálculo de cualquier expresión.

No me cansaré de repetir que me atrae el concepto de programación visual implementado en el paquete Stateflow en MATLAB. Aquí también puede crear las operaciones de autómatas necesarias y luego, usándolas, como bloques estándar, "dibujar" un esquema de cálculo para cualquier expresión, que luego de la compilación se convertirá en un programa de trabajo (por ejemplo, en el mismo C ++). Al mismo tiempo, durante el proceso de diseño, estarán disponibles herramientas de visualización y depuración que son específicas de la tecnología de programación automatizada.

Es cierto que puede surgir la pregunta: ¿por qué los enlaces permanentes a un determinado entorno desconocido del PCUS, si hay Stateflow? Pero hablaremos de esto por separado todavía ...

Es desagradecido hacer predicciones, pero sin embargo, según mi experiencia, expresaré un pensamiento sedicioso: como los lenguajes de alto nivel se usan para negar la programación en lenguaje ensamblador, por lo que la programación visual tarde o temprano y no menos desplazar la programación en lenguajes de alto nivel.

Literatura

1. Programadores, estudiemos las fuentes de los programas clásicos. [Recurso electrónico], Modo de acceso: habr.com/en/post/488808 gratis. Yaz ruso (fecha de tratamiento 02.22.2020).
2. ¡C ++ 20 aprobado! Qué esperar y qué prepararse para los desarrolladores de C ++ 23. [Recurso electrónico], modo de acceso:habr.com/en/company/yandex/blog/488588 gratis. Yaz ruso (fecha de tratamiento 02.20.2020).

All Articles