Changeset cf85f96 for libcfa/src/device
- Timestamp:
- Jun 17, 2021, 10:31:39 PM (4 years ago)
- Branches:
- ADT, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- df7597e0
- Parents:
- 12daa43
- Location:
- libcfa/src/device
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/device/cpu.cfa
r12daa43 rcf85f96 256 256 } 257 257 258 struct llc_map_t { 259 raw_cache_instance * raw; 260 unsigned count; 261 unsigned start; 262 }; 263 258 264 // returns an allocate list of all the different distinct last level caches 259 static [* idx_range_t, size_t cnt] distinct_llcs(unsigned cpus, unsigned llc_idx, raw_cache_instance ** raw) {265 static [*llc_map_t, size_t cnt] distinct_llcs(unsigned cpus, unsigned llc_idx, raw_cache_instance ** raw) { 260 266 // Allocate at least one element 261 idx_range_t* ranges = alloc();267 llc_map_t* ranges = alloc(); 262 268 size_t range_cnt = 1; 263 269 264 270 // Initialize with element 0 265 *ranges = raw[0][llc_idx].range; 271 ranges->raw = &raw[0][llc_idx]; 272 ranges->count = 0; 273 ranges->start = -1u; 266 274 267 275 // Go over all other cpus 268 276 CPU_LOOP: for(i; 1~cpus) { 269 277 // Check if the range is already there 270 idx_range_t candidate = raw[i][llc_idx].range;278 raw_cache_instance * candidate = &raw[i][llc_idx]; 271 279 for(j; range_cnt) { 272 idx_range_texist = ranges[j];280 llc_map_t & exist = ranges[j]; 273 281 // If the range is already there just jump to the next cpu 274 if(0 == strcmp(candidate , exist)) continue CPU_LOOP;282 if(0 == strcmp(candidate->range, exist.raw->range)) continue CPU_LOOP; 275 283 } 276 284 277 285 // The range wasn't there, added to the list 278 286 ranges = alloc(range_cnt + 1, ranges`realloc); 279 ranges[range_cnt] = candidate; 287 ranges[range_cnt].raw = candidate; 288 ranges[range_cnt].count = 0; 289 ranges[range_cnt].start = -1u; 280 290 range_cnt++; 281 291 } … … 287 297 struct cpu_pairing_t { 288 298 unsigned cpu; 289 unsigned llc_id;299 unsigned id; 290 300 }; 291 301 292 302 int ?<?( cpu_pairing_t lhs, cpu_pairing_t rhs ) { 293 return lhs. llc_id < rhs.llc_id;294 } 295 296 static [[]cpu_pairing_t] get_cpu_pairings(unsigned cpus, raw_cache_instance ** raw, idx_range_t * maps, size_t map_cnt) {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) { 297 307 cpu_pairing_t * pairings = alloc(cpus); 298 308 … … 301 311 idx_range_t want = raw[i][0].range; 302 312 MAP_LOOP: for(j; map_cnt) { 303 if(0 != strcmp(want, maps[j] )) continue MAP_LOOP;304 305 pairings[i]. llc_id = j;313 if(0 != strcmp(want, maps[j].raw->range)) continue MAP_LOOP; 314 315 pairings[i].id = j; 306 316 continue CPU_LOOP; 307 317 } … … 312 322 return pairings; 313 323 } 324 325 #include <fstream.hfa> 314 326 315 327 extern "C" { … … 336 348 337 349 // Find number of distinct cache instances 338 idx_range_t * maps;350 llc_map_t * maps; 339 351 size_t map_cnt; 340 352 [maps, map_cnt] = distinct_llcs(cpus, cache_levels - llc, raw); 341 353 342 354 #if defined(__CFA_WITH_VERIFY__) 355 // Verify that the caches cover the all the cpus 343 356 { 344 unsigned width = 0; 357 unsigned width1 = 0; 358 unsigned width2 = 0; 345 359 for(i; map_cnt) { 346 360 const char * _; 347 width += read_width(maps[i], strlen(maps[i]), &_); 361 width1 += read_width(maps[i].raw->range, strlen(maps[i].raw->range), &_); 362 width2 += maps[i].raw->width; 348 363 } 349 verify(width == cpus); 364 verify(width1 == cpus); 365 verify(width2 == cpus); 350 366 } 351 367 #endif … … 357 373 qsort(pairings, cpus); 358 374 359 unsigned llc_width = raw[0][cache_levels - llc].width; 360 361 // From the mappins build the actual cpu map we want 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 362 390 struct cpu_map_entry_t * entries = alloc(cpus); 363 391 for(i; cpus) { entries[i].count = 0; } 364 392 for(i; cpus) { 393 /* paranoid */ verify(pairings[i].id < map_cnt); 365 394 unsigned c = pairings[i].cpu; 366 entries[c].start = pairings[i].llc_id * llc_width; 367 entries[c].count = llc_width; 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; 368 402 } 369 403 -
libcfa/src/device/cpu.hfa
r12daa43 rcf85f96 17 17 18 18 struct cpu_map_entry_t { 19 unsigned self; 19 20 unsigned start; 20 21 unsigned count;
Note: See TracChangeset
for help on using the changeset viewer.