Open MPI logo

Portable Hardware Locality (hwloc) Documentation: v1.4.1

  |   Home   |   Support   |   FAQ   |  
cuda.h
00001 /*
00002  * Copyright © 2010 inria.  All rights reserved.
00003  * Copyright © 2010-2011 Université Bordeaux 1
00004  * Copyright © 2011 Cisco Systems, Inc.  All rights reserved.
00005  * See COPYING in top-level directory.
00006  */
00007 
00016 #ifndef HWLOC_CUDA_H
00017 #define HWLOC_CUDA_H
00018 
00019 #include <hwloc.h>
00020 #include <hwloc/autogen/config.h>
00021 #include <hwloc/linux.h>
00022 #include <hwloc/helper.h>
00023 
00024 #include <cuda.h>
00025 
00026 
00027 #ifdef __cplusplus
00028 extern "C" {
00029 #endif
00030 
00031 
00038 static inline int
00039 hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology ,
00040                                CUdevice cudevice, int *domain, int *bus, int *dev)
00041 {
00042   CUresult cres;
00043 
00044 #if CUDA_VERSION >= 4000
00045   cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice);
00046   if (cres != CUDA_SUCCESS) {
00047     errno = ENOSYS;
00048     return -1;
00049   }
00050 #else
00051   *domain = 0;
00052 #endif
00053   cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
00054   if (cres != CUDA_SUCCESS) {
00055     errno = ENOSYS;
00056     return -1;
00057   }
00058   cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
00059   if (cres != CUDA_SUCCESS) {
00060     errno = ENOSYS;
00061     return -1;
00062   }
00063 
00064   return 0;
00065 }
00066 
00075 static inline int
00076 hwloc_cuda_get_device_cpuset(hwloc_topology_t topology ,
00077                              CUdevice cudevice, hwloc_cpuset_t set)
00078 {
00079 #ifdef HWLOC_LINUX_SYS
00080   /* If we're on Linux, use the sysfs mechanism to get the local cpus */
00081 #define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128
00082   char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX];
00083   FILE *sysfile = NULL;
00084   int domainid, busid, deviceid;
00085 
00086   if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid))
00087     return -1;
00088 
00089   sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid);
00090   sysfile = fopen(path, "r");
00091   if (!sysfile)
00092     return -1;
00093 
00094   hwloc_linux_parse_cpumap_file(sysfile, set);
00095   if (hwloc_bitmap_iszero(set))
00096     hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
00097 
00098   fclose(sysfile);
00099 #else
00100   /* Non-Linux systems simply get a full cpuset */
00101   hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
00102 #endif
00103   return 0;
00104 }
00105 
00112 static inline hwloc_obj_t
00113 hwloc_cuda_get_device_pcidev(hwloc_topology_t topology, CUdevice cudevice)
00114 {
00115   int domain, bus, dev;
00116 
00117   if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev))
00118     return NULL;
00119 
00120   return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0);
00121 }
00122 
00126 #ifdef __cplusplus
00127 } /* extern "C" */
00128 #endif
00129 
00130 
00131 #endif /* HWLOC_CUDA_H */