PAPI

Introducció

PAPI (Performance API) és una interfície de programació que permet a la persona desenvolupadora accedir a comptadors de rendiment de maquinari, proporcionant estadístiques importants per analitzar el rendiment de programes. Explicarem com instal·lar i utilitzar la llibreria PAPI en Python per monitoritzar mètriques com el nombre d’instruccions, els cicles de CPU, i altres.

Més informació:

Performance Application Programming Interface

python-papi 6.0.0.2

Beneficis de l’ús de PAPI

L’ús de PAPI en Python ofereix diversos avantatges per al desenvolupament i optimització del codi:

  1. Mesurament detallat del rendiment: - Permet obtenir mètriques del rendiment de baix nivell, com el nombre d’instruccions executades, cicles de CPU i altres esdeveniments específics de maquinari.

  2. Optimització del codi: - Ajuda a identificar colls d’ampolla i zones del codi que poden ser optimitzades per reduir el temps d’execució o l’ús de recursos.

  3. Ajust de l’eficiència de CPU: - Facilita l’ajust de l’ús de cicles de CPU per millorar el rendiment i reduir el consum d’energia en entorns de computació intensiva.

Instal·lació de la llibreria pypapi

Per utilitzar PAPI amb Python, cal instal·lar la llibreria pypapi, que proporciona una interfície per treballar amb els comptadors de PAPI. Recorda instal·lar-la al teu venv.

  1. Instal·lació amb pip:

    $ pip install pypapi
    

Com usar PAPI en Python

Després d’instal·lar pypapi, pots començar a utilitzar-lo per monitoritzar el rendiment d’un fragment de codi.

El següent exemple mostra com mesurar el nombre d’instruccions executades i els cicles de CPU consumits en una funció simple.

from pypapi import events, papi_high as high

# Inicialitzem PAPI per obtenir les mètriques
high.start_counters([events.PAPI_TOT_INS, events.PAPI_TOT_CYC])

# Codi a mesurar
def suma_simple():
    suma = 0
    for i in range(1, 1000000):
        suma += i
    return suma

# Executem la funció
suma_simple()

# Aturem els comptadors i obtenim els resultats
resultats = high.stop_counters()

# Mostrem les mètriques obtingudes
print("Nombre total d'instruccions (PAPI_TOT_INS):", resultats[0])
print("Nombre total de cicles (PAPI_TOT_CYC):", resultats[1])

# Calculem el CPI (Cycles Per Instruction)
if resultats[0] != 0:
    cpi = resultats[1] / resultats[0]
    print("Cicles per instrucció (CPI):", cpi)
else:
    print("No s'han comptat instruccions.")

Explicació del codi:

  1. Inicialització dels comptadors: Fem servir high.start_counters() per activar els comptadors de PAPI. En aquest exemple, comptem el nombre total d’instruccions (PAPI_TOT_INS) i el nombre total de cicles (PAPI_TOT_CYC).

  2. Codi a mesurar: Definim una funció suma_simple() que realitza una suma simple. Aquest és el codi que volem analitzar.

  3. Finalització dels comptadors: Fem servir high.stop_counters() per aturar els comptadors i obtenir els resultats. resultats[0] conté el nombre d’instruccions executades, i resultats[1] conté el nombre de cicles.

  4. Càlcul del CPI (Cicles Per Instrucció): Dividim el nombre de cicles pel nombre d’instruccions per obtenir el valor del CPI, una mètrica de rendiment important.

Com activar altres comptadors de PAPI

PAPI ofereix una àmplia gamma de comptadors de rendiment per a mesurar esdeveniments específics del maquinari. A més de PAPI_TOT_INS i PAPI_TOT_CYC, alguns altres comptadors comuns inclouen:

  • PAPI_FP_OPS: Nombre d’operacions de punt flotant.

  • PAPI_L1_DCM: Fallades de caché de primer nivell de dades.

  • PAPI_L2_TCM: Fallades de caché de segon nivell.

  • PAPI_BR_MSP: Errors de predicció de salts.

  • PAPI_L3_TCM: Fallades de caché de tercer nivell.

  • PAPI_TLB_DM: Fallades de la Translation Lookaside Buffer (TLB) de dades.

  • PAPI_VEC_INS: Nombre d’instruccions vectorials executades.

Compte que no tots els comptadors són compatibles entre sí

Per afegir altres comptadors, simplement inclou l’esdeveniment a la llista passada a start_counters:

high.start_counters([events.PAPI_TOT_INS, events.PAPI_TOT_CYC, events.PAPI_L1_DCM])

# Executa el codi a mesurar
...

Limitacions de PAPI en Python

Tot i que PAPI és una eina potent, té algunes limitacions:

  • Compatibilitat: PAPI pot no ser compatible amb tots els processadors i sistemes operatius.

  • Disponibilitat de comptadors: Alguns esdeveniments específics poden no estar disponibles segons el maquinari.

  • Incompatibilitat de comptadors entre ells: Alguns comptadors o esdeveniments poden ser incompatibles entre ells

A tenir en compte

El rendiment pot variar en funció del tamany de les taules caché, el que és rellevant i a tenir en compte si es vol fer un anàlisi molt extensiu.

El nombre total d’instruccions executades amb PAPI pot variar en funció de si hi ha fallades de caché, però de manera indirecta. Quan hi ha una fallada de caché, la CPU ha de recuperar dades de memòria més lenta (com la memòria principal), la qual cosa implica una latència més gran en algunes instruccions. Això pot fer que es reordenen o que es paralitzin processos mentre es carrega la informació necessària, cosa que podria alterar el nombre d’instruccions executades en un interval determinat.

Tanmateix, el nombre d’instruccions programades inicialment no canvia. En realitat, són els temps de latència i el nombre de cicles per instrucció (CPI) els que es veuen afectats, però no la quantitat total d’instruccions “contades” per PAPI. A efectes d’un recompte global d’instruccions executades, aquest hauria de romandre constant, independentment de les fallades de caché.