|
|
@@ -611,20 +611,25 @@ struct llama_mmap {
|
|
|
throw std::runtime_error(format("MapViewOfFile failed: %s", llama_format_win_err(error).c_str()));
|
|
|
}
|
|
|
|
|
|
- #if _WIN32_WINNT >= _WIN32_WINNT_WIN8
|
|
|
if (prefetch) {
|
|
|
- // Advise the kernel to preload the mapped memory
|
|
|
- WIN32_MEMORY_RANGE_ENTRY range;
|
|
|
- range.VirtualAddress = addr;
|
|
|
- range.NumberOfBytes = (SIZE_T)size;
|
|
|
- if (!PrefetchVirtualMemory(GetCurrentProcess(), 1, &range, 0)) {
|
|
|
- fprintf(stderr, "warning: PrefetchVirtualMemory failed: %s\n",
|
|
|
- llama_format_win_err(GetLastError()).c_str());
|
|
|
+ // PrefetchVirtualMemory is only present on Windows 8 and above, so we dynamically load it
|
|
|
+ BOOL (WINAPI *pPrefetchVirtualMemory) (HANDLE, ULONG_PTR, PWIN32_MEMORY_RANGE_ENTRY, ULONG);
|
|
|
+ HMODULE hKernel32 = GetModuleHandleW(L"kernel32.dll");
|
|
|
+
|
|
|
+ // may fail on pre-Windows 8 systems
|
|
|
+ pPrefetchVirtualMemory = reinterpret_cast<decltype(pPrefetchVirtualMemory)> (GetProcAddress(hKernel32, "PrefetchVirtualMemory"));
|
|
|
+
|
|
|
+ if (pPrefetchVirtualMemory) {
|
|
|
+ // advise the kernel to preload the mapped memory
|
|
|
+ WIN32_MEMORY_RANGE_ENTRY range;
|
|
|
+ range.VirtualAddress = addr;
|
|
|
+ range.NumberOfBytes = (SIZE_T)size;
|
|
|
+ if (!pPrefetchVirtualMemory(GetCurrentProcess(), 1, &range, 0)) {
|
|
|
+ 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() {
|