Hardware Locality (hwloc): cudart.h Source File

Hardware Locality (hwloc) 2.14.0rc1

cudart.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_CUDART_H
18#define HWLOC_CUDART_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> /* for CUDA_VERSION */
28#include <cuda_runtime_api.h>
29
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35
43
51static __hwloc_inline int
52hwloc_cudart_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused,
53 int idx, int *domain, int *bus, int *dev)
54{
55 cudaError_t cerr;
56 struct cudaDeviceProp prop;
57
58 cerr = cudaGetDeviceProperties(&prop, idx);
59 if (cerr) {
60 errno = ENOSYS;
61 return -1;
62 }
63
64#if CUDA_VERSION >= 4000
65 *domain = prop.pciDomainID;
66#else
67 *domain = 0;
68#endif
69
70 *bus = prop.pciBusID;
71 *dev = prop.pciDeviceID;
72
73 return 0;
74}
75
95static __hwloc_inline int
96hwloc_cudart_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
97 int idx, hwloc_cpuset_t set)
98{
99#ifdef HWLOC_LINUX_SYS
100 /* If we're on Linux, use the sysfs mechanism to get the local cpus */
101#define HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX 128
102 char path[HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX];
103 int domain, bus, dev;
104
105 if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev))
106 return -1;
107
108 if (!hwloc_topology_is_thissystem(topology)) {
109 errno = EINVAL;
110 return -1;
111 }
112
113 sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", (unsigned) domain, (unsigned) bus, (unsigned) dev);
114 if (hwloc_linux_read_path_as_cpumask(path, set) < 0
115 || hwloc_bitmap_iszero(set))
116 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
117#else
118 /* Non-Linux systems simply get a full cpuset */
119 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
120#endif
121 return 0;
122}
123
134static __hwloc_inline hwloc_obj_t
135hwloc_cudart_get_device_pcidev(hwloc_topology_t topology, int idx)
136{
137 int domain, bus, dev;
138
139 if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev))
140 return NULL;
141
142 return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
143}
144
162static __hwloc_inline hwloc_obj_t
163hwloc_cudart_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx)
164{
165 hwloc_obj_t osdev = NULL;
166 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
167 if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
168 && osdev->name
169 && !strncmp("cuda", osdev->name, 4)
170 && atoi(osdev->name + 4) == (int) idx)
171 return osdev;
172 }
173 return NULL;
174}
175
177
178
179#ifdef __cplusplus
180} /* extern "C" */
181#endif
182
183
184#endif /* HWLOC_CUDART_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:165
HWLOC_OBJ_OSDEV_COPROC
@ HWLOC_OBJ_OSDEV_COPROC
Operating system co-processor device. For instance "opencl0d0" for a OpenCL device,...
Definition hwloc.h:391
hwloc_obj_t
struct hwloc_obj * hwloc_obj_t
Convenience typedef; a pointer to a struct hwloc_obj.
Definition hwloc.h:637
hwloc_topology_t
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition hwloc.h:748
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_pcidev_by_busid
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_get_next_osdev
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
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_cudart_get_device_cpuset
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:96
hwloc_cudart_get_device_pci_ids
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:52
hwloc_cudart_get_device_osdev_by_index
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:163
hwloc_cudart_get_device_pcidev
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:135
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:449
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:456
hwloc_obj_attr_u::osdev
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev
hwloc_obj_attr_u::hwloc_osdev_attr_s::type
hwloc_obj_osdev_type_t type
Definition hwloc.h:722