Quants cicles hi ha a la CPU?

He sentit que hi ha un llibre d'Intel en línia que descriu els cicles de la CPU necessaris per a una instrucció d' assemblador específica, però no puc esbrinar-ho (després d' intentar-ho). Algú em podria ensenyar com trobar el cicle de la CPU, si us plau?

Aquí hi ha un exemple, en el codi inferior, mov/lock és 1 cicle de CPU, i xchg és 3 cicles de CPU.

Mentre ja no podeu simplement afegir juntes les finals d'un flux d' instruccions per obtenir el temps d' execució total, encara podeu obtenir una anàlisi molt precisa del comportament d'alguna peça de codi (especialment un bucle) tal i com es descriu a sota i en altres recursos relacionats.

Timings d' instrucció

Primer, necessites els temps actuals. Això va variar per arquitectura de la CPU, però el millor recurs actualment per a temps x86 és Agner Fogy's Taules d' instruccions . No cobreixo menys que trenta microarchitecures diferents, aquestes taules llista les instruccions retardenc , que és el moment mínim/typical que una instrucció pren d' entrada a punt per obtenir la sortida disponible. En paraules d' Agner:

Latència: Aquest és el retard que les instruccions genera en un Cadena de dependències. Els nombres són valors mínims. A la memòria cau no m'estranya. erròniament, i excepcions poden augmentar els comptadors del rellotge considerablement. On està habilitat hiperfilant, l'ús del mateix Les unitats d'execució a l'altre fil porten a l'actuació inferior. Nombres de desnormals, NAN i infinits no augmenten el retard. La La unitat de temps usada és cicles de rellotge de nucli, no els cicles del rellotge de referència donada pel comptador de segells del temps.

Així que, per exemple, la afegeix Les instruccions tenen una retardació d'un cicle, així que una sèrie de dependent Afegir instruccions, com es mostra, tindrà una retardació del cicle 1 per afegeix :

Noteu que això no vol dir que afegeix Les instruccions només tindran un cicle cada un. Per exemple, si les instruccions d' afegir eren no Dependrà, és possible que en les fitxes modernes 4 afegeixin instruccions pot executar independentment en el mateix cicle:

Agner proporciona una mètriques que captura algun d'aquest potencial paral· lelisme, anomenat recíproc a través de l' aprovació :

Category name El nombre mitjà de cicles de rellotge per instrucció per una sèrie d' instruccions independents del mateix tipus En el mateix fil.

Per afegeix Això està llistat com a 0, 25 Significat que fins a 4 afegeix Les instruccions poden executar cada cicle (per a la recíprocitat a través de 1 / 4 = 0. 25 ).

El recíproc a través del nombre també dóna una pista al paral· lelisme La possibilitat d'una instrucció. Per exemple, en les fitxes més recents de x86, les formes comunes de les imulCity name (optional, probably does not need a translation) Les instruccions tenen un retard de 3 cicles, i només una unitat d' execució pot manegar-les (com si fos una unitat d' execució) afegeix El qual normalment té 4 unitats implibles. No obstant això, els observats a través d'una llarga sèrie de independents imulCity name (optional, probably does not need a translation) Les instruccions són 1/cicle, no 1 cada 3 cicles com es pot esperar que hagi arribat el retard de 3. La raó és que la imulCity name (optional, probably does not need a translation) la unitat és canonada: pot ser engega un nou imulCity name (optional, probably does not need a translation) Cada cicle , encara que la multiplicació anterior no hagi acabat.

Això vol dir una sèrie de independent imulCity name (optional, probably does not need a translation) Les instruccions poden córrer fins a 1 per cicle, però una sèrie de dependent imulCity name (optional, probably does not need a translation) Les instruccions s' executaran només a 1 cada 3 cicles (des de la següent imulCity name (optional, probably does not need a translation) No es pot iniciar fins que el resultat des de l' anterior estigui llest).

Amb aquesta informació, podeu començar a veure com analitzar els temps d' instrucció de CPU modernes.

Anàlisi detallat

Tot i així, el cim només està gratant la superfície. Ara teniu múltiples maneres d'observar una sèrie d' instruccions (lateència o l'aprovació) i potser no quedi clar quin ús.

A més a més, hi ha altres límits que no contenen els números anteriors, com ara el fet que certes instruccions competeixen pels mateixos recursos dins de la CPU, i restriccions en altres parts de la canonada de CPU (com ara la descodificació d' instruccions) que poden resultar en un rendiment més baix del que es calcularia simplement mirant el retard i el rendiment. Més enllà d'això, hi ha factors "enllà els ALU" com l'accés de memòria i la predicció de la branca: qüestions senceres a si mateix - pots modelar-les molt bé, però cal que funcioni. Per exemple, aquí hi ha un article recent on la resposta cobreix en alguns detalls dels factors rellevants.

Cobreixant tots els detalls augmentaria la mida d'aquesta resposta ja llarga per un factor de 10 o més, així que us apuntaré als millors recursos. Boira Agner té un Optimitzant l' asemiament Guia que cobreix amb detall l'anàlisi precisa d'un bucle amb una dotzena d' instruccions. Veure " 12. 7 Un exemple d'anàlisi d'ampolla en bucles vectorials que comencen a la pàgina 95 en la versió actual del PDF.

La idea bàsica és que creeu una taula, amb una fila per instrucció i marqueu els recursos d' execució cadascun dels usos. Això us permet veure els colls d'ampolla. A més, heu d'examinar el bucle per a realitzar dependències, per a veure si algun d'aquests limitament (mireu " 12. 16 S' estan analitzant les dependències " per un cas complex).

Si no vols fer-ho a mà, Intel·ligència ha alliberat el Analitzador del codi d' arquitectura de l' IntelComment , que és una eina que automatitzarà l'anàlisi. Actualment no s'ha actualitzat més enllà de l'Skylake, però els resultats encara són molt raonables pel Llac Kaby, ja que la microarchitatura no ha canviat gaire i, per tant, els temps encara es poden comparar. Aquesta resposta Va en un munt de detalls i proporciona la sortida d' exemple, i la Guia de l' usuari No és mig dolent (encara que està fora de data respecte a les noves versions).

Altres fonts

L' Agner sol proveeix temps per a les noves arquitectures poc després que siguin alliberades, però també es pot comprovar instlatx64 per a temps organitzat igualment en InstLatX86 i InstLatX64 Resultats. Els resultats cobreixen molt vells xips interessants, i les noves fitxes solen aparèixer de seguida. Els resultats són més consistents amb els d'Agoner, amb unes quantes excepcions aquí i allà. També podeu trobar la memòria de retard i altres valors en aquesta pàgina.

Fins i tot pots obtenir els resultats del temps directament de la Intel·ligència en la seva Manual d'optimització IA32 i Intel 64 in Apèndix C: INSTRULA MÉS LES FESNCY i CATANPUTConstellation name (optional) . Personalment prefereixo la versió d' Agner perquè són més completa, sovint arriben abans que s' actualitza el manual d'Intel·ligència, i són més fàcils d'utilitzar com proporcionen un full de càlcul i una versió PDF.

Finalment, la x86 tag wiki Té una riquesa de recursos sobre x86 optimització, incloent els enllaços a altres exemples de com fer una anàlisi exacta del cicle de seqüències de codi.

Tenint en compte el paral· lelisme, el processament d'ordres, microcode, processadors multicore, etc. No hi ha cap garantia que una secció en particular del codi d'assemblatge prengui exactament x cicles de CPU/ cicles de rellotge de rellotge/ quin cicles.

Si existeix una referència així, només podrà proveir generalitzacions amples que proporcionen una arquitectura en particular, i depenent de com s' implementarà el microcodecode, podeu trobar que la M de Pentiuium és diferent a la Core 2 Duo, que és diferent de la base AD dual, etc.

Tingueu present que aquest article s' ha actualitzat el 2000 i s' ha escrit abans. Fins i tot el Pentiui 4 és difícil d'imprimir en referència al temps d' instruccions - PII, PII, i el pentiu original va ser més fàcil, i els textos referenciats es basaven en aquests processadors anteriors que tenien un temps d' instrucció més ben definit.

Avui en dia la gent generalment utilitza anàlisi estadística per a la estimació de temps de codi.

El que altres respostes diuen d'això és impossible predir amb precisió el rendiment del codi en una CPU moderna és cert, però això no vol dir que les reaccions siguin desconegudes, o que saber-les siguin inútils.

Per a cada instrucció pot ajudar molt manualment a planificar el codi. El programador pot fer moltes optimitzacions que el compilador no pot (perquè el compilador no pot garantir que no canviï el significat del programa).

Per descomptat, això encara requereix que coneixeu molts altres detalls sobre la CPU, com el profundament canonades que és, quantes instruccions pot emetre per cicle, nombre d' unitats d'execució i així successivament. I, per descomptat, aquests números van variar per la CPU diferent. Però sovint pots arribar amb una mitjana raonable que més o menys funciona per a tota la CPU.

Però val la pena no fer-ho, que és molta feina optimitzar fins i tot unes quantes línies de codi en aquest nivell. I és fàcil fer una cosa que resulta que és una pessimització. Les CPU modernes són molt complicades, i intenten obtenir una bona actuació del codi dolent. Però també hi ha casos que no poden gestionar eficientment, o on vostè pensa Ets intel·ligent i fas codi eficient, i resulta que alenteix la CPU.

Edita Mirant el manual d'optimització de Intel·ligència, taula C-13: La primera columna és el tipus d' instrucció, llavors hi ha un nombre de columnes per a la retardació per a cada ID de la CPU. L' ID de CPU indica a quin processador s' aplica els números i s' expliquen a qualsevol lloc del document. La tardència especifica quants cicles s'han de prendre abans del resultat de la instrucció està disponible, així que aquest és el nombre que busqueu.

Les columnes a mida mostren quants d' aquest tipus d' instruccions es poden executar per cicle.

Mirant xchg en aquesta taula, veiem que depenent de la família de la CPU, pren 1-3 cicles, i un mov pren 0.5-1. Aquestes són per les formes registradores de les instruccions, no per a una lock xchg amb memòria, que és molt més lent. I el més important, molta tranquil·litat i impacte en el codi circumdant (molt més lent quan hi ha contingut amb un altre nucli), així que només en el millor cas és un error. (No he investigat el que significa l'ID de la CPU, però suposo que els.5 són per Pentiu 4, que han aconseguit alguns components del xip a velocitat doble, permetent-lo fer les coses en mig cicles)

No veig per què planeges utilitzar aquesta informació, però si coneixes la família de la CPU exacta el codi està funcionant, i després afegir-li el retardenc us diu que el nombre mínim de cicles requerits per executar aquesta seqüència d' instruccions.

Mesurar i explicar els cicles de la CPU ja no té sentit el x86.

Primer de tot, pregunta't quina CPU estàs comptant cicles? Core-2? Un Athlon? Pentiu-M? Àtom? Totes aquestes CPU executen el codi x86 però totes tenen temps d' execució diferents. L' execució fins i tot varia entre diferents passos de la mateixa CPU.

L'últim x86 on el cicle comptava tenia sentit era el Pentiu-Pro.

També considereu que dins de la CPU la majoria d' instruccions són transcodedes en microcode codi i executats per una unitat d' execució interna que ni tan sols semblen remotament com un x86. El rendiment d' una única instrucció de CPU depèn de quants recursos hi ha a la unitat d' execució interna.

Així que el moment d'una instrucció no només depèn de la instrucció, sinó també del codi circumdant.

De tota manera: podeu estimar l' ús de codi a través de la font i el retard d' instruccions per a diferents processadors. La informació rellevant es pot trobar a la web Intel·ligència i ADM.

La boira de l'Agoner té un molt bon resum a la seva web-site. Mireu les taules d'ordres per a la pública, a través de l'índex i el recompte d'emergència. Mireu la microarchicatura PDF per aprendre a interpretar això.

Però noteu que xchg - Amb això no té rendiment previsible, encara que només vegis un model de CPU. Fins i tot en el cas sense contingut amb la memòria cau ja està calenta a la memòria cau de L1D, ser una barrera completa de memòria vol dir que l'impacte depèn molt de la càrrega i les botigues a altres adreces del codi circumdant.

Btw - ja que el vostre exemple de codi és un bloc bàsic d' estructura de dades sense bloc de bloqueig: heu considerat usar les funcions de compilador construïts? A la win32 podeu incloure les funcions intririn.h i usar com _InterlockExchange.

Això et donarà millor temps d'execució perquè el compilador pot incloure les instruccions. En línia, sempre obliga el compilador a deshabilitar les optimitzacions al voltant del codi asm.

Noteu que el bloqueig bloquejarà la memòria per a la memòria recuperar tots els nuclis, això pot prendre 100 cicles en alguns diversos nuclis i una línia de memòria cau també haurà de ser buidat. També pararà la canonada. Així que no em preocuparia per la resta.

Artículos Relacionados:

- Processador -

Esta web usa cookies, puedes ver la política de cookies, aquí -
Política de cookies +