Que signifient les Termes "CPU bound" et "I / O bound"?
Que signifient les Termes "CPU bound" et "I / O bound"?
9 réponses
C'est assez intuitif:
UN programme est lié au CPU s'il irait plus vite si le CPU était plus rapide, c'est-à-dire qu'il passe la majorité de son temps simplement à utiliser le CPU (faire des calculs). Un programme qui calcule de nouveaux chiffres de π sera généralement lié au processeur, il ne s'agit que de nombres croquants.
UN programme est lié aux E/S s'il est plus rapide si le sous-système d'e/s est plus rapide. Le système d'E/S exact peut varier; Je l'associe généralement au disque, mais bien sûr à la mise en réseau ou à la communication en général est commun aussi. Un programme qui regarde à travers un énorme fichier pour certaines données pourrait devenir lié aux E/S, puisque le goulot d'étranglement est alors la lecture des données du disque (en fait, cet exemple est peut-être un peu démodé ces jours-ci avec des centaines de Mo/s provenant des SSD).
CPU Bound signifie que la vitesse à laquelle le processus progresse est limitée par la vitesse de la CPU. Une tâche qui effectue des calculs sur un petit ensemble de nombres, par exemple en multipliant de petites matrices, est susceptible d'être liée au processeur.
I / O Bound signifie que la vitesse à laquelle un processus progresse est limitée par la vitesse du sous-système d'E/S. Une tâche qui traite les données du disque, par exemple, en comptant le nombre de lignes dans un fichier est susceptible d'être liée aux E/S.
De Mémoire bound signifie que la vitesse à laquelle un processus progresse est limitée par la quantité de mémoire disponible et la vitesse de cet accès à la mémoire. Une tâche qui traite de grandes quantités de données en mémoire, par exemple en multipliant de grandes matrices, est susceptible d'être liée à la mémoire.
Cache bound signifie la vitesse à laquelle la progression d'un processus est limitée par la quantité et la vitesse du cache disponible. Une tâche qui traite simplement plus de données que ne le permet le cache sera liée au cache.
E / S Lié serait plus lente que la Mémoire serait plus lent que Cache Lié serait plus lent qu'en CPU.
La solution pour être lié aux E/S n'est pas nécessairement d'obtenir plus de mémoire. Dans certaines situations, l'algorithme d'accès pourrait être conçu autour des limitations d'E/S, de mémoire ou de Cache. Voir Cache Algorithmes Inconscients .
CPU bound signifie que le programme est goulot d'étranglement par la CPU, ou l'unité centrale de traitement, tandis que E/S bound signifie que le programme est goulot d'étranglement par les E/S, ou entrée / sortie, telles que la lecture ou l'écriture sur disque, réseau, etc.
En général, lors de l'optimisation des programmes informatiques, on essaie de chercher le goulot d'étranglement et de l'éliminer. Savoir que votre programme est lié au processeur aide, de sorte que l'on n'optimise pas inutilement autre chose.
[et par" goulot d'étranglement", je veux dire la chose cela rend votre programme plus lent qu'il ne l'aurait fait autrement.]
Multi-threading est un cas où la distinction importe comme expliqué sur les exemples ci-dessous.
Exemple lié aux E/S RAM: somme vectorielle
Envisager un programme qui additionne toutes les valeurs d'un vecteur unique:
#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]
Paralléliser cela en divisant le tableau de manière égale pour chacun de vos cœurs est d'une utilité limitée sur les ordinateurs de bureau modernes courants. Référence C++ à: https://github.com/cirosantilli/algorithm-cheat/blob/ea16f6bba12e7dcc32c0cbbbcdc74bcc2fd2d05b/src/cpp/interactive/sum_array_parallel.cpp
Testé sur GCC 5.2.1, Ubuntu 15.10 avec un 4 core Intel i5-3210M, Lenovo T430. Exemple de résultats typiques (variable depuis multi-thread):
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.
Le calcul n'a pas été 4 fois plus rapide que prévu avec 4 threads!
La raison pour laquelle tous les processeurs partagent un seul bus mémoire reliant la RAM:
CPU 1 --\ Bus +-----+
CPU 2 ---\__________| RAM |
CPU 3 ---/ +-----+
CPU 4 --/
Donc le le bus mémoire devient rapidement le goulot d'étranglement, pas le CPU.
Cela se produit parce que l'ajout de deux nombres prend un cycle CPU unique , les lectures de mémoire prennent environ 100 cycles CPU dans le matériel 2016.
Donc, le travail du processeur effectué par octet de données d'entrée est trop petit,et nous appelons cela un processus lié aux E / S.
La seule façon d'accélérer ce calcul serait d'accélérer les accès individuels à la mémoire avec un nouveau matériel de mémoire, par exemple mémoire multicanal .
La mise à niveau vers une horloge CPU plus rapide par exemple ne serait pas très utile.
D'Autres exemples
-
La multiplication matricielle est liée au processeur sur la RAM et les GPU. L'entrée contient:
2 * N**2
Nombres, mais:
N ** 3
Les Multiplications sont effectuées, et cela suffit pour que la parallélisation en vaille la peine pour les grands N. pratiques
C'est pourquoi les bibliothèques comme:
Existent.
L'utilisation du Cache fait une grande différence dans la vitesse des implémentations. Voir par exemple cet exemple de comparaison de GPU didactique .
-
Les GPU ont un goulot D'étranglement IO dans le transfert de données vers le CPU.
Ils sont conçus pour que la sortie de rendu (un rectangle de pixels) puisse être sortie directement à la mémoire vidéo, pour éviter le CPU aller-retour.
-
La mise en réseau est l'exemple prototypique lié aux E / S.
Même lorsque nous envoyons un seul octet de données, il faut encore beaucoup de temps pour atteindre sa destination.
Paralléliser les petites requêtes réseau comme les requêtes HTTP peut offrir d'énormes gains de performances.
Si le réseau est déjà à pleine capacité (par exemple le téléchargement d'un torrent), la parallélisation peut encore augmenter améliorer la latence (par exemple vous peut charger une page web "en même temps").
-
Une opération factice liée au CPU C++ qui prend un nombre et le craque beaucoup:
Comment savoir si vous êtes lié CPU ou IO
Non-RAM io lié comme disque, réseau: ps aux
, puis theck si CPU% / 100 < n threads
. Si oui, vous êtes lié par IO, par exemple les read
bloquants n'attendent que des données et le planificateur ignore cela processus. Ensuite, utilisez d'autres outils comme sudo iotop
pour décider quelle IO est exactement le problème.
RAM-io bound: difficile à dire, car le temps D'attente de la RAM est inclus dans les mesures CPU%
. Peut-être que le mieux que vous pouvez faire est d'estimer les manques de cache.
Voir aussi:
Une autre façon d'exprimer la même idée:
Si l'accélération du processeur n'accélère pas votre programme, il peut êtreE/S lié.
Si l'accélération des e / s (par exemple en utilisant un disque plus rapide) n'aide pas, votre programme peut être lié au processeur.
(j'ai utilisé "peut-être" parce que vous devez prendre en compte d'autres ressources. La mémoire en est un exemple.)
Lorsque votre programme attend E/S (ie. un disque en lecture / écriture ou réseau en lecture / écriture etc), le CPU est libre de faire d'autres tâches même si votre programme est arrêté. La vitesse de votre programme dépendra principalement de la vitesse à laquelle les E / S peuvent se produire, et si vous voulez l'accélérer, vous devrez accélérer les E/S.
Si votre programme exécute beaucoup d'instructions de programme et n'attend pas d'E/S, on dit QU'il est lié au processeur. Accélérer le processeur fera fonctionner le programme plus rapide.
Dans les deux cas, la clé pour accélérer le programme pourrait ne pas être d'accélérer le matériel, mais d'optimiser le programme pour réduire la quantité D'E / S ou de CPU dont il a besoin, ou de le faire faire des E/S alors qu'il fait aussi des choses gourmandes en CPU.
La limite d'E/S fait référence à une condition dans laquelle le temps nécessaire pour effectuer un calcul est déterminé principalement par la période d'attente des opérations d'entrée/sortie.
C'est le contraire d'une tâche liée au processeur. Cette situation se produit lorsque la vitesse à laquelle les données sont demandées est plus lente que la vitesse à laquelle elles sont consommées ou, en d'autres termes, plus de temps est passé à demander des données qu'à les traiter.
Processus liés aux E / S: passer plus de temps à faire des e / s que des calculs, avoir beaucoup courtes rafales de CPU. Processus liés au CPU: passez plus de temps à faire des calculs, quelques très longues rafales de CPU
Processus lié aux E/S:- si la majeure partie de la durée de vie d'un processus est passée en état d'e/s, le processus est un processus lié aux e/s.exemple: - calculatrice, Internet explorer
Processus lié au processeur: - si la majeure partie de la durée de vie du processus est passée dans le processeur,il s'agit d'un processus lié au processeur.