/[escript]/trunk/paso/src/performance.c
ViewVC logotype

Diff of /trunk/paso/src/performance.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 583 by gross, Mon Feb 6 06:32:06 2006 UTC revision 584 by gross, Thu Mar 9 23:03:38 2006 UTC
# Line 17  Line 17 
17  /*                                                            */  /*                                                            */
18  /*  sets up the the monitoring process                        */  /*  sets up the the monitoring process                        */
19  /*                                                            */  /*                                                            */
20  void Performance_open(Paso_Performance* pp) {  void Performance_open(Paso_Performance* pp,int verbose) {
21     #ifdef PAPI     #ifdef PAPI
22          int i,j;
23        #pragma omp master        #pragma omp master
24        {        {
25             pp->event_set=PAPI_NULL;
26           /* Initialize the PAPI library */           /* Initialize the PAPI library */
27           int retval = PAPI_library_init(PAPI_VER_CURRENT);           int retval = PAPI_library_init(PAPI_VER_CURRENT);
28           if (retval != PAPI_VER_CURRENT && retval > 0) {           if (retval != PAPI_VER_CURRENT && retval > 0) {
29             Paso_setError(SYSTEM_ERROR,"Paso_performance: PAPI library version mismatch.");             Paso_setError(SYSTEM_ERROR,"Paso_performance: PAPI library version mismatch.");
30             return           } else if (retval < 0) {
          }  
          if (retval < 0) {  
31             Paso_setError(SYSTEM_ERROR,"Paso_performance: PAPI initialization error.");             Paso_setError(SYSTEM_ERROR,"Paso_performance: PAPI initialization error.");
32             return           } else {
33           }              if (PAPI_create_eventset(&(pp->event_set)) != PAPI_OK)
34           /* Create an EventSet */                 Paso_setError(SYSTEM_ERROR,"Paso_performance: PAPI event set set up failed.");
35           if (PAPI_create_eventset(&(pp->event_set)) != PAPI_OK) {           }
36             Paso_setError(SYSTEM_ERROR,"Paso_performance: PAPI event set set upo failed.");           if (Paso_noError()) {
37             return              /* try to add various monitors */
38           }              pp->num_events=0;
39           /* try to add various monitors */              if (PAPI_add_event(pp->event_set, PAPI_FP_OPS) == PAPI_OK) {
40           pp->num_events=0;                  pp->events[pp->num_events]=PAPI_FP_OPS;
41           if (PAPI_add_event(pp->event_set, PAPI_FP_OPS) == PAPI_OK) {                  pp->num_events++;
42               pp->events[pp->num_events]=PAPI_FP_OPS;              }
43               pp->num_events++;              if (PAPI_add_event(pp->event_set, PAPI_L1_DCM) == PAPI_OK) {
44           }                  pp->events[pp->num_events]=PAPI_L1_DCM;
45           if (PAPI_add_event(pp->event_set, PAPI_L1_DCM) == PAPI_OK) {                  pp->num_events++;
46               pp->events[pp->num_events]=PAPI_L1_DCM;              }
47               pp->num_events++;              if (PAPI_add_event(pp->event_set, PAPI_L2_DCM) == PAPI_OK) {
48           }                  pp->events[pp->num_events]=PAPI_L2_DCM;
49           if (PAPI_add_event(pp->event_set, PAPI_L2_DCM) == PAPI_OK) {                  pp->num_events++;
50               pp->events[pp->num_events]=PAPI_L2_DCM;              }
51               pp->num_events++;              if (PAPI_add_event(pp->event_set, PAPI_L3_DCM) == PAPI_OK) {
52           }                  pp->events[pp->num_events]=PAPI_L3_DCM;
53           if (PAPI_add_event(pp->event_set, PAPI_L3_DCM) == PAPI_OK) {                  pp->num_events++;
54               pp->events[pp->num_events]=PAPI_L3_DCM;              }
55               pp->num_events++;              for (i=0;i<PERFORMANCE_NUM_MONITORS;++i) {
56           }                 pp->cycles[i]=0;
57           for (i=0;i<PERFORMANCE_NUM_MONITORS;++i) {                 pp->set[i]=PERFORMANCE_UNUSED;
58              pp->cycles[i]=0;                 for (j=0;j<PERFORMANCE_NUM_EVENTS;++j) pp->values[i][j]=0.;
59              pp->set[i]=PERFORMANCE_NOT_USED;              }
60              for (j=0;j<PERFORMANCE_NUM_EVENTS;++j) pp->values[i][j]=0.;              PAPI_start(pp->event_set);
61           }           }
          PAPI_start(pp->event_set);  
62        }        }
63     #endif     #endif
64  }  }
# Line 75  int  Performance_getEventIndex(Paso_Perf Line 74  int  Performance_getEventIndex(Paso_Perf
74  /*                                                            */  /*                                                            */
75  /*  shuts down the monitoring process                         */  /*  shuts down the monitoring process                         */
76  /*                                                            */  /*                                                            */
77  void Performance_close(Paso_Performance* pp) {  void Performance_close(Paso_Performance* pp,int verbose) {
78      #ifdef PAPI      #ifdef PAPI
79          long_long values[PERFORMANCE_NUM_EVENTS];
80        #pragma omp master        #pragma omp master
81        {        {
82          #ifdef SHOW_PERFORMANCE          if (Paso_noError() && verbose) {
83             int i;             int i;
84             int i_ops=Performance_getEventIndex(pp,PAPI_FP_OPS);             int i_ops=Performance_getEventIndex(pp,PAPI_FP_OPS);
85             int i_l1_miss=Performance_getEventIndex(pp,PAPI_L1_DCM);             int i_l1_miss=Performance_getEventIndex(pp,PAPI_L1_DCM);
86             int i_l2_miss=Performance_getEventIndex(pp,PAPI_L2_DCM);             int i_l2_miss=Performance_getEventIndex(pp,PAPI_L2_DCM);
87             int i_l3_miss=Performance_getEventIndex(pp,PAPI_L3_DCM);             int i_l3_miss=Performance_getEventIndex(pp,PAPI_L3_DCM);
88             printf(" monitor               |");             printf(" monitor               |");
89             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT) printf(" flops/cycle |")             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT) printf("  flops/cycle |");
90             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l1_miss!=PERFORMANCE_UNMONITORED_EVENT) printf(" L1 miss/flops |")             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l1_miss!=PERFORMANCE_UNMONITORED_EVENT) printf(" L1 miss/flops |");
91             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l2_miss!=PERFORMANCE_UNMONITORED_EVENT) printf(" L2 miss/flops |")             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l2_miss!=PERFORMANCE_UNMONITORED_EVENT) printf(" L2 miss/flops |");
92             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l3_miss!=PERFORMANCE_UNMONITORED_EVENT) printf(" L3 miss/flops |")             if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l3_miss!=PERFORMANCE_UNMONITORED_EVENT) printf(" L3 miss/flops |");
93             printf("\n");             printf("\n");
94             for (i=0;i<PERFORMANCE_NUM_MONITORS;++i) {             for (i=0;i<PERFORMANCE_NUM_MONITORS;++i) {
95                 if (! pp->set[i]==PERFORMANCE_NOT_USED ) {                 if (pp->set[i]!=PERFORMANCE_UNUSED ) {
96                    swtich(i) {                    switch(i) {
97                      case PERFORMANCE_ALL:                      case PERFORMANCE_ALL:
98                         printf(" over all              |");                         printf(" over all              |");
99                         break;                         break;
# Line 117  void Performance_close(Paso_Performance* Line 117  void Performance_close(Paso_Performance*
117                         break;                         break;
118                    }                    }
119                    if (pp->set[i]==PERFORMANCE_CLOSED ) {                    if (pp->set[i]==PERFORMANCE_CLOSED ) {
120                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT) printf(" %e12.5 |"%(((double)(pp->values[i][i_ops]))/((double)(pp->cycles[i]))));                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT) printf(" %12.5e |",(((double)(pp->values[i][i_ops]))/((double)(pp->cycles[i]))));
121                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l1_miss!=PERFORMANCE_UNMONITORED_EVENT)                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l1_miss!=PERFORMANCE_UNMONITORED_EVENT)
122                                                     printf(" %e13.5 |"%(((double)(pp->values[i][i_l1_miss]))/((double)(pp->values[i][i_ops]))));                                                     printf(" %13.5e |",(((double)(pp->values[i][i_l1_miss]))/((double)(pp->values[i][i_ops]))));
123                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l2_miss!=PERFORMANCE_UNMONITORED_EVENT)                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l2_miss!=PERFORMANCE_UNMONITORED_EVENT)
124                                                     printf(" %e13.5 |"%(((double)(pp->values[i][i_l2_miss]))/((double)(pp->values[i][i_ops]))));                                                     printf(" %13.5e |",(((double)(pp->values[i][i_l2_miss]))/((double)(pp->values[i][i_ops]))));
125                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l3_miss!=PERFORMANCE_UNMONITORED_EVENT)                       if (i_ops!=PERFORMANCE_UNMONITORED_EVENT &&  i_l3_miss!=PERFORMANCE_UNMONITORED_EVENT)
126                                                     printf(" %e13.5 |"%(((double)(pp->values[i][i_l3_miss]))/((double)(pp->values[i][i_ops]))));                                                     printf(" %13.5e |",(((double)(pp->values[i][i_l3_miss]))/((double)(pp->values[i][i_ops]))));
127                    } else {                    } else {
128                       printf("not closed!!!");                       printf("not closed!!!");
129                    }                    }
130                    printf("\n");                    printf("\n");
131               }               }
132            }            }
133          #endif          }
134            PAPI_stop(pp->event_set,values);
135          PAPI_cleanup_eventset(pp->event_set);          PAPI_cleanup_eventset(pp->event_set);
136          PAPI_destroy_eventset(pp->event_set);          PAPI_destroy_eventset(&(pp->event_set));
137        }        }
138      #endif      #endif
139  }  }
# Line 141  void Performance_close(Paso_Performance* Line 142  void Performance_close(Paso_Performance*
142  /*                                                                     */  /*                                                                     */
143  void Performance_startMonitor(Paso_Performance* pp,int monitor) {  void Performance_startMonitor(Paso_Performance* pp,int monitor) {
144      #ifdef PAPI      #ifdef PAPI
145           int i;
146         long_long values[PERFORMANCE_NUM_EVENTS];         long_long values[PERFORMANCE_NUM_EVENTS];
147         #pragma omp barrier         #pragma omp barrier
148         #pragma omp master         #pragma omp master
149         {         {
150            /* Start counting events in the Event Set */            /* Start counting events in the Event Set */
151            PAPI_read(pp->event_set,values);            PAPI_read(pp->event_set,values);
152            for (i=0;i<pp->num_events;++i) pp->values[monitor]-=values[i]            for (i=0;i<pp->num_events;++i) pp->values[monitor][i]-=values[i];
153            /* set cycles */            /* set cycles */
154            pp->cycles[monitor]-=PAPI_get_real_cyc();            pp->cycles[monitor]-=PAPI_get_real_cyc();
155            pp->set[monitor]=PERFORMANCE_OPEN;            pp->set[monitor]=PERFORMANCE_OPENED;
156         }         }
157      #endif      #endif
158  }  }
# Line 159  void Performance_startMonitor(Paso_Perfo Line 161  void Performance_startMonitor(Paso_Perfo
161  /*                                                                     */  /*                                                                     */
162  void Performance_stopMonitor(Paso_Performance* pp,int monitor) {  void Performance_stopMonitor(Paso_Performance* pp,int monitor) {
163      #ifdef PAPI      #ifdef PAPI
164           int i;
165         long_long values[PERFORMANCE_NUM_EVENTS];         long_long values[PERFORMANCE_NUM_EVENTS];
166         #pragma omp barrier         #pragma omp barrier
167         #pragma omp master         #pragma omp master
168         {         {
169            /* Add the counters in the Event Set */            /* Add the counters in the Event Set */
170            PAPI_read(pp->event_set,values);            PAPI_read(pp->event_set,values);
171            for (i=0;i<pp->num_events;++i) pp->values[monitor]+=values[i]            for (i=0;i<pp->num_events;++i) pp->values[monitor][i]+=values[i];
172            /* set cycles */            /* set cycles */
173            pp->cycles[monitor]+=PAPI_get_real_cyc();            pp->cycles[monitor]+=PAPI_get_real_cyc();
174            pp->set[monitor]=PERFORMANCE_CLOSE;            pp->set[monitor]=PERFORMANCE_CLOSED;
175         }         }
176      #endif      #endif
177  }  }

Legend:
Removed from v.583  
changed lines
  Added in v.584

  ViewVC Help
Powered by ViewVC 1.1.26