Open MPI logo

Portable Hardware Locality (hwloc) Documentation: v1.11.13

  |   Home   |   Support   |   FAQ   |  
nvml.h
1 /*
2  * Copyright © 2012-2016 Inria. All rights reserved.
3  * See COPYING in top-level directory.
4  */
5 
13 #ifndef HWLOC_NVML_H
14 #define HWLOC_NVML_H
15 
16 #include <hwloc.h>
17 #include <hwloc/autogen/config.h>
18 #include <hwloc/helper.h>
19 #ifdef HWLOC_LINUX_SYS
20 #include <hwloc/linux.h>
21 #endif
22 
23 #include <nvml.h>
24 
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 
55 static __hwloc_inline int
56 hwloc_nvml_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
57  nvmlDevice_t device, hwloc_cpuset_t set)
58 {
59 #ifdef HWLOC_LINUX_SYS
60  /* If we're on Linux, use the sysfs mechanism to get the local cpus */
61 #define HWLOC_NVML_DEVICE_SYSFS_PATH_MAX 128
62  char path[HWLOC_NVML_DEVICE_SYSFS_PATH_MAX];
63  FILE *sysfile = NULL;
64  nvmlReturn_t nvres;
65  nvmlPciInfo_t pci;
66 
67  if (!hwloc_topology_is_thissystem(topology)) {
68  errno = EINVAL;
69  return -1;
70  }
71 
72  nvres = nvmlDeviceGetPciInfo(device, &pci);
73  if (NVML_SUCCESS != nvres) {
74  errno = EINVAL;
75  return -1;
76  }
77 
78  sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", pci.domain, pci.bus, pci.device);
79  sysfile = fopen(path, "r");
80  if (!sysfile)
81  return -1;
82 
83  if (hwloc_linux_parse_cpumap_file(sysfile, set) < 0
84  || hwloc_bitmap_iszero(set))
86 
87  fclose(sysfile);
88 #else
89  /* Non-Linux systems simply get a full cpuset */
91 #endif
92  return 0;
93 }
94 
108 static __hwloc_inline hwloc_obj_t
110 {
111  hwloc_obj_t osdev = NULL;
112  while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
113  if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type
114  && osdev->name
115  && !strncmp("nvml", osdev->name, 4)
116  && atoi(osdev->name + 4) == (int) idx)
117  return osdev;
118  }
119  return NULL;
120 }
121 
135 static __hwloc_inline hwloc_obj_t
136 hwloc_nvml_get_device_osdev(hwloc_topology_t topology, nvmlDevice_t device)
137 {
138  hwloc_obj_t osdev;
139  nvmlReturn_t nvres;
140  nvmlPciInfo_t pci;
141 
142  if (!hwloc_topology_is_thissystem(topology)) {
143  errno = EINVAL;
144  return NULL;
145  }
146 
147  nvres = nvmlDeviceGetPciInfo(device, &pci);
148  if (NVML_SUCCESS != nvres)
149  return NULL;
150 
151  osdev = NULL;
152  while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
153  hwloc_obj_t pcidev = osdev->parent;
154  if (strncmp(osdev->name, "nvml", 4))
155  continue;
156  if (pcidev
157  && pcidev->type == HWLOC_OBJ_PCI_DEVICE
158  && pcidev->attr->pcidev.domain == pci.domain
159  && pcidev->attr->pcidev.bus == pci.bus
160  && pcidev->attr->pcidev.dev == pci.device
161  && pcidev->attr->pcidev.func == 0)
162  return osdev;
163  }
164 
165  return NULL;
166 }
167 
171 #ifdef __cplusplus
172 } /* extern "C" */
173 #endif
174 
175 
176 #endif /* HWLOC_NVML_H */
unsigned char bus
Definition: hwloc.h:544
int hwloc_linux_parse_cpumap_file(FILE *file, hwloc_cpuset_t set)
Convert a linux kernel cpumap file file into hwloc CPU set.
unsigned char dev
Definition: hwloc.h:544
Operating system GPU device. For instance ":0.0" for a GL display, "card0" for a Linux DRM device...
Definition: hwloc.h:287
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition: hwloc.h:366
static hwloc_obj_t hwloc_get_next_osdev(hwloc_topology_t topology, hwloc_obj_t prev)
Get the next OS device in the system.
Definition: helper.h:1252
void hwloc_bitmap_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src)
Copy the contents of bitmap src into the already allocated bitmap dst.
unsigned char func
Definition: hwloc.h:544
static hwloc_obj_t hwloc_nvml_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
Get the hwloc OS device object corresponding to the NVML device whose index is idx.
Definition: nvml.h:109
unsigned short domain
Definition: hwloc.h:543
struct hwloc_obj * parent
Parent, NULL if root (system object)
Definition: hwloc.h:403
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition: hwloc.h:373
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev
hwloc_obj_type_t type
Type of object.
Definition: hwloc.h:360
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
Structure of a topology object.
Definition: hwloc.h:358
hwloc_bitmap_t hwloc_cpuset_t
A CPU set is a bitmap whose bits are set according to CPU physical OS indexes.
Definition: hwloc.h:132
static int hwloc_nvml_get_device_cpuset(hwloc_topology_t topology, nvmlDevice_t device, hwloc_cpuset_t set)
Get the CPU set of logical processors that are physically close to NVML device device.
Definition: nvml.h:56
hwloc_obj_osdev_type_t type
Definition: hwloc.h:567
static hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
Definition: helper.h:803
static hwloc_obj_t hwloc_nvml_get_device_osdev(hwloc_topology_t topology, nvmlDevice_t device)
Get the hwloc OS device object corresponding to NVML device device.
Definition: nvml.h:136
int hwloc_topology_is_thissystem(hwloc_topology_t restrict topology)
Does the topology context come from this system?
PCI device. These objects have neither CPU sets nor node sets. They are not added to the topology unl...
Definition: hwloc.h:246
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition: hwloc.h:633