aboutsummaryrefslogtreecommitdiff
path: root/ggml.c
diff options
context:
space:
mode:
authorgrahameth <96447521+grahameth@users.noreply.github.com>2023-06-05 22:11:49 +0200
committerGitHub <noreply@github.com>2023-06-05 23:11:49 +0300
commitefe05076323f5c6bafece109e21cce046f5e4b07 (patch)
treed5ce20c8da7ef23d3c1a350db0001fdaee1ab578 /ggml.c
parente7fe66e670537990ccc075cce9286df88bba052a (diff)
ggml : fix internal overflow in ggml_time_us on Windows (#1702)
Co-authored-by: grahameth <->
Diffstat (limited to 'ggml.c')
-rw-r--r--ggml.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/ggml.c b/ggml.c
index 7f9bff9..24f0d2f 100644
--- a/ggml.c
+++ b/ggml.c
@@ -404,21 +404,27 @@ void ggml_fp32_to_fp16_row(const float * x, ggml_fp16_t * y, size_t n) {
//
#if defined(_MSC_VER) || defined(__MINGW32__)
-static int64_t timer_freq;
+static int64_t timer_freq, timer_start;
void ggml_time_init(void) {
- LARGE_INTEGER frequency;
- QueryPerformanceFrequency(&frequency);
- timer_freq = frequency.QuadPart;
+ LARGE_INTEGER t;
+ QueryPerformanceFrequency(&t);
+ timer_freq = t.QuadPart;
+
+ // The multiplication by 1000 or 1000000 below can cause an overflow if timer_freq
+ // and the uptime is high enough.
+ // We subtract the program start time to reduce the likelihood of that happening.
+ QueryPerformanceCounter(&t);
+ timer_start = t.QuadPart;
}
int64_t ggml_time_ms(void) {
LARGE_INTEGER t;
QueryPerformanceCounter(&t);
- return (t.QuadPart * 1000) / timer_freq;
+ return ((t.QuadPart-timer_start) * 1000) / timer_freq;
}
int64_t ggml_time_us(void) {
LARGE_INTEGER t;
QueryPerformanceCounter(&t);
- return (t.QuadPart * 1000000) / timer_freq;
+ return ((t.QuadPart-timer_start) * 1000000) / timer_freq;
}
#else
void ggml_time_init(void) {}