Le moderne CPU dispongono di un numero elevato di contatori delle prestazioni - http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html come leggerli? Mi interessano le mancanze della cache e le previsioni sbagliate delle filiali.Come leggere i contatori delle prestazioni su CPU i5, i7
risposta
Sembra che PAPI abbia un'API molto pulita e funzioni perfettamente su Ubuntu 11.04. Una volta installato, dopo applicazione sarà fare quello che volevo:
#include <stdio.h>
#include <stdlib.h>
#include <papi.h>
#define NUM_EVENTS 4
void matmul(const double *A, const double *B,
double *C, int m, int n, int p)
{
int i, j, k;
for (i = 0; i < m; ++i)
for (j = 0; j < p; ++j) {
double sum = 0;
for (k = 0; k < n; ++k)
sum += A[i*n + k] * B[k*p + j];
C[i*p + j] = sum;
}
}
int main(int /* argc */, char ** /* argv[] */)
{
const int size = 300;
double a[size][size];
double b[size][size];
double c[size][size];
int event[NUM_EVENTS] = {PAPI_TOT_INS, PAPI_TOT_CYC, PAPI_BR_MSP, PAPI_L1_DCM };
long long values[NUM_EVENTS];
/* Start counting events */
if (PAPI_start_counters(event, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_start_counters - FAILED\n");
exit(1);
}
matmul((double *)a, (double *)b, (double *)c, size, size, size);
/* Read the counters */
if (PAPI_read_counters(values, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_read_counters - FAILED\n");
exit(1);
}
printf("Total instructions: %lld\n", values[0]);
printf("Total cycles: %lld\n", values[1]);
printf("Instr per cycle: %2.3f\n", (double)values[0]/(double) values[1]);
printf("Branches mispredicted: %lld\n", values[2]);
printf("L1 Cache misses: %lld\n", values[3]);
/* Stop counting events */
if (PAPI_stop_counters(values, NUM_EVENTS) != PAPI_OK) {
fprintf(stderr, "PAPI_stoped_counters - FAILED\n");
exit(1);
}
return 0;
}
Provato questo su Intel Q6600, che supporta fino a 4 eventi di prestazioni. Il tuo processore potrebbe supportare più o meno.
I contatori delle prestazioni vengono letti con il numero RDPMC
insn.
EDIT: Per aggiungere un po 'più di informazioni, la lettura di contatori delle prestazioni non è molto facile e ci vorrebbe pagine su pagine, se vogliamo descrivere qui, oltre coinvolge scrive al modello registri specifici, che richiedono istruzioni privilegiate . Vorrei invece consigliare l'uso di profilatori pronti - oprofile o Intel VTune, che sono costruiti su contatori delle prestazioni.
Non sembra così difficile dopo aver menzionato RDPMC. Una volta che la modalità privilegiata per RDPMC è disabilitata, le sue sole 15 righe di codice e Linux 2.6.32 la disabilitano di default. Inoltre c'è una bella libreria - http://icl.cs.utk.edu/papi/software/index.html –
Che dire di perf? perf list hw cache
mostra 33 eventi diversi e la pagina man mostra come utilizzare i descrittori del contatore delle prestazioni non elaborati.
Penso che ci sia una libreria disponibile che può essere utilizzato, chiamato perfmon2, http://perfmon2.sourceforge.net/ e documentazioni sono disponibili a http://www.hpl.hp.com/research/linux/perfmon/perfmon.php4 e http://www.hpl.hp.com/techreports/2004/HPL-2004-200R1.html, sto recente scavando questo lib fuori, vorrei inviare codice di esempio, non appena ho capirlo ~
PAPI è roba buona. È multipiattaforma e funziona sulla maggior parte delle piattaforme, da x86-Windows a IBM BlueGenes. –