ggml: Fix internal overflow in ggml_time_us on Windows

This commit is contained in:
grahameth 2023-06-05 16:43:22 +02:00
parent 5220a991a5
commit 9caca8d11f

18
ggml.c
View file

@ -403,21 +403,27 @@ void ggml_fp32_to_fp16_row(const float * x, ggml_fp16_t * y, size_t n) {
// //
#if defined(_MSC_VER) || defined(__MINGW32__) #if defined(_MSC_VER) || defined(__MINGW32__)
static int64_t timer_freq; static int64_t timer_freq, timer_start;
void ggml_time_init(void) { void ggml_time_init(void) {
LARGE_INTEGER frequency; LARGE_INTEGER t;
QueryPerformanceFrequency(&frequency); QueryPerformanceFrequency(&t);
timer_freq = frequency.QuadPart; 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) { int64_t ggml_time_ms(void) {
LARGE_INTEGER t; LARGE_INTEGER t;
QueryPerformanceCounter(&t); QueryPerformanceCounter(&t);
return (t.QuadPart * 1000) / timer_freq; return ((t.QuadPart-timer_start) * 1000) / timer_freq;
} }
int64_t ggml_time_us(void) { int64_t ggml_time_us(void) {
LARGE_INTEGER t; LARGE_INTEGER t;
QueryPerformanceCounter(&t); QueryPerformanceCounter(&t);
return (t.QuadPart * 1000000) / timer_freq; return ((t.QuadPart-timer_start) * 1000000) / timer_freq;
} }
#else #else
void ggml_time_init(void) {} void ggml_time_init(void) {}