doc: Add serial to list of ci file reserved words
[charm.git] / src / conv-core / conv-counter.c
1 /*
2   Converse performance counter API (high level)
3   currently support origin2000 and PAPI
4   PAPI implementation uses high level functions for single thread applications.
5
6   To instrument a code block:
7
8    CmiStartCounters(...)
9    code
10    CmiStopCounters(...)
11
12    Gengbin Zheng, gzheng@uiuc.edu, 2004/5/10 
13
14 TODO:
15    implement a low-level interface
16 */
17
18 #include "converse.h"
19
20 #ifdef CMK_ORIGIN2000
21 int start_counters(int e0, int e1);
22 int read_counters(int e0, long long *c0, int e1, long long *c1);
23 #elif CMK_HAS_COUNTER_PAPI
24 #include <papi.h>
25 #endif
26
27 void CmiInitCounters()
28 {
29 #if CMK_HAS_COUNTER_PAPI
30   int retval = PAPI_library_init(PAPI_VER_CURRENT);
31   if (retval != PAPI_VER_CURRENT && retval > 0) { 
32     printf("PAPI library version mismatch!\n"); 
33   }
34 #endif
35 }
36
37 void CmiStartCounters(int events[], int numEvents)
38 {
39 #ifdef CMK_ORIGIN2000
40   CmiAssert(numEvents >= 2);
41   if (start_counters(events[0], events[1]) <0) {
42       perror("start_counters");;
43   }
44 #elif CMK_HAS_COUNTER_PAPI
45   if (PAPI_start_counters(events, numEvents) != PAPI_OK) {
46       CmiAbort("Failed to read PAPI counters!!\n");
47   }
48 #else
49   /* CmiAbort("CmiStartCounters not implemented!"); */
50   /* nop */
51 #endif
52 }
53
54 /* read */
55 void CmiStopCounters(int events[], CMK_TYPEDEF_INT8 values[], int numEvents)
56 {
57 #ifdef CMK_ORIGIN2000
58   CmiAssert(numEvents >= 2);
59   if (read_counters(events[0], &values[0], events[1], &values[1]) < 0) perror("read_counters");
60 #elif CMK_HAS_COUNTER_PAPI
61   if (PAPI_stop_counters(values, 2) != PAPI_OK) {
62     CmiAbort("Failed to read PAPI counters!\n");
63   }
64 #else
65   /* CmiAbort("CmiReadCounters not implemented!"); */
66   int i;
67   for (i=0; i<numEvents; i++) values[i] = 0;
68 #endif
69 }
70
71