diff options
Diffstat (limited to 'src/include/topo.h')
-rw-r--r-- | src/include/topo.h | 64 |
1 files changed, 25 insertions, 39 deletions
diff --git a/src/include/topo.h b/src/include/topo.h index e824a81..69cd100 100644 --- a/src/include/topo.h +++ b/src/include/topo.h @@ -1,5 +1,5 @@ /************************************************************************* - * Copyright (c) 2016-2018, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2016-2019, NVIDIA CORPORATION. All rights reserved. * * See LICENSE.txt for license information ************************************************************************/ @@ -11,49 +11,35 @@ #include <limits.h> #include <stdlib.h> #include <ctype.h> +#include <stdio.h> -#define BUSID_SIZE (sizeof("0000:00:00.0")) -#define BUSID_REDUCED_SIZE (sizeof("0000:00")) - -static ncclResult_t getCudaPath(int cudaDev, char** path) { - char busId[BUSID_SIZE]; - CUDACHECK(cudaDeviceGetPCIBusId(busId, BUSID_SIZE, cudaDev)); - for (int i=0; i<BUSID_SIZE; i++) busId[i] = tolower(busId[i]); - char busPath[] = "/sys/class/pci_bus/0000:00/../../0000:00:00.0"; - memcpy(busPath+sizeof("/sys/class/pci_bus/")-1, busId, BUSID_REDUCED_SIZE-1); - memcpy(busPath+sizeof("/sys/class/pci_bus/0000:00/../../")-1, busId, BUSID_SIZE-1); - *path = realpath(busPath, NULL); - if (*path == NULL) { - WARN("Could not find real path of %s", busPath); - return ncclSystemError; - } - return ncclSuccess; +ncclResult_t getCudaPath(int cudaDev, char** path); + +static int getNumaId(char *path) { + char npath[PATH_MAX]; + snprintf(npath, PATH_MAX, "%s/numa_node", path); + npath[PATH_MAX-1] = '\0'; + + int numaId = -1; + FILE *file = fopen(npath, "r"); + if (file == NULL) return -1; + if (fscanf(file, "%d", &numaId) == EOF) { fclose(file); return -1; } + fclose(file); + + return numaId; } enum ncclPathDist { - PATH_PIX = 0, - PATH_PXB = 1, - PATH_PHB = 2, - PATH_SOC = 3 + PATH_PIX = 0, + PATH_PXB = 1, + PATH_PHB = 2, + PATH_NODE = 3, + PATH_SYS = 4, + PATH_ARRAY_SIZE = 5 }; -static const char* pathDists[] = { "PIX", "PXB", "PHB", "SOC" }; - -static int pciDistance(char* path1, char* path2) { - int score = 0; - int depth = 0; - int same = 1; - for (int i=0; i<strlen(path1); i++) { - if (path1[i] != path2[i]) same = 0; - if (path1[i] == '/') { - depth++; - if (same == 1) score++; - } - } - if (score <= 3) return PATH_SOC; - if (score == 4) return PATH_PHB; - if (score == depth-1) return PATH_PIX; - return PATH_PXB; -} +extern const char* pathDists[PATH_ARRAY_SIZE]; + +int pciDistance(char* path1, char* path2); #endif |