This source file includes following definitions.
- hwloc_opencl_get_device_cpuset
- hwloc_opencl_get_device_osdev_by_index
- hwloc_opencl_get_device_osdev
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifndef HWLOC_OPENCL_H
15 #define HWLOC_OPENCL_H
16
17 #include <hwloc.h>
18 #include <hwloc/autogen/config.h>
19 #include <hwloc/helper.h>
20 #ifdef HWLOC_LINUX_SYS
21 #include <hwloc/linux.h>
22 #endif
23
24 #ifdef __APPLE__
25 #include <OpenCL/cl.h>
26 #include <OpenCL/cl_ext.h>
27 #else
28 #include <CL/cl.h>
29 #include <CL/cl_ext.h>
30 #endif
31
32 #include <stdio.h>
33
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 static __hwloc_inline int
69 hwloc_opencl_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
70 cl_device_id device __hwloc_attribute_unused,
71 hwloc_cpuset_t set)
72 {
73 #if (defined HWLOC_LINUX_SYS) && (defined CL_DEVICE_TOPOLOGY_AMD)
74
75 #define HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX 128
76 char path[HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX];
77 cl_device_topology_amd amdtopo;
78 cl_int clret;
79
80 if (!hwloc_topology_is_thissystem(topology)) {
81 errno = EINVAL;
82 return -1;
83 }
84
85 clret = clGetDeviceInfo(device, CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
86 if (CL_SUCCESS != clret) {
87 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
88 return 0;
89 }
90 if (CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD != amdtopo.raw.type) {
91 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
92 return 0;
93 }
94
95 sprintf(path, "/sys/bus/pci/devices/0000:%02x:%02x.%01x/local_cpus",
96 (unsigned) amdtopo.pcie.bus, (unsigned) amdtopo.pcie.device, (unsigned) amdtopo.pcie.function);
97 if (hwloc_linux_read_path_as_cpumask(path, set) < 0
98 || hwloc_bitmap_iszero(set))
99 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
100 #else
101
102 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
103 #endif
104 return 0;
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 static __hwloc_inline hwloc_obj_t
123 hwloc_opencl_get_device_osdev_by_index(hwloc_topology_t topology,
124 unsigned platform_index, unsigned device_index)
125 {
126 unsigned x = (unsigned) -1, y = (unsigned) -1;
127 hwloc_obj_t osdev = NULL;
128 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
129 if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
130 && osdev->name
131 && sscanf(osdev->name, "opencl%ud%u", &x, &y) == 2
132 && platform_index == x && device_index == y)
133 return osdev;
134 }
135 return NULL;
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158 static __hwloc_inline hwloc_obj_t
159 hwloc_opencl_get_device_osdev(hwloc_topology_t topology __hwloc_attribute_unused,
160 cl_device_id device __hwloc_attribute_unused)
161 {
162 #ifdef CL_DEVICE_TOPOLOGY_AMD
163 hwloc_obj_t osdev;
164 cl_device_topology_amd amdtopo;
165 cl_int clret;
166
167 clret = clGetDeviceInfo(device, CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
168 if (CL_SUCCESS != clret) {
169 errno = EINVAL;
170 return NULL;
171 }
172 if (CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD != amdtopo.raw.type) {
173 errno = EINVAL;
174 return NULL;
175 }
176
177 osdev = NULL;
178 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
179 hwloc_obj_t pcidev = osdev->parent;
180 if (strncmp(osdev->name, "opencl", 6))
181 continue;
182 if (pcidev
183 && pcidev->type == HWLOC_OBJ_PCI_DEVICE
184 && pcidev->attr->pcidev.domain == 0
185 && pcidev->attr->pcidev.bus == amdtopo.pcie.bus
186 && pcidev->attr->pcidev.dev == amdtopo.pcie.device
187 && pcidev->attr->pcidev.func == amdtopo.pcie.function)
188 return osdev;
189
190 }
191
192 return NULL;
193 #else
194 return NULL;
195 #endif
196 }
197
198
199
200
201 #ifdef __cplusplus
202 }
203 #endif
204
205
206 #endif