Modern CPU'lar çok sayıda performans sayacına sahiptir - http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html Bunların nasıl okunması gerekir? Önbellek hataları ve şube yanlış tahminleriyle ilgileniyorum.i5, i7 CPU'larda performans sayaçları nasıl okunur?
cevap
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.
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.
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 –
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.
Ben kullanılabilecek mevcut kütüphane denilen perfmon2, http://perfmon2.sourceforge.net/ olduğunu düşünüyorum ve dokümantasyon http://www.hpl.hp.com/research/linux/perfmon/perfmon.php4 ve http://www.hpl.hp.com/techreports/2004/HPL-2004-200R1.html mevcuttur, Geçenlerde ben en kısa sürede bunu anlamaya olarak örnek kod sonrası olacaktır bu lib dışarı kazma am ~
PAPI iyi bir şey. Çapraz platformdur, dolayısıyla x86-Windows'dan IBM BlueGenes'e kadar birçok platformda çalışır. –