aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2023-04-11 06:19:54 -0700
committerGitHub <noreply@github.com>2023-04-11 15:19:54 +0200
commit2663d2c6784ad7b77998c6874df25648d597f74b (patch)
tree1739feb4d2c189ddb5f04e14a4fb326ec61b0242
parenta0caa34b162449b5c13b8d604573053300ff54a1 (diff)
Windows fixes (#890)
Mostly for msys2 and mingw64 builds, which are different from each other and different from standard Visual Studio builds. Isn't Windows fun? - Define _GNU_SOURCE in more files (it's already used in ggml.c for Linux's sake). - Don't use PrefetchVirtualMemory if not building for Windows 8 or later (mingw64 doesn't by default). But warn the user about this situation since it's probably not intended. - Check for NOMINMAX already being defined, which it is on mingw64. - Actually use the `increment` variable (bug in my `pizza` PR). - Suppress unused variable warnings in the fake pthread_create and pthread_join implementations for Windows. - (not Windows-related) Remove mention of `asprintf` from comment; `asprintf` is no longer used. Fixes #871.
-rw-r--r--examples/main/main.cpp5
-rw-r--r--ggml.c4
-rw-r--r--llama.cpp5
-rwxr-xr-xllama_util.h12
4 files changed, 22 insertions, 4 deletions
diff --git a/examples/main/main.cpp b/examples/main/main.cpp
index d333d0d..bf756c1 100644
--- a/examples/main/main.cpp
+++ b/examples/main/main.cpp
@@ -1,3 +1,8 @@
+// Defines sigaction on msys:
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
#include "common.h"
#include "llama.h"
diff --git a/ggml.c b/ggml.c
index ada3bbb..897b67d 100644
--- a/ggml.c
+++ b/ggml.c
@@ -1,4 +1,4 @@
-// Defines CLOCK_MONOTONIC and asprintf on Linux
+// Defines CLOCK_MONOTONIC on Linux
#define _GNU_SOURCE
#include "ggml.h"
@@ -50,6 +50,7 @@ typedef HANDLE pthread_t;
typedef DWORD thread_ret_t;
static int pthread_create(pthread_t* out, void* unused, thread_ret_t(*func)(void*), void* arg) {
+ (void) unused;
HANDLE handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, arg, 0, NULL);
if (handle == NULL)
{
@@ -61,6 +62,7 @@ static int pthread_create(pthread_t* out, void* unused, thread_ret_t(*func)(void
}
static int pthread_join(pthread_t thread, void* unused) {
+ (void) unused;
return (int) WaitForSingleObject(thread, INFINITE);
}
diff --git a/llama.cpp b/llama.cpp
index 203a1ad..54ba01e 100644
--- a/llama.cpp
+++ b/llama.cpp
@@ -1,3 +1,8 @@
+// Defines fileno on msys:
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
#include "llama_util.h"
#include "llama.h"
#include "llama_internal.h"
diff --git a/llama_util.h b/llama_util.h
index d68f49b..653bf71 100755
--- a/llama_util.h
+++ b/llama_util.h
@@ -26,7 +26,9 @@
#if defined(_WIN32)
#define WIN32_LEAN_AND_MEAN
- #define NOMINMAX
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
#include <windows.h>
#include <io.h>
#include <stdio.h> // for _fseeki64
@@ -209,6 +211,7 @@ struct llama_mmap {
throw format("MapViewOfFile failed: %s", llama_format_win_err(error).c_str());
}
+ #if _WIN32_WINNT >= _WIN32_WINNT_WIN8
// Advise the kernel to preload the mapped memory
WIN32_MEMORY_RANGE_ENTRY range;
range.VirtualAddress = addr;
@@ -217,6 +220,9 @@ struct llama_mmap {
fprintf(stderr, "warning: PrefetchVirtualMemory failed: %s\n",
llama_format_win_err(GetLastError()).c_str());
}
+ #else
+ #pragma message("warning: You are building for pre-Windows 8; prefetch not supported")
+ #endif // _WIN32_WINNT >= _WIN32_WINNT_WIN8
}
~llama_mmap() {
@@ -338,8 +344,8 @@ struct llama_mlock {
// Hopefully a megabyte is enough overhead:
size_t increment = size + 1048576;
// The minimum must be <= the maximum, so we need to increase both:
- min_ws_size += size;
- max_ws_size += size;
+ min_ws_size += increment;
+ max_ws_size += increment;
if (!SetProcessWorkingSetSize(GetCurrentProcess(), min_ws_size, max_ws_size)) {
fprintf(stderr, "warning: SetProcessWorkingSetSize failed: %s\n",
llama_format_win_err(GetLastError()).c_str());