40 static void* numa_lib;
44 typedef int tnuma_available(
void);
45 typedef int tnuma_max_node(
void);
46 typedef int tnuma_node_to_cpus(
int node,
struct bitmask*
mask);
47 typedef long tnuma_node_size(
int node,
long* freep);
48 typedef int tnuma_run_on_node(
int node);
49 typedef void* tnuma_alloc_onnode(
size_t size,
int node);
50 typedef void* tnuma_alloc_local(
size_t size);
51 typedef void tnuma_free(
void* start,
size_t size);
52 typedef struct bitmask* tnuma_bitmask_clearall(
struct bitmask *bitmask);
53 typedef int tnuma_bitmask_isbitset(
const struct bitmask *bitmask,
55 typedef struct bitmask* tnuma_bitmask_setbit(
struct bitmask *bitmask,
57 typedef unsigned int tnuma_bitmask_nbytes(
struct bitmask *bitmask);
58 typedef void tnuma_bitmask_free(
struct bitmask *bitmask);
59 typedef struct bitmask* tnuma_allocate_cpumask(
void);
60 typedef struct bitmask* tnuma_allocate_nodemask(
void);
61 typedef void tnuma_free_cpumask(
struct bitmask* bitmask);
62 typedef void tnuma_free_nodemask(
struct bitmask* bitmask);
63 typedef int tnuma_run_on_node_mask(
struct bitmask *nodemask);
64 typedef int tnuma_run_on_node_mask_all(
struct bitmask *nodemask);
65 typedef struct bitmask *tnuma_get_run_node_mask(
void);
66 typedef void tnuma_set_interleave_mask(
struct bitmask *nodemask);
67 typedef void tnuma_set_localalloc(
void);
70 static tnuma_available* numa_available;
71 static tnuma_max_node* numa_max_node;
72 static tnuma_node_to_cpus* numa_node_to_cpus;
73 static tnuma_node_size* numa_node_size;
74 static tnuma_run_on_node* numa_run_on_node;
75 static tnuma_alloc_onnode* numa_alloc_onnode;
76 static tnuma_alloc_local* numa_alloc_local;
77 static tnuma_free* numa_free;
78 static tnuma_bitmask_clearall* numa_bitmask_clearall;
79 static tnuma_bitmask_isbitset* numa_bitmask_isbitset;
80 static tnuma_bitmask_setbit* numa_bitmask_setbit;
81 static tnuma_bitmask_nbytes* numa_bitmask_nbytes;
82 static tnuma_bitmask_free* numa_bitmask_free;
83 static tnuma_allocate_cpumask* numa_allocate_cpumask;
84 static tnuma_allocate_nodemask* numa_allocate_nodemask;
85 static tnuma_free_nodemask* numa_free_nodemask;
86 static tnuma_free_cpumask* numa_free_cpumask;
87 static tnuma_run_on_node_mask* numa_run_on_node_mask;
88 static tnuma_run_on_node_mask_all* numa_run_on_node_mask_all;
89 static tnuma_get_run_node_mask* numa_get_run_node_mask;
90 static tnuma_set_interleave_mask* numa_set_interleave_mask;
91 static tnuma_set_localalloc* numa_set_localalloc;
93 static void* findLibrary(
const char** paths) {
95 while (paths[i] !=
NULL) {
96 void*
lib = dlopen(paths[i], RTLD_LAZY);
105 static void numaExit(
void) {
106 if (numa_lib ==
NULL) {
122 const char* numa_paths[] = {
127 const int error = atexit(numaExit);
133 numa_lib = findLibrary(numa_paths);
134 if (numa_lib ==
NULL) {
140 #define _LIBRARY_FIND(lib, name) \
142 name = (t##name *)dlsym(lib, #name); \
144 #define NUMA_LIBRARY_FIND(name) _LIBRARY_FIND(numa_lib, name)
146 NUMA_LIBRARY_FIND(numa_available);
147 NUMA_LIBRARY_FIND(numa_max_node);
148 NUMA_LIBRARY_FIND(numa_node_to_cpus);
149 NUMA_LIBRARY_FIND(numa_node_size);
150 NUMA_LIBRARY_FIND(numa_run_on_node);
151 NUMA_LIBRARY_FIND(numa_alloc_onnode);
152 NUMA_LIBRARY_FIND(numa_alloc_local);
153 NUMA_LIBRARY_FIND(numa_free);
154 NUMA_LIBRARY_FIND(numa_bitmask_clearall);
155 NUMA_LIBRARY_FIND(numa_bitmask_isbitset);
156 NUMA_LIBRARY_FIND(numa_bitmask_setbit);
157 NUMA_LIBRARY_FIND(numa_bitmask_nbytes);
158 NUMA_LIBRARY_FIND(numa_bitmask_free);
159 NUMA_LIBRARY_FIND(numa_allocate_cpumask);
160 NUMA_LIBRARY_FIND(numa_allocate_nodemask);
161 NUMA_LIBRARY_FIND(numa_free_cpumask);
162 NUMA_LIBRARY_FIND(numa_free_nodemask);
163 NUMA_LIBRARY_FIND(numa_run_on_node_mask);
164 NUMA_LIBRARY_FIND(numa_run_on_node_mask_all);
165 NUMA_LIBRARY_FIND(numa_get_run_node_mask);
166 NUMA_LIBRARY_FIND(numa_set_interleave_mask);
167 NUMA_LIBRARY_FIND(numa_set_localalloc);
169 #undef NUMA_LIBRARY_FIND
187 if (numa_available() < 0) {
197 return numa_max_node() + 1;
205 struct bitmask* cpu_mask = numa_allocate_cpumask();
206 numa_node_to_cpus(
node, cpu_mask);
207 const unsigned int num_bytes = numa_bitmask_nbytes(cpu_mask);
208 const unsigned int num_bits = num_bytes * 8;
210 int num_processors = 0;
211 for (
unsigned int bit = 0; bit < num_bits; ++bit) {
212 if (numa_bitmask_isbitset(cpu_mask, bit)) {
217 if (numa_free_cpumask !=
NULL) {
218 numa_free_cpumask(cpu_mask);
220 numa_bitmask_free(cpu_mask);
223 numa_free_cpumask(cpu_mask);
225 return num_processors;
232 struct bitmask* node_mask = numa_get_run_node_mask();
233 const unsigned int num_bytes = numa_bitmask_nbytes(node_mask);
234 const unsigned int num_bits = num_bytes * 8;
235 int num_processors = 0;
236 for (
unsigned int bit = 0; bit < num_bits; ++bit) {
237 if (numa_bitmask_isbitset(node_mask, bit)) {
241 numa_bitmask_free(node_mask);
242 return num_processors;
255 struct bitmask* node_mask = numa_allocate_nodemask();
256 numa_bitmask_clearall(node_mask);
257 numa_bitmask_setbit(node_mask,
node);
258 numa_run_on_node_mask_all(node_mask);
263 if (numa_node_size(
node,
NULL) > 0) {
264 numa_set_interleave_mask(node_mask);
265 numa_set_localalloc();
268 if (numa_free_nodemask !=
NULL) {
269 numa_free_nodemask(node_mask);
271 numa_bitmask_free(node_mask);
274 numa_free_nodemask(node_mask);
283 return numa_alloc_onnode(
size,
node);
287 return numa_alloc_local(
size);
291 numa_free(start,
size);
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static void error(const char *str)
bool numaAPI_IsNodeAvailable(int node)
bool numaAPI_RunProcessOnNode(int node)
void * numaAPI_AllocateOnNode(size_t size, int node)
NUMAAPI_Result numaAPI_Initialize(void)
void * numaAPI_AllocateLocal(size_t size)
void numaAPI_Free(void *start, size_t size)
int numaAPI_GetNumCurrentNodesProcessors(void)
int numaAPI_GetNumNodeProcessors(int node)
int numaAPI_GetNumNodes(void)
bool numaAPI_RunThreadOnNode(int node)
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)