mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00: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:
		
							
								
								
									
										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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bmwl
					bmwl