Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | #include <inttypes.h> |
| 3 | |
| 4 | #include <cpuinfo.h> |
| 5 | |
| 6 | |
Marat Dukhan | c5c2431 | 2017-03-04 02:34:39 -0500 | [diff] [blame] | 7 | void report_cache( |
| 8 | uint32_t count, const struct cpuinfo_cache cache[restrict static 1], |
| 9 | uint32_t level, const char* nonunified_type) |
| 10 | { |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 11 | const char* type = (cache->flags & CPUINFO_CACHE_UNIFIED) ? "unified" : nonunified_type; |
| 12 | printf("L%"PRIu32" %s cache: ", level, type); |
| 13 | |
Marat Dukhan | c5c2431 | 2017-03-04 02:34:39 -0500 | [diff] [blame] | 14 | uint32_t size = cache->size; |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 15 | const char* units = "bytes"; |
Marat Dukhan | c5c2431 | 2017-03-04 02:34:39 -0500 | [diff] [blame] | 16 | if (size % UINT32_C(1048576) == 0) { |
| 17 | size /= UINT32_C(1048576); |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 18 | units = "MB"; |
Marat Dukhan | c5c2431 | 2017-03-04 02:34:39 -0500 | [diff] [blame] | 19 | } else if (size % UINT32_C(1024) == 0) { |
| 20 | size /= UINT32_C(1024); |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 21 | units = "KB"; |
| 22 | } |
Marat Dukhan | c5c2431 | 2017-03-04 02:34:39 -0500 | [diff] [blame] | 23 | if (count != 1) { |
| 24 | printf("%"PRIu32" x ", count); |
| 25 | } |
Marat Dukhan | 9151981 | 2017-03-04 02:37:36 -0500 | [diff] [blame] | 26 | 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 Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 31 | |
| 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 Dukhan | ab3a127 | 2017-08-25 23:20:07 -0700 | [diff] [blame] | 50 | if (cache->processor_count != 0) { |
| 51 | printf(", shared by %"PRIu32" processors\n", cache->processor_count); |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 52 | } else { |
| 53 | printf("\n"); |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | int main(int argc, char** argv) { |
| 58 | cpuinfo_initialize(); |
Marat Dukhan | 3040197 | 2017-09-26 18:35:52 -0700 | [diff] [blame] | 59 | 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 Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 61 | } |
Marat Dukhan | 3040197 | 2017-09-26 18:35:52 -0700 | [diff] [blame] | 62 | if (cpuinfo_get_l1d_caches_count() != 0) { |
| 63 | report_cache(cpuinfo_get_l1d_caches_count(), cpuinfo_get_l1d_cache(0), 1, "data"); |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 64 | } |
Marat Dukhan | 3040197 | 2017-09-26 18:35:52 -0700 | [diff] [blame] | 65 | if (cpuinfo_get_l2_caches_count() != 0) { |
| 66 | report_cache(cpuinfo_get_l2_caches_count(), cpuinfo_get_l2_cache(0), 2, "data"); |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 67 | } |
Marat Dukhan | 3040197 | 2017-09-26 18:35:52 -0700 | [diff] [blame] | 68 | if (cpuinfo_get_l3_caches_count() != 0) { |
| 69 | report_cache(cpuinfo_get_l3_caches_count(), cpuinfo_get_l3_cache(0), 3, "data"); |
Marat Dukhan | c5c2431 | 2017-03-04 02:34:39 -0500 | [diff] [blame] | 70 | } |
Marat Dukhan | 3040197 | 2017-09-26 18:35:52 -0700 | [diff] [blame] | 71 | if (cpuinfo_get_l4_caches_count() != 0) { |
| 72 | report_cache(cpuinfo_get_l4_caches_count(), cpuinfo_get_l4_cache(0), 4, "data"); |
Marat Dukhan | 547fa36 | 2017-03-03 02:47:26 -0500 | [diff] [blame] | 73 | } |
| 74 | } |