PAPI 7.1.0.0
Loading...
Searching...
No Matches
papi_l1_dcm.c File Reference
Include dependency graph for papi_l1_dcm.c:

Go to the source code of this file.

Macros

#define ALLOWED_ERROR   5.0
 
#define NUM_RUNS   100
 
#define ITERATIONS   1000000
 

Functions

int main (int argc, char **argv)
 

Macro Definition Documentation

◆ ALLOWED_ERROR

#define ALLOWED_ERROR   5.0

Definition at line 28 of file papi_l1_dcm.c.

◆ ITERATIONS

#define ITERATIONS   1000000

Definition at line 32 of file papi_l1_dcm.c.

◆ NUM_RUNS

#define NUM_RUNS   100

Definition at line 30 of file papi_l1_dcm.c.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 34 of file papi_l1_dcm.c.

34 {
35
36 int i;
37 int eventset=PAPI_NULL;
38 int num_runs=NUM_RUNS;
39 long long high,low,average,expected;
40 long long count,total;
41
42 int retval;
43 int l1_size,l2_size,l1_linesize,l2_linesize,l2_entries;
44 int arraysize;
45 int quiet,errors=0;
46
47 double error;
48 double *array;
49 double aSumm = 0.0;
50
51 quiet=tests_quiet(argc,argv);
52
53 if (!quiet) {
54 printf("Testing the PAPI_L1_DCM event\n");
55 }
56
57 /* Init the PAPI library */
59 if (retval != PAPI_VER_CURRENT) {
60 test_fail(__FILE__,__LINE__,"PAPI_library_init",retval);
61 }
62
64 if (retval!=PAPI_OK) {
65 test_fail( __FILE__, __LINE__, "PAPI_create_eventset", retval );
66 }
67
68 retval=PAPI_add_named_event(eventset,"PAPI_L1_DCM");
69 if (retval!=PAPI_OK) {
70 test_skip( __FILE__, __LINE__, "adding PAPI_L1_DCM", retval );
71 }
72
73 l1_size=get_cachesize(L1D_CACHE);
74 l1_linesize=get_linesize(L1D_CACHE);
75 l2_size=get_cachesize(L2_CACHE);
76 l2_linesize=get_linesize(L2_CACHE);
77 l2_entries=get_entries(L2_CACHE);
78
79 if (!quiet) {
80 printf("\tDetected %dk L1 DCache, %dB linesize\n",
81 l1_size/1024,l1_linesize);
82 printf("\tDetected %dk L2 DCache, %dB linesize, %d entries\n",
83 l2_size/1024,l2_linesize,l2_entries);
84 }
85
86 arraysize=(l1_size/sizeof(double))*8;
87
88 if (arraysize==0) {
89 if (!quiet) printf("Could not detect cache size\n");
90 test_skip(__FILE__,__LINE__,"No cache info",0);
91 }
92
93 if (!quiet) {
94 printf("\tAllocating %zu bytes of memory (%d doubles)\n",
95 arraysize*sizeof(double),arraysize);
96 }
97
98 array=calloc(arraysize,sizeof(double));
99 if (array==NULL) {
100 test_fail(__FILE__,__LINE__,"Can't allocate memory",0);
101 }
102
103 /******************/
104 /* Testing Writes */
105 /******************/
106
107 if (!quiet) {
108 printf("\nWrite Test: Writing an array of %d doubles %d random times:\n",
109 arraysize,ITERATIONS);
110 printf("It's expected that 7/8 of the accesses should be hits\n");
111 }
112
113 high=0; low=0; total=0;
114
115 for(i=0;i<num_runs;i++) {
116
117 PAPI_reset(eventset);
118 PAPI_start(eventset);
119
121
122 retval=PAPI_stop(eventset,&count);
123
124 if (retval!=PAPI_OK) {
125 test_fail( __FILE__, __LINE__,
126 "reading PAPI_L1_DCM", retval );
127 }
128
129 if (count>high) high=count;
130 if ((low==0) || (count<low)) low=count;
131 total+=count;
132 }
133
134 average=(total/num_runs);
135
136 expected=(ITERATIONS*7)/8;
137
138// expected=arraysize/(l1_linesize);
139
140 error=display_error(average,high,low,expected,quiet);
141
142 if ((error > ALLOWED_ERROR) || (error<-ALLOWED_ERROR)) {
143 if (!quiet) {
144 printf("Instruction count off by more than "
145 "%.2lf%%\n",ALLOWED_ERROR);
146 }
147 errors++;
148 }
149
150 if (!quiet) printf("\n");
151
152 /******************/
153 /* Testing Reads */
154 /******************/
155
156 if (!quiet) {
157 printf("\nRead Test: Summing %d random doubles from array "
158 "of size %d:\n",ITERATIONS,arraysize);
159 printf("It's expected that 7/8 of the accesses should be hits\n");
160 }
161
162 high=0; low=0; total=0;
163
164 for(i=0;i<num_runs;i++) {
165
166 PAPI_reset(eventset);
167 PAPI_start(eventset);
168
169 aSumm+=cache_random_read_test(array,arraysize,ITERATIONS);
170
171 retval=PAPI_stop(eventset,&count);
172
173 if (retval!=PAPI_OK) {
174 test_fail( __FILE__, __LINE__,
175 "reading PAPI_L1_DCM", retval );
176 }
177
178 if (count>high) high=count;
179 if ((low==0) || (count<low)) low=count;
180 total+=count;
181 }
182
183 average=(total/num_runs);
184
185 expected=(ITERATIONS*7)/8;
186
187// expected=arraysize/(l1_linesize/sizeof(double));
188
189 error=display_error(average,high,low,expected,quiet);
190
191 if ((error > ALLOWED_ERROR) || (error<-ALLOWED_ERROR)) {
192 if (!quiet) {
193 printf("Instruction count off by more than "
194 "%.2lf%%\n",ALLOWED_ERROR);
195 }
196 errors++;
197 }
198
199 if (!quiet) {
200 printf("\n");
201 }
202
203 if (errors) {
204 test_fail( __FILE__, __LINE__, "Error too high", 1 );
205 }
206
207
208
209 test_pass(__FILE__);
210
211 return 0;
212}
int i
long long get_cachesize(int type)
Definition: cache_helper.c:78
long long get_linesize(int type)
Definition: cache_helper.c:110
long long get_entries(int type)
Definition: cache_helper.c:94
#define L2_CACHE
Definition: cache_helper.h:3
#define L1D_CACHE
Definition: cache_helper.h:2
double cache_random_read_test(double *array, int size, int count)
int cache_random_write_test(double *array, int size, int count)
static long count
add PAPI preset or native hardware event by name to an EventSet
Create a new empty PAPI EventSet.
initialize the PAPI library.
Reset the hardware event counts in an event set.
Start counting hardware events in an event set.
Stop counting hardware events in an event set.
static int expected[NUM_THREADS]
double display_error(long long average, long long high, long long low, long long expected, int quiet)
Definition: display_error.c:7
#define PAPI_VER_CURRENT
Definition: f90papi.h:54
#define PAPI_OK
Definition: f90papi.h:73
#define PAPI_NULL
Definition: f90papi.h:78
static double array[ARRAYSIZE]
Definition: papi_l1_dca.c:23
#define NUM_RUNS
Definition: papi_l1_dcm.c:30
#define ITERATIONS
Definition: papi_l1_dcm.c:32
#define ALLOWED_ERROR
Definition: papi_l1_dcm.c:28
int tests_quiet(int argc, char **argv)
Definition: test_utils.c:376
void PAPI_NORETURN test_fail(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:491
void PAPI_NORETURN test_pass(const char *filename)
Definition: test_utils.c:432
void PAPI_NORETURN test_skip(const char *file, int line, const char *call, int retval)
Definition: test_utils.c:584
int quiet
Definition: rapl_overflow.c:19
static int total
Definition: rapl_overflow.c:9
int retval
Definition: zero_fork.c:53
Here is the call graph for this function: