Skip to content

Conversation

grahameth
Copy link
Contributor

The implementation of ggml_time_us() on Windows can realistically overflow and produce wrong data (It happened to me and messed up a bunch of benchmark results).

With a timer frequency of 10,000,000 ticks per second (which I have on my machine) the internal result of the multiplication (t.QuadPart * 1000000) overflows the 63 bits after 2^63 / 1000000 / 10000000 seconds. That's about 10.5 days. Because that product is then divided by the timer frequency, the upper bits are essentially lost and the calculated timings from using this function will be wrong.

This PR changes the code so that the startup time is subtracted. That means it won't overflow when the uptime of the OS crosses these 10 day, but only when the process runs longer than 10 days.

Ideally, you'd want to use something like MulDiv for 64-bits to prevent the overflow entirely, but I couldn't find a simple implementation for that.

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

Successfully merging this pull request may close these issues.

2 participants