Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

reset! causes incorrect scaling for Stats #54

Open
topolarity opened this issue Dec 20, 2024 · 1 comment
Open

reset! causes incorrect scaling for Stats #54

topolarity opened this issue Dec 20, 2024 · 1 comment

Comments

@topolarity
Copy link
Member

julia> bench = LinuxPerf.make_bench();
julia> enable!(bench); sleep(1.0); disable!(bench);
julia> stats = LinuxPerf.ThreadStats(bench);
julia> stats.groups[1][1]
LinuxPerf.Counter(hw:cycles, 0x0000000001bdc0f6, 0x0000000000a08a80, 0x00000000007a6ed7)

julia> reset!(bench)
julia> stats = LinuxPerf.ThreadStats(bench);
julia> stats.groups[1][1]
LinuxPerf.Counter(hw:cycles, 0x0000000000000000, 0x0000000003dad501, 0x00000000026bd3ce)

Notice that IOC_RESET resets the value of the counter, but doesn't affect time_enabled or time_running

It's hard to say what the correct behavior is here, but this means that the Counter object is no longer valid because its running / enabled ratio is not what it thinks it is:

julia> stats
╶ cpu-cycles               0.00e+00   76.3%  #  0.0 cycles per ns
┌ cache-references         0.00e+00   62.0%
└ cache-misses             0.00e+00   62.0%  #  NaN% of cache refs
┌ branch-instructions      0.00e+00   61.8%  #  NaN% of insns
│ branch-misses            0.00e+00   61.8%  #  NaN% of branch insns
└ instructions             0.00e+00   61.8%  #  NaN insns per cycle
┌ context-switches         0.00e+00  100.0%
│ page-faults              0.00e+00  100.0%
│ minor-faults             0.00e+00  100.0%
│ major-faults             0.00e+00  100.0%
└ cpu-migrations           0.00e+00  100.0%

If you try to reset in a loop, this means you end up scaling the measurement by its average running time instead of its true running time for the latest sample.

@Zentrik
Copy link
Collaborator

Zentrik commented Dec 20, 2024

Looks like we can't change this behaviour and the package only uses it to reset the counter,

PERF_EVENT_IOC_RESET
              Reset the event count specified by the file descriptor
              argument to zero.  This resets only the counts; there is
              no way to reset the multiplexing time_enabled or
              time_running values.

I am slightly concerned that we use this right after opening an event, does the counter not start at 0? If not, is the same true for the time running and time enabled fields.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants