Open MPI logo

Portable Hardware Locality (hwloc) Documentation: v1.11.13

  |   Home   |   Support   |   FAQ   |  
opencl.h
1 /*
2  * Copyright © 2012-2017 Inria. All rights reserved.
3  * Copyright © 2013, 2018 Université Bordeaux. All right reserved.
4  * See COPYING in top-level directory.
5  */
6 
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 
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  /* If we're on Linux + AMD OpenCL, use the AMD extension + the sysfs mechanism to get the local cpus */
75 #define HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX 128
76  char path[HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX];
77  FILE *sysfile = NULL;
78  cl_device_topology_amd amdtopo;
79  cl_int clret;
80 
81  if (!hwloc_topology_is_thissystem(topology)) {
82  errno = EINVAL;
83  return -1;
84  }
85 
86  clret = clGetDeviceInfo(device, CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL);
87  if (CL_SUCCESS != clret) {
89  return 0;
90  }
91  if (CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD != amdtopo.raw.type) {
93  return 0;
94  }
95 
96  sprintf(path, "/sys/bus/pci/devices/0000:%02x:%02x.%01x/local_cpus",
97  (unsigned) amdtopo.pcie.bus, (unsigned) amdtopo.pcie.device, (unsigned) amdtopo.pcie.function);
98  sysfile = fopen(path, "r");
99  if (!sysfile)
100  return -1;
101 
102  if (hwloc_linux_parse_cpumap_file(sysfile, set) < 0
103  || hwloc_bitmap_iszero(set))
105 
106  fclose(sysfile);
107 #else
108  /* Non-Linux + AMD OpenCL systems simply get a full cpuset */
110 #endif
111  return 0;
112 }
113 
129 static __hwloc_inline hwloc_obj_t
131  unsigned platform_index, unsigned device_index)
132 {
133  unsigned x = (unsigned) -1, y = (unsigned) -1;
134  hwloc_obj_t osdev = NULL;
135  while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) {
136  if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type
137  && osdev->name
138  && sscanf(osdev->name, "opencl%ud%u", &x, &y) == 2
139  && platform_index == x && device_index == y)
140  return osdev;
141  }
142  return NULL;
143 }
144 
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  return NULL;
192 #else
193  return NULL;
194 #endif
195 }
196 
200 #ifdef __cplusplus
201 } /* extern "C" */
202 #endif
203 
204 
205 #endif /* HWLOC_OPENCL_H */
unsigned char bus
Definition: hwloc.h:544
int hwloc_linux_parse_cpumap_file(FILE *file, hwloc_cpuset_t set)
Convert a linux kernel cpumap file file into hwloc CPU set.
unsigned char dev
Definition: hwloc.h:544
char * name
Object-specific name if any. Mostly used for identifying OS devices and Misc objects where a name str...
Definition: hwloc.h:366
static 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:1252
void hwloc_bitmap_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src)
Copy the contents of bitmap src into the already allocated bitmap dst.
unsigned char func
Definition: hwloc.h:544
unsigned short domain
Definition: hwloc.h:543
struct hwloc_obj * parent
Parent, NULL if root (system object)
Definition: hwloc.h:403
static int hwloc_opencl_get_device_cpuset(hwloc_topology_t topology, cl_device_id device, hwloc_cpuset_t set)
Get the CPU set of logical processors that are physically close to OpenCL device device.
Definition: opencl.h:69
union hwloc_obj_attr_u * attr
Object type-specific Attributes, may be NULL if no attribute value was found.
Definition: hwloc.h:373
struct hwloc_obj_attr_u::hwloc_osdev_attr_s osdev
hwloc_obj_type_t type
Type of object.
Definition: hwloc.h:360
Operating system co-processor device. For instance "mic0" for a Xeon Phi (MIC) on Linux...
Definition: hwloc.h:297
int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap)
Test whether bitmap bitmap is empty.
static hwloc_obj_t hwloc_opencl_get_device_osdev(hwloc_topology_t topology, cl_device_id device)
Get the hwloc OS device object corresponding to OpenCL device device.
Definition: opencl.h:159
struct hwloc_obj_attr_u::hwloc_pcidev_attr_s pcidev
Structure of a topology object.
Definition: hwloc.h:358
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:132
hwloc_obj_osdev_type_t type
Definition: hwloc.h:567
static hwloc_const_cpuset_t hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
Get complete CPU set.
Definition: helper.h:803
int hwloc_topology_is_thissystem(hwloc_topology_t restrict topology)
Does the topology context come from this system?
PCI device. These objects have neither CPU sets nor node sets. They are not added to the topology unl...
Definition: hwloc.h:246
static hwloc_obj_t hwloc_opencl_get_device_osdev_by_index(hwloc_topology_t topology, unsigned platform_index, unsigned device_index)
Get the hwloc OS device object corresponding to the OpenCL device for the given indexes.
Definition: opencl.h:130
struct hwloc_topology * hwloc_topology_t
Topology context.
Definition: hwloc.h:633