Hardware Locality (hwloc) 3.0.0a1-git
cuda.h
1/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * Copyright © 2010-2026 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
24#include <cuda.h>
25
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31
39
47static __hwloc_inline int
48hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
49 CUdevice cudevice, int *domain, int *bus, int *dev)
50{
51 CUresult cres;
52
53#if CUDA_VERSION >= 4000
54 cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice);
55 if (cres != CUDA_SUCCESS) {
56 errno = ENOSYS;
57 return -1;
58 }
59#else
60 *domain = 0;
61#endif
62 cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
63 if (cres != CUDA_SUCCESS) {
64 errno = ENOSYS;
65 return -1;
66 }
67 cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
68 if (cres != CUDA_SUCCESS) {
69 errno = ENOSYS;
70 return -1;
71 }
72
73 return 0;
74}
75
94static __hwloc_inline int
95hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
96 CUdevice cudevice, hwloc_cpuset_t set)
97{
98 int domainid, busid, deviceid;
99
100 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
101 return -1;
102
103 if (!hwloc_topology_is_thissystem(topology)) {
104 errno = EINVAL;
105 return -1;
106 }
107
108 return hwloc_get_pci_busid_cpuset(topology, set, domainid, busid, deviceid, 0);
109}
110
121static __hwloc_inline hwloc_obj_t
123{
124 int domain, bus, dev;
125
126 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
127 return NULL;
128
129 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
130}
131
147static __hwloc_inline hwloc_obj_t
149{
150 hwloc_obj_t osdev = NULL;
151 int domain, bus, dev;
152
153 if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
154 return NULL;
155
156 osdev = NULL;
157 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
158 hwloc_obj_t pcidev = osdev->parent;
159 if (strncmp(osdev->name, "cuda", 4))
160 continue;
161 if (pcidev
162 && pcidev->type == HWLOC_OBJ_PCI_DEVICE
163 && (int) pcidev->attr->pcidev.domain == domain
164 && (int) pcidev->attr->pcidev.bus == bus
165 && (int) pcidev->attr->pcidev.dev == dev
166 && pcidev->attr->pcidev.func == 0)
167 return osdev;
168 /* if PCI are filtered out, we need a info attr to match on */
169 }
170
171 return NULL;
172}
173
189static __hwloc_inline hwloc_obj_t
191{
192 hwloc_obj_t osdev = NULL;
193 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
194 if ((osdev->attr->osdev.types & (HWLOC_OBJ_OSDEV_GPU|HWLOC_OBJ_OSDEV_COPROC)) /* assume future CUDA devices will be at least GPU or COPROC */
195 && osdev->name
196 && !strncmp("cuda", osdev->name, 4)
197 && atoi(osdev->name + 4) == (int) idx)
198 return osdev;
199 }
200 return NULL;
201}
202
204
205
206#ifdef __cplusplus
207} /* extern "C" */
208#endif
209
210
211#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:1310
int hwloc_get_pci_busid_cpuset(hwloc_topology_t topology, hwloc_cpuset_t cpuset, unsigned domain, unsigned bus, unsigned dev, unsigned func)
Find the locality of a given PCI bus id.
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:788
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:95
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:148
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:122
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:190
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:48
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:400
@ HWLOC_OBJ_OSDEV_GPU
Operating system GPU device. For instance ":0.0" for a GL display, "card0" for a Linux DRM device,...
Definition hwloc.h:393
@ HWLOC_OBJ_PCI_DEVICE
PCI device (filtered out by default).
Definition hwloc.h:324
struct hwloc_obj * hwloc_obj_t
Convenience typedef; a pointer to a struct hwloc_obj.
Definition hwloc.h:691
hwloc_obj_osdev_types_t types
OR'ed set of at least one hwloc_obj_osdev_type_e.
Definition hwloc.h:771
unsigned char dev
Device number (zz in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:737
unsigned char func
Function number (t in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:738
unsigned char bus
Bus number (yy in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:736
unsigned int domain
Domain number (xxxx in the PCI BDF notation xxxx:yy:zz.t).
Definition hwloc.h:735
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition hwloc.h:504
hwloc_obj_type_t type
Type of object.
Definition hwloc.h:494
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition hwloc.h:511
struct hwloc_obj * parent
Parent, NULL if root (Machine object).
Definition hwloc.h:542
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev