Changes in libcfa/src/device/cpu.cfa [cf85f96:1f05c83]
- File:
-
- 1 edited
-
libcfa/src/device/cpu.cfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/device/cpu.cfa
rcf85f96 r1f05c83 253 253 } 254 254 255 #if defined(__CFA_WITH_VERIFY__) 256 // Check widths are consistent 257 for(i; 1~cpus) { 258 for(j; cache_levels) { 259 verifyf(raw[0][j].width == raw[i][j].width, "Unexpected width %u for cpu %u, index %u. Expected %u.", raw[i][j].width, i, j, raw[0][j].width); 260 } 261 } 262 #endif 263 255 264 return raw; 256 265 } 257 266 258 struct llc_map_t {259 raw_cache_instance * raw;260 unsigned count;261 unsigned start;262 };263 264 267 // 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) {268 static [*idx_range_t, size_t cnt] distinct_llcs(unsigned cpus, unsigned llc_idx, raw_cache_instance ** raw) { 266 269 // Allocate at least one element 267 llc_map_t* ranges = alloc();270 idx_range_t * ranges = alloc(); 268 271 size_t range_cnt = 1; 269 272 270 273 // Initialize with element 0 271 ranges->raw = &raw[0][llc_idx]; 272 ranges->count = 0; 273 ranges->start = -1u; 274 *ranges = raw[0][llc_idx].range; 274 275 275 276 // Go over all other cpus 276 277 CPU_LOOP: for(i; 1~cpus) { 277 278 // Check if the range is already there 278 raw_cache_instance * candidate = &raw[i][llc_idx];279 idx_range_t candidate = raw[i][llc_idx].range; 279 280 for(j; range_cnt) { 280 llc_map_t &exist = ranges[j];281 idx_range_t exist = ranges[j]; 281 282 // If the range is already there just jump to the next cpu 282 if(0 == strcmp(candidate ->range, exist.raw->range)) continue CPU_LOOP;283 if(0 == strcmp(candidate, exist)) continue CPU_LOOP; 283 284 } 284 285 285 286 // The range wasn't there, added to the list 286 287 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; 288 ranges[range_cnt] = candidate; 290 289 range_cnt++; 291 290 } … … 297 296 struct cpu_pairing_t { 298 297 unsigned cpu; 299 unsigned id;298 unsigned llc_id; 300 299 }; 301 300 302 301 int ?<?( 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) {302 return lhs.llc_id < rhs.llc_id; 303 } 304 305 static [[]cpu_pairing_t] get_cpu_pairings(unsigned cpus, raw_cache_instance ** raw, idx_range_t * maps, size_t map_cnt) { 307 306 cpu_pairing_t * pairings = alloc(cpus); 308 307 … … 311 310 idx_range_t want = raw[i][0].range; 312 311 MAP_LOOP: for(j; map_cnt) { 313 if(0 != strcmp(want, maps[j] .raw->range)) continue MAP_LOOP;314 315 pairings[i]. id = j;312 if(0 != strcmp(want, maps[j])) continue MAP_LOOP; 313 314 pairings[i].llc_id = j; 316 315 continue CPU_LOOP; 317 316 } … … 322 321 return pairings; 323 322 } 324 325 #include <fstream.hfa>326 323 327 324 extern "C" { … … 348 345 349 346 // Find number of distinct cache instances 350 llc_map_t * maps;347 idx_range_t * maps; 351 348 size_t map_cnt; 352 349 [maps, map_cnt] = distinct_llcs(cpus, cache_levels - llc, raw); 353 350 354 #if defined(__CFA_WITH_VERIFY__) 355 // Verify that the caches cover the all the cpus 356 { 357 unsigned width1 = 0; 358 unsigned width2 = 0; 359 for(i; map_cnt) { 360 const char * _; 361 width1 += read_width(maps[i].raw->range, strlen(maps[i].raw->range), &_); 362 width2 += maps[i].raw->width; 363 } 364 verify(width1 == cpus); 365 verify(width2 == cpus); 366 } 367 #endif 351 /* paranoid */ verify((map_cnt * raw[0][cache_levels - llc].width) == cpus); 368 352 369 353 // Get mappings from cpu to cache instance … … 373 357 qsort(pairings, cpus); 374 358 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 390 362 struct cpu_map_entry_t * entries = alloc(cpus); 391 363 for(i; cpus) { entries[i].count = 0; } 392 364 for(i; cpus) { 393 /* paranoid */ verify(pairings[i].id < map_cnt);394 365 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; 402 368 } 403 369
Note:
See TracChangeset
for help on using the changeset viewer.