hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Info;Time/CPU Cycles;Processor"3class CCPURep4{5 Bool mp_start,mp_end;6 I64 mp_not_done_flags,7 **swaps,8 **cycles;9};10 11U0 MPCPURep(CCPURep *cr)12{13 I64 swaps=0,cycles_0,cycles_f;14 while (!cr->mp_start)15 Yield;16 cycles_0=GetTSC;17 while (!cr->mp_end) {18 swaps++;19 Yield;20 }21 cycles_f=GetTSC;22 cr->swaps[Gs->num]=swaps;23 cr->cycles[Gs->num]=cycles_f-cycles_0;24 LBtr(&cr->mp_not_done_flags,Gs->num);25}26 27public U0 CPURep(Bool full=FALSE)28{//Report number of cores and clock freq.29 I64 i,total_swaps,total_cycles;30 F64 t0,tf;31 CCPURep cr;32 33 if (!full)34 "%03X Cores %6h?nHz\n",mp_cnt,ToF64(cnts.time_stamp_freq);35 else {36 cr.swaps=CAlloc(sizeof(I64)*mp_cnt);37 cr.cycles=CAlloc(sizeof(I64)*mp_cnt);38 cr.mp_start=cr.mp_end=FALSE;39 cr.mp_not_done_flags=1<<mp_cnt-1;40 for (i=0;i<mp_cnt;i++)41 Spawn(&MPCPURep,&cr,NULL,i);42 43 t0=tS;44 cr.mp_start=TRUE;45 Sleep(2000);46 cr.mp_end=TRUE;47 while (cr.mp_not_done_flags)48 Yield;49 tf=tS;50 51 "\n%03X Cores %6h?nHz\n",mp_cnt,ToF64(cnts.time_stamp_freq);52 "\n Context\n"53 "CPU Swaps/s Cycles\n"54 "--- ------------- -----------------\n";55 total_swaps=0;56 total_cycles=0;57 for (i=0;i<mp_cnt;i++) {58 " %02X %13,d %17,d\n",i,59 ToI64(cr.swaps[i]/(tf-t0)),ToI64(cr.cycles[i]/(tf-t0));60 total_swaps+=cr.swaps[i];61 total_cycles+=cr.cycles[i];62 }63 "--- ------------- -----------------\n";64 "%03X %13,d %17,d\n",i,65 ToI64(total_swaps/(tf-t0)),ToI64(total_cycles/(tf-t0));66 "Avg %13,d %17,d\n\n",67 ToI64(total_swaps/(tf-t0)/i),ToI64(total_cycles/(tf-t0)/i);68 "Avg Cycles/Swap: %12.6f\n",ToF64(total_cycles)/total_swaps;69 "Avg Time/Swap : %12.6fns\n\n",(tf-t0)*1000000000.0*i/total_swaps;70 Free(cr.swaps);71 Free(cr.cycles);72 }73}74 