6c5ccb11f9
This refines where we extract the LLM libraries to by adding a new OLLAMA_HOME env var, that defaults to `~/.ollama` The logic was already idempotenent, so this should speed up startups after the first time a new release is deployed. It also cleans up after itself. We now build only a single ROCm version (latest major) on both windows and linux. Given the large size of ROCms tensor files, we split the dependency out. It's bundled into the installer on windows, and a separate download on windows. The linux install script is now smart and detects the presence of AMD GPUs and looks to see if rocm v6 is already present, and if not, then downloads our dependency tar file. For Linux discovery, we now use sysfs and check each GPU against what ROCm supports so we can degrade to CPU gracefully instead of having llama.cpp+rocm assert/crash on us. For Windows, we now use go's windows dynamic library loading logic to access the amdhip64.dll APIs to query the GPU information.
58 lines
No EOL
1.4 KiB
C
58 lines
No EOL
1.4 KiB
C
#ifndef __APPLE__
|
|
#ifndef __GPU_INFO_H__
|
|
#define __GPU_INFO_H__
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#ifndef _WIN32
|
|
#include <dlfcn.h>
|
|
#define LOAD_LIBRARY(lib, flags) dlopen(lib, flags)
|
|
#define LOAD_SYMBOL(handle, sym) dlsym(handle, sym)
|
|
#define LOAD_ERR() strdup(dlerror())
|
|
#define UNLOAD_LIBRARY(handle) dlclose(handle)
|
|
#else
|
|
#include <windows.h>
|
|
#define LOAD_LIBRARY(lib, flags) LoadLibrary(lib)
|
|
#define LOAD_SYMBOL(handle, sym) GetProcAddress(handle, sym)
|
|
#define UNLOAD_LIBRARY(handle) FreeLibrary(handle)
|
|
#define LOAD_ERR() ({\
|
|
LPSTR messageBuffer = NULL; \
|
|
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
|
|
NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL); \
|
|
char *resp = strdup(messageBuffer); \
|
|
LocalFree(messageBuffer); \
|
|
resp; \
|
|
})
|
|
|
|
#endif
|
|
|
|
#define LOG(verbose, ...) \
|
|
do { \
|
|
if (verbose) { \
|
|
fprintf(stderr, __VA_ARGS__); \
|
|
} \
|
|
} while (0)
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct mem_info {
|
|
uint64_t total;
|
|
uint64_t free;
|
|
unsigned int count;
|
|
int igpu_index; // If >= 0, we detected an integrated GPU to ignore
|
|
char *err; // If non-nill, caller responsible for freeing
|
|
} mem_info_t;
|
|
|
|
void cpu_check_ram(mem_info_t *resp);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#include "gpu_info_cuda.h"
|
|
|
|
#endif // __GPU_INFO_H__
|
|
#endif // __APPLE__
|