Hardware Locality (hwloc) 3.0.0a1-git
cudart.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_CUDART_H
18#define HWLOC_CUDART_H
19
20#include "hwloc.h"
21#include "hwloc/autogen/config.h"
22#include "hwloc/helper.h"
23
24#include <cuda.h> /* for CUDA_VERSION */
25#include <cuda_runtime_api.h>
26
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32
40
48static __hwloc_inline int
49hwloc_cudart_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
50 int idx, int *domain, int *bus, int *dev)
51{
52 cudaError_t cerr;
53 struct cudaDeviceProp prop;
54
55 cerr = cudaGetDeviceProperties(&prop, idx);
56 if (cerr) {
57 errno = ENOSYS;
58 return -1;
59 }
60
61#if CUDA_VERSION >= 4000
62 *domain = prop.pciDomainID;
63#else
64 *domain = 0;
65#endif
66
67 *bus = prop.pciBusID;
68 *dev = prop.pciDeviceID;
69
70 return 0;
71}
72
91static __hwloc_inline int
92hwloc_cudart_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
93 int idx, hwloc_cpuset_t set)
94{
95 int domain, bus, dev;
96
97 if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev))
98 return -1;
99
100 if (!hwloc_topology_is_thissystem(topology)) {
101 errno = EINVAL;
102 return -1;
103 }
104
105 return hwloc_get_pci_busid_cpuset(topology, set, (unsigned) domain, (unsigned) bus, (unsigned) dev, 0);
106}
107
118static __hwloc_inline hwloc_obj_t
120{
121 int domain, bus, dev;
122
123 if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev))
124 return NULL;
125
126 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
127}
128
146static __hwloc_inline hwloc_obj_t
148{
149 hwloc_obj_t osdev = NULL;
150 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
151 if ((osdev->attr->osdev.types & (HWLOC_OBJ_OSDEV_GPU|HWLOC_OBJ_OSDEV_COPROC)) /* assume future CUDA devices will be at least GPU or COPROC */
152 && osdev->name
153 && !strncmp("cuda", osdev->name, 4)
154 && atoi(osdev->name + 4) == (int) idx)
155 return osdev;
156 }
157 return NULL;
158}
159
161
162
163#ifdef __cplusplus
164} /* extern "C" */
165#endif
166
167
168#endif /* HWLOC_CUDART_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_cudart_get_device_cpuset(hwloc_topology_t topology, int idx, hwloc_cpuset_t set)
Get the CPU set of processors that are physically close to device idx.
Definition cudart.h:92
int hwloc_cudart_get_device_pci_ids(hwloc_topology_t topology, int idx, int *domain, int *bus, int *dev)
Return the domain, bus and device IDs of the CUDA device whose index is idx.
Definition cudart.h:49
hwloc_obj_t hwloc_cudart_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 cudart.h:147
hwloc_obj_t hwloc_cudart_get_device_pcidev(hwloc_topology_t topology, int idx)
Get the hwloc PCI device object corresponding to the CUDA device whose index is idx.
Definition cudart.h:119
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
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
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition hwloc.h:504
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_attr_u::hwloc_osdev_attr_s osdev