optimization - ¿Qué significan los términos "límite de CPU" y "límite de E/S"?
terminology (9)
CPU enlazado significa que el programa está bloqueado por la CPU o la unidad central de procesamiento, mientras que I/O enlazado significa que el programa está bloqueado por I / O, o entrada / salida, como leer o escribir en un disco, red, etc.
En general, al optimizar los programas de computadora, uno trata de buscar el cuello de botella y eliminarlo. Saber que su programa está ligado a la CPU ayuda, de modo que uno no optimiza innecesariamente otra cosa.
[Y por "cuello de botella", me refiero a lo que hace que su programa vaya más lento de lo que hubiera hecho].
¿Qué significan los términos "límite de CPU" y "límite de E / S"?
Cuando su programa está esperando la I/O (es decir, una lectura / escritura de un disco o una lectura / escritura de la red, etc.), la CPU es libre de realizar otras tareas, incluso si su programa se detiene. La velocidad de su programa dependerá principalmente de qué tan rápido pueda ocurrir la E / S, y si desea acelerarlo, necesitará acelerar la E / S.
Si su programa está ejecutando muchas instrucciones del programa y no espera la E / S, se dice que está enlazado a la CPU. Acelerar la CPU hará que el programa se ejecute más rápido.
En cualquier caso, la clave para acelerar el programa podría no ser acelerar el hardware, sino optimizar el programa para reducir la cantidad de IO o CPU que necesita, o hacer que haga I / O mientras hace uso intensivo de la CPU. cosas.
El límite de E / S se refiere a una condición en la que el tiempo que lleva completar un cálculo se determina principalmente por el período de espera para que se completen las operaciones de entrada / salida.
Esto es lo contrario de una tarea que está vinculada a la CPU. Esta circunstancia surge cuando la velocidad a la que se solicitan los datos es más lenta que la velocidad a la que se consume o, en otras palabras, se gasta más tiempo en solicitar los datos que en procesarlos.
Es bastante intuitivo:
Un programa está enlazado a la CPU si fuera más rápido si la CPU fuera más rápida, es decir, pasa la mayor parte de su tiempo simplemente utilizando la CPU (haciendo cálculos). Un programa que calcula los nuevos dígitos de π normalmente estará vinculado a la CPU, solo son números crujidos.
Un programa está enlazado a E / S si fuera más rápido si el subsistema de E / S fuera más rápido. El sistema de E / S exacto puede variar; Normalmente lo asocio con el disco, pero, por supuesto, la red o la comunicación en general también son comunes. Un programa que busca en un gran archivo algunos datos puede convertirse en un enlace de E / S, ya que el cuello de botella es la lectura de los datos del disco (en realidad, este ejemplo es quizás un poco anticuado en estos días con cientos de MB / s viniendo de SSDs).
Otra forma de expresar la misma idea:
Si acelerar la CPU no acelera su programa, puede que esté enlazado a I/O
Si acelerar la E / S (por ejemplo, usar un disco más rápido) no ayuda, su programa puede estar vinculado a la CPU.
(Utilicé "puede ser" porque necesita tener en cuenta otros recursos. La memoria es un ejemplo).
Proceso enlazado de E / S: - Si la mayor parte de la vida útil de un proceso se gasta en el estado de E / S, entonces el proceso es un proceso enlazado ai / o. Ejemplo: -calculator, internet explorer
Proceso enlazado de CPU: - Si la mayor parte de la vida del proceso se gasta en CPU, entonces es un proceso enlazado de CPU.
Procesos limitados de IO: pase más tiempo haciendo IO que los cálculos, tenga muchas ráfagas de CPU cortas. Procesos vinculados a la CPU: pase más tiempo haciendo cálculos, pocas ráfagas de CPU muy largas
CPU Bound significa que la velocidad a la que avanza el proceso está limitada por la velocidad de la CPU. Es probable que una tarea que realice cálculos en un pequeño conjunto de números, por ejemplo multiplicando matrices pequeñas, esté vinculada a la CPU.
El límite de E / S significa que la velocidad a la que avanza un proceso está limitada por la velocidad del subsistema de E / S. Una tarea que procesa datos desde el disco, por ejemplo, contando el número de líneas en un archivo es probable que esté vinculada a E / S.
Memoria enlazada significa que la velocidad a la que avanza un proceso está limitada por la cantidad de memoria disponible y la velocidad de acceso a esa memoria. Una tarea que procesa grandes cantidades de datos en memoria, por ejemplo, multiplicando matrices grandes, es probable que esté vinculada a la memoria.
El límite de caché significa la velocidad a la que el progreso del proceso está limitado por la cantidad y la velocidad del caché disponible. Una tarea que simplemente procesa más datos de los que caben en la memoria caché estará vinculada a la memoria caché.
I / O Bound sería más lento que Memory Bound sería más lento que Cache Bound sería más lento que CPU Bound.
La solución para estar enlazado a E / S no es necesariamente obtener más memoria. En algunas situaciones, el algoritmo de acceso podría diseñarse en torno a las limitaciones de E / S, memoria o caché. Ver Caché Algoritmos olvidados .
el subprocesamiento múltiple es un caso en el que la distinción importa como se explica en los ejemplos a continuación.
Ejemplo de límite de E / S de RAM: Vector Sum
Considere un programa que sume todos los valores de un solo vector:
#define SIZE 1000000
unsigned int is[SIZE];
unsigned int sum = 0;
size_t i = 0;
for (i = 0; i < SIZE; i++)
/* Each one of those requires a RAM access! */
sum += is[i]
Poner en paralelo eso dividiendo la matriz por igual para cada uno de sus núcleos es de utilidad limitada en los escritorios modernos comunes. C ++ benchmark en: https://github.com/cirosantilli/algorithm-cheat/blob/ea16f6bba12e7dcc32c0cbbbcdc74bcc2fd2d05b/src/cpp/interactive/sum_array_parallel.cpp
Probado en GCC 5.2.1, Ubuntu 15.10 con un procesador Intel i5-3210M de 4 núcleos, Lenovo T430. Ejemplo de resultados típicos (variable desde multiproceso):
Time N Threads Comment
--------- ---------- --------
0.045962 none
0.0487619 1 Worse than 0 threads because of startup overhead.
0.0329526 2
0.0302511 3
0.0232993 4 Best time. Only about 2x as fast.
0.0281021 5 Worse than 4 threads because we don''t have
that many cores, which generate overhead.
¡El cálculo no fue 4 veces más rápido de lo esperado con 4 hilos!
La razón es que todos los procesadores comparten un solo bus de memoria que se conecta a la RAM:
CPU 1 --/ Bus +-----+
CPU 2 ---/__________| RAM |
CPU 3 ---/ +-----+
CPU 4 --/
por lo que el bus de memoria se convierte rápidamente en el cuello de botella, no en la CPU.
Esto sucede porque sumar dos números requiere un solo ciclo de CPU, las lecturas de memoria toman aproximadamente 100 ciclos de CPU en el hardware de 2016.
Por lo tanto, el trabajo de la CPU realizado por byte de datos de entrada es demasiado pequeño, y llamamos a esto un proceso enlazado a IO.
La única forma de acelerar aún más ese cálculo sería acelerar los accesos de memoria individuales con un nuevo hardware de memoria, por ejemplo, memoria multicanal .
La actualización a un reloj de CPU más rápido, por ejemplo, no sería muy útil.
Otros ejemplos
La multiplicación de matrices está unida a la CPU en RAM y GPU. La entrada contiene:
2 * N**2
números, pero
N ** 3
se hacen multiplicaciones, y eso es suficiente para que la paralelización valga la pena para la práctica N. grande
Es por esto que bibliotecas como:
existe.
El uso del caché hace una gran diferencia en la velocidad de las implementaciones. Ver por ejemplo este ejemplo de comparación de GPU didáctica .
Las GPU tienen un cuello de botella IO en la transferencia de datos a la CPU.
Están diseñados para que la salida de renderización (un rectángulo de píxeles) pueda enviarse directamente a la memoria de video, para evitar el viaje de ida y vuelta de la CPU.
La red es el ejemplo prototípico de IO-bound.
Incluso cuando enviamos un solo byte de datos, aún toma mucho tiempo llegar a su destino.
La paralelización de pequeñas solicitudes de red, como las solicitudes HTTP, puede ofrecer enormes ganancias de rendimiento.
Si la red ya está a plena capacidad (por ejemplo, descargando un torrent), la paralelización aún puede aumentar la latencia (por ejemplo, puede cargar una página web "al mismo tiempo").
Una operación limitada de CPU C ++ ficticia que toma un número y lo procesa mucho:
Cómo saber si estás vinculado a CPU o IO
IO no RAM enlazado como disco, red: ps aux
, luego theck si CPU% / 100 < n threads
. Si es así, está enlazado a IO, por ejemplo, el bloqueo de las read
solo está esperando datos y el programador se está saltando ese proceso. Luego use otras herramientas como sudo iotop
para decidir cuál es exactamente el problema de IO.
Límite RAM-IO: es difícil saberlo, ya que el tiempo de espera de la RAM se incluye en las mediciones de CPU%
. Tal vez lo mejor que puedes hacer es estimar los errores de caché.
Ver también: