Как читать счетчики производительности на i5, i7 CPU

Современные процессоры имеют довольно много счетчиков производительности - http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html как их читать? Меня интересуют недостатки кэша и неверные прогнозы отрасли.

Ответ 1

Похоже, PAPI имеет очень чистый API и отлично работает на Ubuntu 11.04. После его установки следующее приложение будет делать то, что я хотел:

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

Протестировано на Intel Q6600, оно поддерживает до 4 событий производительности. Ваш процессор может поддерживать более или менее.

Ответ 2

Как насчет perf? perf list hw cache показывает 33 разных события, а на странице руководства показано, как использовать необработанные дескрипторы счетчика производительности.

Ответ 3

Счетчики производительности считываются с помощью RDPMC insn.

РЕДАКТИРОВАТЬ: Чтобы добавить немного больше информации, чтение счетчиков производительности не очень просто, и на страницах будут отображаться страницы, если мы хотим описать его здесь, кроме того, он включает в себя записи в специализированные регистры модели, которые требуют привилегированных инструкций. Вместо этого я бы посоветовал использовать готовые профилировщики - oprofile или Intel VTune, которые построены на счетчиках производительности.

Ответ 4

Я думаю, что есть доступная библиотека, которая может быть использована, называется perfmon2, http://perfmon2.sourceforge.net/, а документация доступна по адресу http://www.hpl.hp.com/research/linux/perfmon/perfmon.php4 и http://www.hpl.hp.com/techreports/2004/HPL-2004-200R1.html, я недавно выкапывал этот lib, Я бы опубликовал пример кода, как только выясню его ~