2011-11-11 13 views

cevap

14

PAPI'un çok temiz API'ye sahip olduğu ve Ubuntu 11.04 üzerinde gayet iyi çalışıyor. Yüklendikten sonra aşağıdaki uygulaması ne istediğini yapar: Intel Q6600 bu test

#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; 
} 

, bu 4 performans olayları destekler. İşlemciniz az çok destekleyebilir.

+3

PAPI iyi bir şey. Çapraz platformdur, dolayısıyla x86-Windows'dan IBM BlueGenes'e kadar birçok platformda çalışır. –

2

Performans sayaçları, RDPMC insn.

DÜZENLEME: performans sayaçlarını okuma çok kolay değildir ve biz ayrıcalıklı talimatları gerektiren spesifik Registers, Model yazıyor içerir yanında burada açıklamak için eğer o sayfaların üzerine sayfalara alacağını, biraz daha bilgi eklemek için . Bunun yerine, performans sayaçları üzerine inşa edilen oprofile veya Intel VTune gibi hazır profilleyicileri kullanmayı tavsiye ederim.

+3

RDPMC'den sonra bu zor görünmüyor. RDPMC için ayrıcalıklı mod devre dışı bırakıldıktan sonra sadece 15 satırlık kod ve Linux 2.6.32 varsayılan olarak devre dışı bırakılır. Ayrıca oldukça güzel bir kütüphane var - http://icl.cs.utk.edu/papi/software/index.html –

5

perf nedir? perf list hw cache, 33 farklı etkinliği gösterir ve man sayfası, ham performans sayacı tanımlayıcılarının nasıl kullanıldığını gösterir.