mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-12-25 22:08:46 +01:00
ggml : android and old glibc NUMA incompatibility bugfixes (#5557)
* #ifdef out some code NUMA blocks for Android due to lack of support * added in some __ANDROID__ if def gates around numa code and forced GLIBC prior to 2.29 to use a syscall for getcpu instead of the wrapper * Changed gates on numa platform specific stuff to __gnu_linux__ to skip any platforms without glibc * harmonizing #if defined blocks for numa code to __gnu_linux__ since that's the only model that's being followed anyways --------- Co-authored-by: root <root@nenya.lothlorien.ca>
This commit is contained in:
parent
a0c2dad9d4
commit
f0d1fafc02
19
ggml.c
19
ggml.c
@ -23,6 +23,9 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#if defined(__gnu_linux__)
|
||||||
|
#include <syscall.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef GGML_USE_METAL
|
#ifdef GGML_USE_METAL
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -1971,7 +1974,7 @@ struct ggml_numa_nodes {
|
|||||||
uint32_t n_nodes;
|
uint32_t n_nodes;
|
||||||
uint32_t total_cpus; // hardware threads on system
|
uint32_t total_cpus; // hardware threads on system
|
||||||
uint32_t current_node; // node on which main process is execting
|
uint32_t current_node; // node on which main process is execting
|
||||||
#ifdef __linux__
|
#if defined(__gnu_linux__)
|
||||||
cpu_set_t cpuset; // cpuset from numactl
|
cpu_set_t cpuset; // cpuset from numactl
|
||||||
#else
|
#else
|
||||||
uint32_t cpuset; // no NUMA support outside of Linux at this time. Use a portable datatype
|
uint32_t cpuset; // no NUMA support outside of Linux at this time. Use a portable datatype
|
||||||
@ -2009,7 +2012,7 @@ inline static void ggml_critical_section_end(void) {
|
|||||||
atomic_fetch_sub(&g_state_barrier, 1);
|
atomic_fetch_sub(&g_state_barrier, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#if defined(__gnu_linux__)
|
||||||
static cpu_set_t ggml_get_numa_affinity(void) {
|
static cpu_set_t ggml_get_numa_affinity(void) {
|
||||||
cpu_set_t cpuset;
|
cpu_set_t cpuset;
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
@ -2031,7 +2034,7 @@ void ggml_numa_init(enum ggml_numa_strategy numa_flag) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#if defined(__gnu_linux__)
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char path[256];
|
char path[256];
|
||||||
int rv;
|
int rv;
|
||||||
@ -2063,7 +2066,13 @@ void ggml_numa_init(enum ggml_numa_strategy numa_flag) {
|
|||||||
|
|
||||||
// figure out which node we're on
|
// figure out which node we're on
|
||||||
uint current_cpu;
|
uint current_cpu;
|
||||||
int getcpu_ret = getcpu(¤t_cpu, &g_state.numa.current_node);
|
int getcpu_ret = 0;
|
||||||
|
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 28)
|
||||||
|
getcpu_ret = getcpu(¤t_cpu, &g_state.numa.current_node);
|
||||||
|
#else
|
||||||
|
// old glibc doesn't have a wrapper for this call. Fall back on direct syscall
|
||||||
|
getcpu_ret = syscall(SYS_getcpu,¤t_cpu,&g_state.numa.current_node);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (g_state.numa.n_nodes < 1 || g_state.numa.total_cpus < 1 || getcpu_ret != 0) {
|
if (g_state.numa.n_nodes < 1 || g_state.numa.total_cpus < 1 || getcpu_ret != 0) {
|
||||||
g_state.numa.n_nodes = 0;
|
g_state.numa.n_nodes = 0;
|
||||||
@ -16734,7 +16743,7 @@ typedef pthread_t ggml_thread_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Android's libc implementation "bionic" does not support setting affinity
|
// Android's libc implementation "bionic" does not support setting affinity
|
||||||
#if defined(__linux__) && !defined(__BIONIC__)
|
#if defined(__gnu_linux__)
|
||||||
static void set_numa_thread_affinity(int thread_n) {
|
static void set_numa_thread_affinity(int thread_n) {
|
||||||
if (!ggml_is_numa()) {
|
if (!ggml_is_numa()) {
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user