Open MPI logo

Portable Hardware Locality (hwloc) Documentation: v1.9.1

  |   Home   |   Support   |   FAQ   |  
cuda.h
1 /*
2  * Copyright © 2010-2013 Inria. All rights reserved.
3  * Copyright © 2010-2011 Université Bordeaux 1
4  * Copyright © 2011 Cisco Systems, Inc. All rights reserved.
5  * See COPYING in top-level directory.
6  */
7 
16 #ifndef HWLOC_CUDA_H
17 #define HWLOC_CUDA_H
18 
19 #include <hwloc.h>
20 #include <hwloc/autogen/config.h>
21 #include <hwloc/helper.h>
22 #ifdef HWLOC_LINUX_SYS
23 #include <hwloc/linux.h>
24 #endif
25 
26 #include <cuda.h>
27 
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
33 
46 static __hwloc_inline int
47 hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
48  CUdevice cudevice, int *domain, int *bus, int *dev)
49 {
50  CUresult cres;
51 
52 #ifdef CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID
53  cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice);
54  if (cres != CUDA_SUCCESS) {
55  errno = ENOSYS;
56  return -1;
57  }
58 #else
59  *domain = 0;
60 #endif
61  cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
62  if (cres != CUDA_SUCCESS) {
63  errno = ENOSYS;
64  return -1;
65  }
66  cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
67  if (cres != CUDA_SUCCESS) {
68  errno = ENOSYS;
69  return -1;
70  }
71 
72  return 0;
73 }
74 
91 static __hwloc_inline int
92 hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
93  CUdevice cudevice, hwloc_cpuset_t set)
94 {
95 #ifdef HWLOC_LINUX_SYS
96  /* If we're on Linux, use the sysfs mechanism to get the local cpus */
97 #define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128
98  char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX];
99  FILE *sysfile = NULL;
100  int domainid, busid, deviceid;
101 
102  if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
103  return -1;
104 
105  if (!hwloc_topology_is_thissystem(topology)) {
106  errno = EINVAL;
107  return -1;
108  }
109 
110  sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid);
111  sysfile = fopen(path, "r");
112  if (!sysfile)
113  return -1;
114 
115  hwloc_linux_parse_cpumap_file(sysfile, set);
116  if (hwloc_bitmap_iszero(set))
118 
119  fclose(sysfile);
120 #else
121  /* Non-Linux systems simply get a full cpuset */
123 #endif
124  return 0;
125 }
126 
137 static __hwloc_inline hwloc_obj_t
138 hwloc_cuda_get_device_pcidev(hwloc_topology_t topology, CUdevice cudevice)
139 {
140  int domain, bus, dev;
141 
142  if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
143  return NULL;
144 
145  return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
146 }
147 
161 static __hwloc_inline hwloc_obj_t
162 hwloc_cuda_get_device_osdev(hwloc_topology_t topology, CUdevice cudevice)
163 {
164  hwloc_obj_t osdev = NULL;
165  int domain, bus, dev;
166 
167  if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
168  return NULL;
169 
170  osdev = NULL;
171  while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
172  hwloc_obj_t pcidev = osdev->parent;
173  if (strncmp(osdev->name, "cuda", 4))
174  continue;
175  if (pcidev
176  && pcidev->type == HWLOC_OBJ_PCI_DEVICE
177  && (int) pcidev->attr->pcidev.domain == domain
178  && (int) pcidev->attr->pcidev.bus == bus
179  && (int) pcidev->attr->pcidev.dev == dev
180  && pcidev->attr->pcidev.func == 0)
181  return osdev;
182  }
183 
184  return NULL;
185 }
186 
202 static __hwloc_inline hwloc_obj_t
204 {
205  hwloc_obj_t osdev = NULL;
206  while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
207  if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
208  && osdev->name
209  && !strncmp("cuda", osdev->name, 4)
210  && atoi(osdev->name + 4) == (int) idx)
211  return osdev;
212  }
213  return NULL;
214 }
215 
219 #ifdef __cplusplus
220 } /* extern "C" */
221 #endif
222 
223 
224 #endif /* HWLOC_CUDA_H */
Structure of a topology object.
Definition: hwloc.h:331
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:1190
unsigned short domain
Definition: hwloc.h:496
static hwloc_obj_t hwloc_cuda_get_device_osdev(hwloc_topology_t topology, CUdevice cudevice)
Get the hwloc OS device object corresponding to CUDA device cudevice.
Definition: cuda.h:162
unsigned char dev
Definition: hwloc.h:497
static hwloc_obj_t hwloc_get_pcidev_by_busid(hwloc_topology_t topology, unsigned domain, unsigned bus, unsigned dev, unsigned func)
Find the PCI device object matching the PCI bus id given domain, bus device and function PCI bus id...
Definition: helper.h:1153
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
unsigned char func
Definition: hwloc.h:497
struct hwloc_obj * parent
Parent, NULL if root (system object)
Definition: hwloc.h:357
Operating system co-processor device. For instance "mic0" for a Xeon Phi (MIC) on Linux...
Definition: hwloc.h:270
static hwloc_obj_t hwloc_cuda_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
Get the hwloc OS device object corresponding to the CUDA device whose index is idx.
Definition: cuda.h:203
static int hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology, CUdevice cudevice, int *domain, int *bus, int *dev)
Return the domain, bus and device IDs of the CUDA device cudevice.
Definition: cuda.h:47
hwloc_obj_type_t type
Type of object.
Definition: hwloc.h:333
int hwloc_linux_parse_cpumap_file(FILE *file, hwloc_cpuset_t set)
Convert a linux kernel cpumap file file into hwloc CPU set.
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:116
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition: hwloc.h:339
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev
hwloc_obj_osdev_type_t type
Definition: hwloc.h:520
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
char * name
Object description if any.
Definition: hwloc.h:335
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:220
unsigned char bus
Definition: hwloc.h:497
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition: hwloc.h:577
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.
static hwloc_obj_t hwloc_cuda_get_device_pcidev(hwloc_topology_t topology, CUdevice cudevice)
Get the hwloc PCI device object corresponding to the CUDA device cudevice.
Definition: cuda.h:138
static int hwloc_cuda_get_device_cpuset(hwloc_topology_t topology, CUdevice cudevice, hwloc_cpuset_t set)
Get the CPU set of logical processors that are physically close to device cudevice.
Definition: cuda.h:92
static hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
Definition: helper.h:741