Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/device/cpu.cfa

    rcf85f96 r45fde9f  
    256256}
    257257
    258 struct llc_map_t {
    259         raw_cache_instance * raw;
    260         unsigned count;
    261         unsigned start;
    262 };
    263 
    264258// returns an allocate list of all the different distinct last level caches
    265 static [*llc_map_t, size_t cnt] distinct_llcs(unsigned cpus, unsigned llc_idx, raw_cache_instance ** raw) {
     259static [*idx_range_t, size_t cnt] distinct_llcs(unsigned cpus, unsigned llc_idx, raw_cache_instance ** raw) {
    266260        // Allocate at least one element
    267         llc_map_t* ranges = alloc();
     261        idx_range_t * ranges = alloc();
    268262        size_t range_cnt = 1;
    269263
    270264        // Initialize with element 0
    271         ranges->raw = &raw[0][llc_idx];
    272         ranges->count = 0;
    273         ranges->start = -1u;
     265        *ranges = raw[0][llc_idx].range;
    274266
    275267        // Go over all other cpus
    276268        CPU_LOOP: for(i; 1~cpus) {
    277269                // Check if the range is already there
    278                 raw_cache_instance * candidate = &raw[i][llc_idx];
     270                idx_range_t candidate = raw[i][llc_idx].range;
    279271                for(j; range_cnt) {
    280                         llc_map_t & exist = ranges[j];
     272                        idx_range_t exist = ranges[j];
    281273                        // If the range is already there just jump to the next cpu
    282                         if(0 == strcmp(candidate->range, exist.raw->range)) continue CPU_LOOP;
     274                        if(0 == strcmp(candidate, exist)) continue CPU_LOOP;
    283275                }
    284276
    285277                // The range wasn't there, added to the list
    286278                ranges = alloc(range_cnt + 1, ranges`realloc);
    287                 ranges[range_cnt].raw = candidate;
    288                 ranges[range_cnt].count = 0;
    289                 ranges[range_cnt].start = -1u;
     279                ranges[range_cnt] = candidate;
    290280                range_cnt++;
    291281        }
     
    297287struct cpu_pairing_t {
    298288        unsigned cpu;
    299         unsigned id;
     289        unsigned llc_id;
    300290};
    301291
    302292int ?<?( cpu_pairing_t lhs, cpu_pairing_t rhs ) {
    303         return lhs.id < rhs.id;
    304 }
    305 
    306 static [[]cpu_pairing_t] get_cpu_pairings(unsigned cpus, raw_cache_instance ** raw, llc_map_t * maps, size_t map_cnt) {
     293        return lhs.llc_id < rhs.llc_id;
     294}
     295
     296static [[]cpu_pairing_t] get_cpu_pairings(unsigned cpus, raw_cache_instance ** raw, idx_range_t * maps, size_t map_cnt) {
    307297        cpu_pairing_t * pairings = alloc(cpus);
    308298
     
    311301                idx_range_t want = raw[i][0].range;
    312302                MAP_LOOP: for(j; map_cnt) {
    313                         if(0 != strcmp(want, maps[j].raw->range)) continue MAP_LOOP;
    314 
    315                         pairings[i].id = j;
     303                        if(0 != strcmp(want, maps[j])) continue MAP_LOOP;
     304
     305                        pairings[i].llc_id = j;
    316306                        continue CPU_LOOP;
    317307                }
     
    322312        return pairings;
    323313}
    324 
    325 #include <fstream.hfa>
    326314
    327315extern "C" {
     
    348336
    349337                // Find number of distinct cache instances
    350                 llc_map_t * maps;
     338                idx_range_t * maps;
    351339                size_t map_cnt;
    352340                [maps, map_cnt] =  distinct_llcs(cpus, cache_levels - llc, raw);
    353341
    354342                #if defined(__CFA_WITH_VERIFY__)
    355                 // Verify that the caches cover the all the cpus
    356343                {
    357                         unsigned width1 = 0;
    358                         unsigned width2 = 0;
     344                        unsigned width = 0;
    359345                        for(i; map_cnt) {
    360346                                const char * _;
    361                                 width1 += read_width(maps[i].raw->range, strlen(maps[i].raw->range), &_);
    362                                 width2 += maps[i].raw->width;
     347                                width += read_width(maps[i], strlen(maps[i]), &_);
    363348                        }
    364                         verify(width1 == cpus);
    365                         verify(width2 == cpus);
     349                        verify(width == cpus);
    366350                }
    367351                #endif
     
    373357                qsort(pairings, cpus);
    374358
    375                 {
    376                         unsigned it = 0;
    377                         for(i; cpus) {
    378                                 unsigned llc_id = pairings[i].id;
    379                                 if(maps[llc_id].start == -1u) {
    380                                         maps[llc_id].start = it;
    381                                         it += maps[llc_id].raw->width;
    382                                         /* paranoid */ verify(maps[llc_id].start < it);
    383                                         /* paranoid */ verify(it != -1u);
    384                                 }
    385                         }
    386                         /* paranoid */ verify(it == cpus);
    387                 }
    388 
    389                 // From the mappings build the actual cpu map we want
     359                unsigned llc_width = raw[0][cache_levels - llc].width;
     360
     361                // From the mappins build the actual cpu map we want
    390362                struct cpu_map_entry_t * entries = alloc(cpus);
    391363                for(i; cpus) { entries[i].count = 0; }
    392364                for(i; cpus) {
    393                         /* paranoid */ verify(pairings[i].id < map_cnt);
    394365                        unsigned c = pairings[i].cpu;
    395                         unsigned llc_id = pairings[i].id;
    396                         unsigned width = maps[llc_id].raw->width;
    397                         unsigned start = maps[llc_id].start;
    398                         unsigned self  = start + (maps[llc_id].count++);
    399                         entries[c].count = width;
    400                         entries[c].start = start;
    401                         entries[c].self  = self;
     366                        entries[c].start = pairings[i].llc_id * llc_width;
     367                        entries[c].count = llc_width;
    402368                }
    403369
Note: See TracChangeset for help on using the changeset viewer.