Hardware Locality (hwloc) 2.13.0rc1
cuda.h
1/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * Copyright © 2010-2023 Inria. All rights reserved.
4 * Copyright © 2010-2011 Université Bordeaux
5 * Copyright © 2011 Cisco Systems, Inc. All rights reserved.
6 * See COPYING in top-level directory.
7 */
8
16
17#ifndef HWLOC_CUDA_H
18#define HWLOC_CUDA_H
19
20#include "hwloc.h"
21#include "hwloc/autogen/config.h"
22#include "hwloc/helper.h"
23#ifdef HWLOC_LINUX_SYS
24#include "hwloc/linux.h"
25#endif
26
27#include <cuda.h>
28
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34
42
50static __hwloc_inline int
51hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
52 CUdevice cudevice, int *domain, int *bus, int *dev)
53{
54 CUresult cres;
55
56#if CUDA_VERSION >= 4000
57 cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice);
58 if (cres != CUDA_SUCCESS) {
59 errno = ENOSYS;
60 return -1;
61 }
62#else
63 *domain = 0;
64#endif
65 cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
66 if (cres != CUDA_SUCCESS) {
67 errno = ENOSYS;
68 return -1;
69 }
70 cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
71 if (cres != CUDA_SUCCESS) {
72 errno = ENOSYS;
73 return -1;
74 }
75
76 return 0;
77}
78
98static __hwloc_inline int
99hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
100 CUdevice cudevice, hwloc_cpuset_t set)
101{
102#ifdef HWLOC_LINUX_SYS
103 /* If we're on Linux, use the sysfs mechanism to get the local cpus */
104#define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128
105 char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX];
106 int domainid, busid, deviceid;
107
108 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
109 return -1;
110
111 if (!hwloc_topology_is_thissystem(topology)) {
112 errno = EINVAL;
113 return -1;
114 }
115
116 sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid);
117 if (hwloc_linux_read_path_as_cpumask(path, set) < 0
118 || hwloc_bitmap_iszero(set))
120#else
121 /* Non-Linux systems simply get a full cpuset */
123#endif
124 return 0;
125}
126
137static __hwloc_inline hwloc_obj_t
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
163static __hwloc_inline hwloc_obj_t
165{
166 hwloc_obj_t osdev = NULL;
167 int domain, bus, dev;
168
169 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
170 return NULL;
171
172 osdev = NULL;
173 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
174 hwloc_obj_t pcidev = osdev->parent;
175 if (strncmp(osdev->name, "cuda", 4))
176 continue;
177 if (pcidev
178 && pcidev->type == HWLOC_OBJ_PCI_DEVICE
179 && (int) pcidev->attr->pcidev.domain == domain
180 && (int) pcidev->attr->pcidev.bus == bus
181 && (int) pcidev->attr->pcidev.dev == dev
182 && pcidev->attr->pcidev.func == 0)
183 return osdev;
184 /* if PCI are filtered out, we need a info attr to match on */
185 }
186
187 return NULL;
188}
189
205static __hwloc_inline hwloc_obj_t
207{
208 hwloc_obj_t osdev = NULL;
209 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
211 && osdev->name
212 && !strncmp("cuda", osdev->name, 4)
213 && atoi(osdev->name + 4) == (int) idx)
214 return osdev;
215 }
216 return NULL;
217}
218
220
221
222#ifdef __cplusplus
223} /* extern "C" */
224#endif
225
226
227#endif /* HWLOC_CUDA_H */
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:1250
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:1291
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_topology_is_thissystem(hwloc_topology_t restrict topology)
Does the topology context come from this system?
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition hwloc.h:748
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:99
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:164
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
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:206
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:51
hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
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_bitmap_t hwloc_cpuset_t
A CPU set is a bitmap whose bits are set according to CPU physical OS indexes.
Definition hwloc.h:165
@ HWLOC_OBJ_OSDEV_COPROC
Operating system co-processor device. For instance "opencl0d0" for a OpenCL device,...
Definition hwloc.h:391
@ HWLOC_OBJ_PCI_DEVICE
PCI device (filtered out by default).
Definition hwloc.h:300
struct hwloc_obj * hwloc_obj_t
Convenience typedef; a pointer to a struct hwloc_obj.
Definition hwloc.h:637
hwloc_obj_osdev_type_t type
Definition hwloc.h:722
unsigned char dev
Device number (zz in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:683
unsigned char func
Function number (t in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:684
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:676
unsigned char bus
Bus number (yy in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:682
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition hwloc.h:449
hwloc_obj_type_t type
Type of object.
Definition hwloc.h:439
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition hwloc.h:456
struct hwloc_obj * parent
Parent, NULL if root (Machine object).
Definition hwloc.h:487
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev