Combien de cycles les fonctions mathématiques prennent-elles sur les processeurs modernes

Nous soaps que les processeurs modernes exécutent des instructions telles que cosine et sin directement sur le processeur, car ils possèdent des opcodes. Ma question est combien de cycles ces instructions prennent normalement. Prennent-ils un temps constant ou dépendent-ils de parameters d’entrée?

Parler de “cycles pour une instruction” pour les processeurs modernes est devenu difficile il y a longtemps. De nos jours, les processeurs contiennent plusieurs cœurs d’exécution, leurs opérations peuvent se chevaucher et s’exécuter dans le désordre.

Le manuel du processeur Intel, volume 4, annexe C, fournit un bon exemple de l’essentiel. Il détaille le temps d’instruction par latence et par débit. La latence est le nombre de cycles qu’un kernel d’exécution nécessite pour effectuer une micro-opération. Le débit correspond au nombre de cycles requirejs pour que l’unité d’exécution accepte à nouveau la même instruction. Le débit est généralement inférieur au temps de latence, y compris la présence de valeurs fractionnaires dans le tableau. Un effet secondaire d’avoir plus d’une unité d’exécution du même type. Le type est important, il vous indique si les instructions peuvent se chevaucher.

Peut-être avez-vous le message essentiel ici: cela dépend énormément des autres instructions qui entourent le code que vous souhaitez synchroniser. Ces autres instructions peuvent bien être exécutées en même temps que celles qui sont coûteuses. À quel point ils prennent, effectivement, 0 cycles. Ou bien ils peuvent ne pas bloquer le pipeline parce que l’unité d’exécution est occupée par une instruction précédente. Le type de détails qui préoccupe beaucoup les programmeurs qui écrivent des optimiseurs de code.

Quelques exemples de données du manuel, en choisissant le kernel le plus moderne dans les tableaux:

  • FMUL, latence = 7, débit = 2, unité d’exécution FP_MUL
  • FDIV, latence = 6, débit = 5, unité non spécifiée
  • FSQRT, latence = 38, débit = 43, unité d’exemple FP_DIV
  • FSIN, latence = 160-180, débit = 130, unité non spécifiée

Un meilleur coup sur les instructions SIMD.

La seule chose utile à faire est de mesurer , pas d’assumer.

Les durées varient en fonction du modèle de processeur. Les durées vont généralement de dizaines de cycles de processeur à cent ou plus.

(Les temps consommés par de nombreuses instructions varient en fonction des circonstances, car elles utilisent diverses ressources dans le processeur [répartiteur, unités d’exécution, registres de renommage, etc.], le temps qu’une instruction retarde en conséquence, dépend de ce qui se passe. Par exemple, si un code exécute presque entièrement des instructions de chargement et de stockage, il est possible qu’une instruction sine très occasionnelle ne ralentisse pas du tout son exécution. unité d’exécution, c’est-à-dire la partie qui effectue le calcul numérique réel.)

Les temps d’exécution peuvent varier en fonction des parameters d’entrée. Les grands arguments des fonctions sortinggonomésortingques doivent être réduits modulo 2π, ce qui est un problème compliqué en soi.

Dans la bibliothèque mathématique Mac OS X, nous écrivons généralement nos propres implémentations, souvent en langage assembleur, pour diverses raisons, notamment la rapidité, la conformité aux normes, la compatibilité avec l’interface binary de l’application et d’autres fonctionnalités.

Si vous êtes simplement curieux, alors «des dizaines à des centaines de cycles de processeur» peuvent être une bonne réponse, surtout sans spécifier un modèle de processeur particulier. Le temps est suffisamment long pour que vous ne puissiez pas utiliser ces opérations sans raison valable. (Par exemple, j’ai vu un code qui obtient π sous la forme 4 · arctan (1). Ne le faites pas.)

Si vous avez d’autres raisons de demander, vous devez expliquer, afin que les réponses puissent être ciblées.