Hardware Locality (hwloc) 2.12.0rc1

cuda.h
1/*
2 * Copyright © 2010-2023 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
30 extern "C" {
31#endif
32
33
49 static __hwloc_inline int
50 hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
51 CUdevice cudevice, int *domain, int *bus, int *dev)
52{
53 CUresult cres;
54
55#if CUDA_VERSION >= 4000
56 cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice);
57 if (cres != CUDA_SUCCESS) {
58 errno = ENOSYS;
59 return -1;
60 }
61#else
62 *domain = 0;
63#endif
64 cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
65 if (cres != CUDA_SUCCESS) {
66 errno = ENOSYS;
67 return -1;
68 }
69 cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
70 if (cres != CUDA_SUCCESS) {
71 errno = ENOSYS;
72 return -1;
73 }
74
75 return 0;
76}
77
97 static __hwloc_inline int
98 hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
99 CUdevice cudevice, hwloc_cpuset_t set)
100{
101#ifdef HWLOC_LINUX_SYS
102 /* If we're on Linux, use the sysfs mechanism to get the local cpus */
103#define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128
104 char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX];
105 int domainid, busid, deviceid;
106
107 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
108 return -1;
109
110 if (!hwloc_topology_is_thissystem(topology)) {
111 errno = EINVAL;
112 return -1;
113 }
114
115 sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid);
116 if (hwloc_linux_read_path_as_cpumask(path, set) < 0
117 || hwloc_bitmap_iszero(set))
118 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
119#else
120 /* Non-Linux systems simply get a full cpuset */
121 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
122#endif
123 return 0;
124}
125
136 static __hwloc_inline hwloc_obj_t
137 hwloc_cuda_get_device_pcidev(hwloc_topology_t topology, CUdevice cudevice)
138{
139 int domain, bus, dev;
140
141 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
142 return NULL;
143
144 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
145}
146
162 static __hwloc_inline hwloc_obj_t
163 hwloc_cuda_get_device_osdev(hwloc_topology_t topology, CUdevice cudevice)
164{
165 hwloc_obj_t osdev = NULL;
166 int domain, bus, dev;
167
168 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
169 return NULL;
170
171 osdev = NULL;
172 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
173 hwloc_obj_t pcidev = osdev->parent;
174 if (strncmp(osdev->name, "cuda", 4))
175 continue;
176 if (pcidev
177 && pcidev->type == HWLOC_OBJ_PCI_DEVICE
178 && (int) pcidev->attr->pcidev.domain == domain
179 && (int) pcidev->attr->pcidev.bus == bus
180 && (int) pcidev->attr->pcidev.dev == dev
181 && pcidev->attr->pcidev.func == 0)
182 return osdev;
183 /* if PCI are filtered out, we need a info attr to match on */
184 }
185
186 return NULL;
187}
188
204 static __hwloc_inline hwloc_obj_t
205 hwloc_cuda_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
206{
207 hwloc_obj_t osdev = NULL;
208 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
209 if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
210 && osdev->name
211 && !strncmp("cuda", osdev->name, 4)
212 && atoi(osdev->name + 4) == (int) idx)
213 return osdev;
214 }
215 return NULL;
216}
217
221#ifdef __cplusplus
222} /* extern "C" */
223#endif
224
225
226#endif /* HWLOC_CUDA_H */
hwloc_cpuset_t
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:161
HWLOC_OBJ_OSDEV_COPROC
@ HWLOC_OBJ_OSDEV_COPROC
Operating system co-processor device. For instance "opencl0d0" for a OpenCL device,...
Definition hwloc.h:386
HWLOC_OBJ_PCI_DEVICE
@ HWLOC_OBJ_PCI_DEVICE
PCI device (filtered out by default).
Definition hwloc.h:295
hwloc_topology_t
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition hwloc.h:743
hwloc_topology_is_thissystem
int hwloc_topology_is_thissystem(hwloc_topology_t restrict topology)
Does the topology context come from this system?
hwloc_topology_get_complete_cpuset
hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
hwloc_get_next_osdev
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:1290
hwloc_get_pcidev_by_busid
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:1249
hwloc_bitmap_iszero
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
hwloc_bitmap_copy
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.
hwloc_linux_read_path_as_cpumask
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.
hwloc_cuda_get_device_pci_ids
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:50
hwloc_cuda_get_device_pcidev
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:137
hwloc_cuda_get_device_osdev_by_index
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:205
hwloc_cuda_get_device_osdev
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:163
hwloc_cuda_get_device_cpuset
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:98
hwloc_obj
Structure of a topology object.
Definition hwloc.h:432
hwloc_obj::name
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition hwloc.h:444
hwloc_obj::type
hwloc_obj_type_t type
Type of object.
Definition hwloc.h:434
hwloc_obj::attr
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition hwloc.h:451
hwloc_obj::parent
struct hwloc_obj * parent
Parent, NULL if root (Machine object)
Definition hwloc.h:482
hwloc_obj_attr_u::pcidev
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
hwloc_obj_attr_u::osdev
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev
hwloc_obj_attr_u::hwloc_pcidev_attr_s::dev
unsigned char dev
Device number (zz in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:678
hwloc_obj_attr_u::hwloc_pcidev_attr_s::func
unsigned char func
Function number (t in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:679
hwloc_obj_attr_u::hwloc_pcidev_attr_s::domain
unsigned short domain
Domain number (xxxx in the PCI BDF notation xxxx:yy:zz.t). Only 16bits PCI domains are supported by d...
Definition hwloc.h:671
hwloc_obj_attr_u::hwloc_pcidev_attr_s::bus
unsigned char bus
Bus number (yy in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:677
hwloc_obj_attr_u::hwloc_osdev_attr_s::type
hwloc_obj_osdev_type_t type
Definition hwloc.h:717