blob: cbe9e6eeabd50bb30797e09c3f57647d5be1f5b5 [file] [log] [blame]
Marat Dukhan547fa362017-03-03 02:47:26 -05001#include <stdio.h>
2#include <inttypes.h>
3
4#include <cpuinfo.h>
5
6
Marat Dukhanc5c24312017-03-04 02:34:39 -05007void report_cache(
8 uint32_t count, const struct cpuinfo_cache cache[restrict static 1],
9 uint32_t level, const char* nonunified_type)
10{
Marat Dukhan547fa362017-03-03 02:47:26 -050011 const char* type = (cache->flags & CPUINFO_CACHE_UNIFIED) ? "unified" : nonunified_type;
12 printf("L%"PRIu32" %s cache: ", level, type);
13
Marat Dukhanc5c24312017-03-04 02:34:39 -050014 uint32_t size = cache->size;
Marat Dukhan547fa362017-03-03 02:47:26 -050015 const char* units = "bytes";
Marat Dukhanc5c24312017-03-04 02:34:39 -050016 if (size % UINT32_C(1048576) == 0) {
17 size /= UINT32_C(1048576);
Marat Dukhan547fa362017-03-03 02:47:26 -050018 units = "MB";
Marat Dukhanc5c24312017-03-04 02:34:39 -050019 } else if (size % UINT32_C(1024) == 0) {
20 size /= UINT32_C(1024);
Marat Dukhan547fa362017-03-03 02:47:26 -050021 units = "KB";
22 }
Marat Dukhanc5c24312017-03-04 02:34:39 -050023 if (count != 1) {
24 printf("%"PRIu32" x ", count);
25 }
Marat Dukhan91519812017-03-04 02:37:36 -050026 if (level == 1) {
27 printf("%"PRIu32" %s, ", size, units);
28 } else {
29 printf("%"PRIu32" %s (%s), ", size, units, (cache->flags & CPUINFO_CACHE_INCLUSIVE) ? "inclusive" : "exclusive");
30 }
Marat Dukhan547fa362017-03-03 02:47:26 -050031
32 if (cache->associativity * cache->line_size == cache->size) {
33 printf("fully associative");
34 } else {
35 printf("%"PRIu32"-way set associative", cache->associativity);
36 }
37 if (cache->sets != 0) {
38 printf(" (%"PRIu32" sets", cache->sets);
39 if (cache->partitions != 1) {
40 printf(", %"PRIu32" partitions", cache->partitions);
41 }
42 if (cache->flags & CPUINFO_CACHE_COMPLEX_INDEXING) {
43 printf(", complex indexing), ");
44 } else {
45 printf("), ");
46 }
47 }
48
49 printf("%"PRIu32" byte lines", cache->line_size);
Marat Dukhanab3a1272017-08-25 23:20:07 -070050 if (cache->processor_count != 0) {
51 printf(", shared by %"PRIu32" processors\n", cache->processor_count);
Marat Dukhan547fa362017-03-03 02:47:26 -050052 } else {
53 printf("\n");
54 }
55}
56
57int main(int argc, char** argv) {
58 cpuinfo_initialize();
Marat Dukhan30401972017-09-26 18:35:52 -070059 if (cpuinfo_get_l1i_caches_count() != 0 && (cpuinfo_get_l1i_cache(0)->flags & CPUINFO_CACHE_UNIFIED) == 0) {
60 report_cache(cpuinfo_get_l1i_caches_count(), cpuinfo_get_l1i_cache(0), 1, "instruction");
Marat Dukhan547fa362017-03-03 02:47:26 -050061 }
Marat Dukhan30401972017-09-26 18:35:52 -070062 if (cpuinfo_get_l1d_caches_count() != 0) {
63 report_cache(cpuinfo_get_l1d_caches_count(), cpuinfo_get_l1d_cache(0), 1, "data");
Marat Dukhan547fa362017-03-03 02:47:26 -050064 }
Marat Dukhan30401972017-09-26 18:35:52 -070065 if (cpuinfo_get_l2_caches_count() != 0) {
66 report_cache(cpuinfo_get_l2_caches_count(), cpuinfo_get_l2_cache(0), 2, "data");
Marat Dukhan547fa362017-03-03 02:47:26 -050067 }
Marat Dukhan30401972017-09-26 18:35:52 -070068 if (cpuinfo_get_l3_caches_count() != 0) {
69 report_cache(cpuinfo_get_l3_caches_count(), cpuinfo_get_l3_cache(0), 3, "data");
Marat Dukhanc5c24312017-03-04 02:34:39 -050070 }
Marat Dukhan30401972017-09-26 18:35:52 -070071 if (cpuinfo_get_l4_caches_count() != 0) {
72 report_cache(cpuinfo_get_l4_caches_count(), cpuinfo_get_l4_cache(0), 4, "data");
Marat Dukhan547fa362017-03-03 02:47:26 -050073 }
74}