Hardware Locality (hwloc)
v2.0-20191027.0400.gite37e7d8
|
00001 /* 00002 * Copyright © 2013-2016 Inria. All rights reserved. 00003 * See COPYING in top-level directory. 00004 */ 00005 00013 #ifndef HWLOC_INTEL_MIC_H 00014 #define HWLOC_INTEL_MIC_H 00015 00016 #include <hwloc.h> 00017 #include <hwloc/autogen/config.h> 00018 #include <hwloc/helper.h> 00019 #ifdef HWLOC_LINUX_SYS 00020 #include <hwloc/linux.h> 00021 #include <dirent.h> 00022 #include <string.h> 00023 #endif 00024 00025 #include <stdio.h> 00026 #include <stdlib.h> 00027 00028 00029 #ifdef __cplusplus 00030 extern "C" { 00031 #endif 00032 00033 00057 static __hwloc_inline int 00058 hwloc_intel_mic_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, 00059 int idx __hwloc_attribute_unused, 00060 hwloc_cpuset_t set) 00061 { 00062 #ifdef HWLOC_LINUX_SYS 00063 /* If we're on Linux, use the sysfs mechanism to get the local cpus */ 00064 #define HWLOC_INTEL_MIC_DEVICE_SYSFS_PATH_MAX 128 00065 char path[HWLOC_INTEL_MIC_DEVICE_SYSFS_PATH_MAX]; 00066 DIR *sysdir = NULL; 00067 struct dirent *dirent; 00068 unsigned pcibus, pcidev, pcifunc; 00069 00070 if (!hwloc_topology_is_thissystem(topology)) { 00071 errno = EINVAL; 00072 return -1; 00073 } 00074 00075 sprintf(path, "/sys/class/mic/mic%d", idx); 00076 sysdir = opendir(path); 00077 if (!sysdir) 00078 return -1; 00079 00080 while ((dirent = readdir(sysdir)) != NULL) { 00081 if (sscanf(dirent->d_name, "pci_%02x:%02x.%02x", &pcibus, &pcidev, &pcifunc) == 3) { 00082 sprintf(path, "/sys/class/mic/mic%d/pci_%02x:%02x.%02x/local_cpus", idx, pcibus, pcidev, pcifunc); 00083 if (hwloc_linux_read_path_as_cpumask(path, set) < 0 00084 || hwloc_bitmap_iszero(set)) 00085 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); 00086 break; 00087 } 00088 } 00089 00090 closedir(sysdir); 00091 #else 00092 /* Non-Linux systems simply get a full cpuset */ 00093 hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); 00094 #endif 00095 return 0; 00096 } 00097 00111 static __hwloc_inline hwloc_obj_t 00112 hwloc_intel_mic_get_device_osdev_by_index(hwloc_topology_t topology, 00113 unsigned idx) 00114 { 00115 hwloc_obj_t osdev = NULL; 00116 while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { 00117 if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type 00118 && osdev->name 00119 && !strncmp("mic", osdev->name, 3) 00120 && atoi(osdev->name + 3) == (int) idx) 00121 return osdev; 00122 } 00123 return NULL; 00124 } 00125 00129 #ifdef __cplusplus 00130 } /* extern "C" */ 00131 #endif 00132 00133 00134 #endif /* HWLOC_INTEL_MIC_H */