Hardware Locality (hwloc) 2.9.0
cuda.h
1/*
2 * Copyright © 2010-2021 Inria. All rights reserved.
3 * Copyright © 2010-2011 Université Bordeaux
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
30extern "C" {
31#endif
32
33
46static __hwloc_inline int
47hwloc_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#if CUDA_VERSION >= 4000
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
91static __hwloc_inline int
92hwloc_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 int domainid, busid, deviceid;
100
101 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
102 return -1;
103
104 if (!hwloc_topology_is_thissystem(topology)) {
105 errno = EINVAL;
106 return -1;
107 }
108
109 sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid);
110 if (hwloc_linux_read_path_as_cpumask(path, set) < 0
111 || hwloc_bitmap_iszero(set))
113#else
114 /* Non-Linux systems simply get a full cpuset */
116#endif
117 return 0;
118}
119
130static __hwloc_inline hwloc_obj_t
132{
133 int domain, bus, dev;
134
135 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
136 return NULL;
137
138 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
139}
140
156static __hwloc_inline hwloc_obj_t
158{
159 hwloc_obj_t osdev = NULL;
160 int domain, bus, dev;
161
162 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
163 return NULL;
164
165 osdev = NULL;
166 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
167 hwloc_obj_t pcidev = osdev->parent;
168 if (strncmp(osdev->name, "cuda", 4))
169 continue;
170 if (pcidev
171 && pcidev->type == HWLOC_OBJ_PCI_DEVICE
172 && (int) pcidev->attr->pcidev.domain == domain
173 && (int) pcidev->attr->pcidev.bus == bus
174 && (int) pcidev->attr->pcidev.dev == dev
175 && pcidev->attr->pcidev.func == 0)
176 return osdev;
177 /* if PCI are filtered out, we need a info attr to match on */
178 }
179
180 return NULL;
181}
182
198static __hwloc_inline hwloc_obj_t
200{
201 hwloc_obj_t osdev = NULL;
202 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
204 && osdev->name
205 && !strncmp("cuda", osdev->name, 4)
206 && atoi(osdev->name + 4) == (int) idx)
207 return osdev;
208 }
209 return NULL;
210}
211
215#ifdef __cplusplus
216} /* extern "C" */
217#endif
218
219
220#endif /* HWLOC_CUDA_H */
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:140
@ HWLOC_OBJ_OSDEV_COPROC
Operating system co-processor device. For instance "opencl0d0" for a OpenCL device,...
Definition hwloc.h:353
@ HWLOC_OBJ_PCI_DEVICE
PCI device (filtered out by default).
Definition hwloc.h:269
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition hwloc.h:692
int hwloc_topology_is_thissystem(hwloc_topology_t restrict topology)
Does the topology context come from this system?
hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
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:1191
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:1154
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
int hwloc_bitmap_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src)
Copy the contents of bitmap src into the already allocated bitmap dst.
int hwloc_linux_read_path_as_cpumask(const char *path, hwloc_bitmap_t set)
Convert a linux kernel cpumask file path into a hwloc bitmap set.
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
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:131
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:199
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:157
static int hwloc_cuda_get_device_cpuset(hwloc_topology_t topology, CUdevice cudevice, hwloc_cpuset_t set)
Get the CPU set of processors that are physically close to device cudevice.
Definition cuda.h:92
Structure of a topology object.
Definition hwloc.h:396
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition hwloc.h:408
hwloc_obj_type_t type
Type of object.
Definition hwloc.h:398
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition hwloc.h:415
struct hwloc_obj * parent
Parent, NULL if root (Machine object)
Definition hwloc.h:446
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev
unsigned char dev
Definition hwloc.h:639
unsigned char func
Definition hwloc.h:639
unsigned short domain
Definition hwloc.h:635
unsigned char bus
Definition hwloc.h:639
hwloc_obj_osdev_type_t type
Definition hwloc.h:666