#help_index "Info;Time/CPU Cycles;Processor" class CCPURep { Bool mp_start, mp_end; I64 mp_not_done_flags, **swaps, **cycles; }; U0 MPCPURep(CCPURep *cr) { I64 swaps = 0, cycles_0, cycles_f; while (!cr->mp_start) Yield; cycles_0 = TSCGet; while (!cr->mp_end) { swaps++; Yield; } cycles_f = TSCGet; cr->swaps[Gs->num] = swaps; cr->cycles[Gs->num] = cycles_f - cycles_0; LBtr(&cr->mp_not_done_flags, Gs->num); } public U0 CPURep(Bool full=FALSE) {//Report name, number of cores and clock freq. I64 i, total_swaps, total_cycles; F64 t0, tf; CCPURep cr; SysRep(SMBIOSt_PROCESSOR); if (!full) "%03X Active Cores at %6h?nHz\n", mp_count, ToF64(counts.time_stamp_freq); else { cr.swaps = CAlloc(sizeof(I64) * mp_count); cr.cycles = CAlloc(sizeof(I64) * mp_count); cr.mp_start = cr.mp_end = FALSE; cr.mp_not_done_flags = 1 << mp_count - 1; for (i = 0; i < mp_count; i++) Spawn(&MPCPURep, &cr, NULL, i); t0 = tS; cr.mp_start = TRUE; Sleep(2000); cr.mp_end = TRUE; while (cr.mp_not_done_flags) Yield; tf = tS; "\n%03X Cores %6h?nHz\n", mp_count, ToF64(counts.time_stamp_freq); "\n Context\n" "CPU Swaps/s Cycles\n" "--- ------------- -----------------\n"; total_swaps = 0; total_cycles = 0; for (i = 0; i < mp_count; i++) { " %02X %13,d %17,d\n", i, ToI64(cr.swaps[i] / (tf - t0)), ToI64(cr.cycles[i] / (tf - t0)); total_swaps += cr.swaps[i]; total_cycles += cr.cycles[i]; } "--- ------------- -----------------\n"; "%03X %13,d %17,d\n", i, ToI64(total_swaps / (tf - t0)), ToI64(total_cycles / (tf - t0)); "Avg %13,d %17,d\n\n", ToI64(total_swaps / (tf - t0) / i), ToI64(total_cycles / (tf - t0) / i); "Avg Cycles/Swap: %12.6f\n", ToF64(total_cycles) / total_swaps; "Avg Time/Swap : %12.6fns\n\n", (tf - t0) * 1000000000.0 * i / total_swaps; Free(cr.swaps); Free(cr.cycles); } }