2009-05-15 184 views

Respuesta

288

Es bastante intuitiva:

Un programa está obligado CPU si iba a ir más rápido si la CPU eran más rápidos, es decir, se pasa la mayor parte de su tiempo el simple uso de la CPU (hacer cálculos). Un programa que calcula nuevos dígitos de π generalmente estará vinculado a la CPU, solo se trata de números crujientes.

Un programa está vinculado a E/S si fuera más rápido si el subsistema de E/S fuera más rápido. Qué sistema de E/S exacto se entiende puede variar; Normalmente lo asocio con el disco. Un programa que examina un archivo enorme para algunos datos a menudo estará vinculado a E/S, ya que el cuello de botella es la lectura de los datos del disco.

22

CPU atada significa que el programa está embotellado por la CPU, o unidad central de procesamiento, mientras que I/O enlazado significa que el programa está embotellado por E/S, o entrada/salida, como leer o escribir en disco, red, etc.

En general, al optimizar programas de computadora, uno trata de buscar el cuello de botella y eliminarlo. Saber que su programa está vinculado a la CPU ayuda, por lo que uno no optimiza innecesariamente otra cosa.

[Y por "cuello de botella", me refiero a lo que hace que su programa va más lento de lo que debería tener.]

8

Cuando el programa está esperando I/O (es decir. Un disco de lectura/escritura o de lectura de la red/write etc), la CPU tiene la libertad de realizar otras tareas, incluso si su programa está detenido. La velocidad de su programa dependerá en gran medida de cuán rápido pueda suceder ese IO, y si desea acelerarlo, deberá acelerar la E/S.

Si su programa ejecuta muchas instrucciones de programa y no espera la E/S, se dice que está vinculado 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 puede no ser acelerar el hardware, sino optimizar el programa para reducir la cantidad de IO o CPU que necesita, o hacer que E/S mientras también hace cosas intensivas de CPU.

15

Otra manera de expresar la misma idea:

  • Si la aceleración de la CPU no acelera su programa, puede ser obligado I/O.

  • Si la aceleración de la E/S (por ejemplo, utilizando un disco más rápido) no ayuda, su programa puede estar vinculado a la CPU.

(he usado "puede ser" porque hay que tomar otros recursos en cuenta. La memoria es un ejemplo.)

163

CPU Bound significa que la velocidad a la que el proceso avanza está limitada por la velocidad de la CPU. Una tarea que realiza cálculos en un pequeño conjunto de números, por ejemplo, la multiplicación de pequeñas matrices, es probable que esté vinculada a la CPU.

I/O Bound significa que la velocidad a la que progresa un proceso está limitada por la velocidad del subsistema de E/S. Una tarea que procesa datos del disco, por ejemplo, contar el número de líneas en un archivo es probable que sea un límite de E/S.

La memoria límite significa que la velocidad a la que progresa 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 la memoria, por ejemplo, la multiplicación de matrices grandes, es probable que sea límite de memoria.

El límite de memoria caché es la velocidad a la que el progreso de un proceso está limitado por la cantidad y la velocidad de la memoria caché disponible. Una tarea que simplemente procesa más datos de los que caben en la memoria caché se enlazará a la caché.

E/S Bound sería más lento de lo que Memory Bound sería más lento que Cache Bound sería más lento que CPU Bound.

La solución para ser E/S obligado no es necesariamente para obtener más memoria. En algunas situaciones, el algoritmo de acceso podría diseñarse alrededor de las limitaciones de E/S, Memoria o Caché. Ver Cache Oblivious Algorithms.

0

I/O proceso Bound: - Si la mayor parte de la vida útil de un proceso que se gasta en i/o estado, entonces el proceso es ai/o process.example límite: -Calculadora, Internet Explorer

CPU Proceso de enlace: si la mayor parte de la vida del proceso se gasta en la CPU, entonces es un proceso vinculado a la CPU.

+7

¿Cómo sería la calculadora un proceso enlazado de IO? Seguramente estaría atado a la CPU. Si la calculadora pasa la mayor parte del tiempo bloqueada al acceder a la red o al disco, sugeriría que algo no funciona. – rickerbh

+3

Pensé que el ejemplo de la calculadora era claro: la mayoría de las veces espera que el usuario presione un botón, esperando la E/S. – psp

3

I/O enlazado se refiere a una condición en la que el tiempo que se tarda en completar un cálculo se determina principalmente por el tiempo transcurrido esperando a que se completen las operaciones de entrada/salida.

Esto es lo contrario de una tarea vinculada a la CPU. Esta circunstancia surge cuando la velocidad a la que se solicitan los datos es más lenta que la tasa que se consume o, en otras palabras, se gasta más tiempo solicitando datos que procesándolos.

3

Procesos vinculados IO: pasan más tiempo haciendo IO que los cálculos, tienen muchas ráfagas cortas de CPU. obligado CPU procesos: pasar más tiempo haciendo cálculos, pocos CPU muy larga estalla

17

multi-threading es un caso en el que la distinción importa como se explica en los siguientes ejemplos.

RAM I/O obligados ejemplo: Vector Sum

Considere un programa que resume todos los valores de un único 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] 

paralelización que mediante la división de la matriz igualmente para cada uno de su núcleos es de utilidad limitada en los escritorios modernos comunes. Referencia de C++ 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 Intel i5-3210M de 4 núcleos, Lenovo T430. resultados de las muestras típicas (variable desde roscada múltiples):

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 como se esperaba con 4 hilos!

La razón es que todos los procesadores comparten un único bus de memoria RAM ligarse a:

CPU 1 --\  Bus +-----+ 
CPU 2 ---\__________| RAM | 
CPU 3 ---/   +-----+ 
CPU 4 --/ 

por lo que el bus de memoria convierte rápidamente en el cuello de botella, no la CPU.

Esto ocurre porque al agregar dos números se toma un solo ciclo de la CPU, las lecturas de memoria toman aproximadamente 100 CPU cycles en el hardware de 2016.

Por lo tanto, el trabajo de CPU realizado por byte de datos de entrada es demasiado pequeño, y lo llamamos un proceso vinculado a IO.

La única manera de acelerar aún más ese cálculo sería acelerar los accesos de memoria individuales con nuevo hardware de memoria, p. Multi-channel memory.

La actualización a un reloj de CPU más rápido, por ejemplo, no sería muy útil.

Otros ejemplos

  • matriz de multiplicación es vinculado a la CPU en la memoria RAM y GPU. La entrada contiene:

    2 * N**2 
    

    números, pero:

    N ** 3 
    

    multiplicaciones se realizan, y que es suficiente para la paralelización a valer la pena para N. gran práctica

    Esta es la razón por las bibliotecas como :

    existen.

    El uso de caché hace una gran diferencia en la velocidad de las implementaciones. Ver por ejemplo este didactic GPU comparison example.

  • 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 renderizado (un rectángulo de píxeles) se pueda enviar directamente a la memoria de video, para evitar la CPU de ida y vuelta.

  • La creación de redes es el ejemplo prototípico ligado a IO.

    Incluso cuando enviamos un solo byte de datos, aún tarda un gran tiempo para 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").

  • A C++ operación depende de la CPU ficticia que toma un número y cruje mucho:

Cómo averiguar si usted es CPU o IO obligado

IO no RAM como un disco encuadernado, red: ps aux, luego theck si CPU%/100 < n threads. En caso afirmativo, estás obligado a IO, p. bloqueando read s solo están esperando datos y el programador omite ese proceso. Luego use herramientas adicionales como sudo iotop para decidir cuál es el problema exactamente.

RAM-IO obligado: difícil de decir, ya que el tiempo de espera de RAM está incluido en CPU% mediciones. Quizás lo mejor que puedes hacer es estimar fallas en el caché.

Consulte también:

Cuestiones relacionadas