Open JiakunYan opened 1 year ago
The APEX Idle
timer is not a rate or percentage, it is an accumulated time. I recently reformatted the output and did not align those columns in the right place to line up with the other timers, sorry for the confusion.
A few other observations:
Total processes detected: 32
HW Threads detected on rank 0: 128
Worker Threads observed on rank 0: 128
Available CPU time on rank 0: 2166.28 seconds
Available CPU time on all ranks: 69321 seconds
What this part of the report is telling you is that you are using 128 threads per process, and 32 total processes. That's fine, but you're likely using hyper threading which may or may not be more efficient than running without hyper threading.
The timer report is aggregated and averaged across all ranks. The total main time represents all time from when rank 0 started until it ended, and APEX assumes all processes had the same lifetime.
If you want the data from all ranks and you are using apex_exec
, you can add the --apex:csv
flag. If you are not using apex_exec
, set the environment variable export APEX_CSV_OUTPUT=1
before running. Then you will get a file called apex_profiles.csv which contains all the performance data from all ranks. You can post-process that data with the apex-summary.py
python script.
The APEX Idle timer is not a rate or percentage, it is an accumulated time.
I understood. I was referring to the percentage after the idle rate number 99.1%
. I am quite sure this percentage is not correct, since if I run it with only one rank, I can get a percentage of 20%~30%
, and the application scales well to 32 ranks.
but you're likely using hyper threading which may or may not be more efficient than running without hyper threading.
Actually, the compute nodes I used has 128 cores, so I was not using hyper-threading.
The timer report is aggregated and averaged across all ranks.
Could you point me to the code that does this? I failed to find any communication across ranks.
If you want the data from all ranks and you are using apex_exec, you can add the --apex:csv flag. If you are not using apex_exec, set the environment variable export APEX_CSV_OUTPUT=1 before running. Then you will get a file called apex_profiles.csv which contains all the performance data from all ranks. You can post-process that data with the apex-summary.py python script.
Thanks! This is very helpful!
see https://github.com/UO-OACISS/apex/blob/develop/src/apex/profile_reducer.cpp for the profile reduction routines...
I should mention that the data reduction will only work if HPX is using the MPI parcel port. I haven't added support for other HPX parcel ports (TCP, libfabric, etc)
I should mention that the data reduction will only work if HPX is using the MPI parcel port. I haven't added support for other HPX parcel ports (TCP, libfabric, etc)
Make sense! Since I was not using the MPI parcelport...
Thank you so much!
Just curious: in the reduce_profiles_for_screen
function, is there any reason APEX doesn't choose to initialize MPI when it finds MPI is not initialized? I have both MPI and LCI parcelport compiled into HPX, so it should be able to work if APEX calls MPI_Init.
I am running Octotiger + HPX + APEX with 32 ranks, and I found the idle rate is unreasonably high. Here is the output:
The idle rate is
99.1%
.After looking at the code of APEX, I found the following lines:
I don't understand why APEX chooses to multiply the
total_main
with rank num. I didn't find any evidence that APEX aggregates timers across ranks, does it?Another quick question: is there a way to get the report from all HPX ranks, instead of just rank 0?