2011-11-11 2 views

答えて

14

PAPIのように見えますが、非常にクリーンなAPIがあり、Ubuntu 11.04でもうまく動作します。 それがインストールされています後は、以下のアプリは、私が何を望むかを行います:インテルQ6600上でこれをテストし

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

、それは4つのパフォーマンスイベントをサポートします。あなたのプロセッサは多かれ少なかれサポートしています。

+3

PAPIは良いものです。クロスプラットフォームなので、x86-WindowsからIBM BlueGenesまで、ほとんどのプラットフォームで動作します。 –

2

パフォーマンスカウンターは、RDPMC insnで読み取られます。

EDIT:少しより多くの情報を追加するには、パフォーマンスカウンタを読み込むことは非常に簡単ではありません、我々はここでそれを説明するのであれば、それは特権命令を必要とする特定のレジスタをモデル化するために書き込みを必要とする以外にも、それは、ページ上にページを取ります。代わりに、パフォーマンス・カウンター上に構築された、準備済みのプロファイラー(oprofileまたはIntel VTune)を使用するようにアドバイスします。

+3

RDPMCについて言及しても、それほど難しくはありません。 RDPMCの特権モードが無効にされると、そのコードはわずか15行に制限され、Linux 2.6.32ではデフォルトで無効になります。また、かなりいいライブラリがあります - http://icl.cs.utk.edu/papi/software/index.html –

5

perfperf list hw cacheには33の異なるイベントが表示され、マニュアルページには生のパフォーマンスカウンタディスクリプタの使用方法が示されています。

2

私はhttp://perfmon2.sourceforge.net/、perfmon2呼ばれ、使用できる利用可能なライブラリがあると思うし、ドキュメンテーションはhttp://www.hpl.hp.com/research/linux/perfmon/perfmon.php4http://www.hpl.hp.com/techreports/2004/HPL-2004-200R1.htmlで入手できます、私は最近、私はできるだけ早く私はそれを把握するようサンプルコードをポストだろう、このLIBを掘り起こすています〜

関連する問題