[v0.30] Build pciutils only if neccesary
If only HSA is enabled we dont need pciutils since AMD detection does not rely on it. Therefore we change CMakeLists.txt to build pciutils only if required. This commit has some side-effects: 1. We now don't build Intel backend by default. In other words, no backend is built by default, the user must specify which backend to use. 2. There were some issues with includes and wrongly used defines and variables. This commit fixes all that.
This commit is contained in:
@@ -10,9 +10,10 @@ set(CUDA_DIR "${SRC_DIR}/cuda")
|
|||||||
set(HSA_DIR "${SRC_DIR}/hsa")
|
set(HSA_DIR "${SRC_DIR}/hsa")
|
||||||
set(INTEL_DIR "${SRC_DIR}/intel")
|
set(INTEL_DIR "${SRC_DIR}/intel")
|
||||||
|
|
||||||
# Enable Intel backend by default
|
# Make sure that at least one backend is enabled.
|
||||||
if(NOT DEFINED ENABLE_INTEL_BACKEND)
|
# It does not make sense that the user has not specified any backend.
|
||||||
set(ENABLE_INTEL_BACKEND true)
|
if(NOT ENABLE_INTEL_BACKEND AND NOT ENABLE_CUDA_BACKEND AND NOT ENABLE_HSA_BACKEND)
|
||||||
|
message(FATAL_ERROR "No backend was enabled! Please enable at least one backend with -DENABLE_XXX_BACKEND")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_CUDA_BACKEND)
|
if(ENABLE_CUDA_BACKEND)
|
||||||
@@ -66,35 +67,63 @@ if(ENABLE_HSA_BACKEND)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
set(GPUFECH_COMMON
|
||||||
find_package(PCIUTILS)
|
${COMMON_DIR}/main.cpp
|
||||||
if(NOT ${PCIUTILS_FOUND})
|
${COMMON_DIR}/args.cpp
|
||||||
message(STATUS "${BoldYellow}pciutils not found, downloading and building a local copy...${ColorReset}")
|
${COMMON_DIR}/gpu.cpp
|
||||||
|
${COMMON_DIR}/global.cpp
|
||||||
|
${COMMON_DIR}/printer.cpp
|
||||||
|
${COMMON_DIR}/master.cpp
|
||||||
|
${COMMON_DIR}/uarch.cpp
|
||||||
|
)
|
||||||
|
|
||||||
# Download and build pciutils
|
set(GPUFETCH_LINK_TARGETS z)
|
||||||
set(PCIUTILS_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/pciutils-install)
|
|
||||||
ExternalProject_Add(pciutils
|
|
||||||
GIT_REPOSITORY https://github.com/pciutils/pciutils
|
|
||||||
CONFIGURE_COMMAND ""
|
|
||||||
BUILD_COMMAND make SHARED=no HWDB=no
|
|
||||||
BUILD_IN_SOURCE true
|
|
||||||
INSTALL_COMMAND make PREFIX=${PCIUTILS_INSTALL_LOCATION} install-lib
|
|
||||||
)
|
|
||||||
|
|
||||||
include_directories(${PCIUTILS_INSTALL_LOCATION}/include)
|
if(NOT(ENABLE_HSA_BACKEND AND NOT ENABLE_CUDA_BACKEND AND NOT ENABLE_INTEL_BACKEND))
|
||||||
link_directories(${PCIUTILS_INSTALL_LOCATION}/lib)
|
# Look for pciutils only if not building HSA only.
|
||||||
else()
|
#
|
||||||
include_directories(${PCIUTILS_INCLUDE_DIR})
|
# This has the (intented) secondary effect that if only HSA backend is enabled
|
||||||
link_libraries(${PCIUTILS_LIBRARIES})
|
# by the user, but ROCm cannot be found, pciutils will still be compiled in
|
||||||
# Needed for linking libpci in FreeBSD
|
# order to show the list of GPUs available on the system, so that the user will
|
||||||
link_directories(/usr/local/lib/)
|
# get at least some feedback even if HSA is not found.
|
||||||
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
||||||
|
list(APPEND GPUFECH_COMMON ${COMMON_DIR}/pci.cpp ${COMMON_DIR}/sort.cpp)
|
||||||
|
list(APPEND GPUFETCH_LINK_TARGETS pci)
|
||||||
|
set(CMAKE_ENABLE_PCIUTILS ON)
|
||||||
|
|
||||||
|
find_package(PCIUTILS)
|
||||||
|
if(NOT ${PCIUTILS_FOUND})
|
||||||
|
message(STATUS "${BoldYellow}pciutils not found, downloading and building a local copy...${ColorReset}")
|
||||||
|
|
||||||
|
# Download and build pciutils
|
||||||
|
set(PCIUTILS_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/pciutils-install)
|
||||||
|
ExternalProject_Add(pciutils
|
||||||
|
GIT_REPOSITORY https://github.com/pciutils/pciutils
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND make SHARED=no HWDB=no
|
||||||
|
BUILD_IN_SOURCE true
|
||||||
|
INSTALL_COMMAND make PREFIX=${PCIUTILS_INSTALL_LOCATION} install-lib
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(${PCIUTILS_INSTALL_LOCATION}/include)
|
||||||
|
link_directories(${PCIUTILS_INSTALL_LOCATION}/lib)
|
||||||
|
else()
|
||||||
|
include_directories(${PCIUTILS_INCLUDE_DIR})
|
||||||
|
link_libraries(${PCIUTILS_LIBRARIES})
|
||||||
|
# Needed for linking libpci in FreeBSD
|
||||||
|
link_directories(/usr/local/lib/)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(gpufetch ${COMMON_DIR}/main.cpp ${COMMON_DIR}/args.cpp ${COMMON_DIR}/gpu.cpp ${COMMON_DIR}/pci.cpp ${COMMON_DIR}/sort.cpp ${COMMON_DIR}/global.cpp ${COMMON_DIR}/printer.cpp ${COMMON_DIR}/master.cpp ${COMMON_DIR}/uarch.cpp)
|
add_executable(gpufetch ${GPUFECH_COMMON})
|
||||||
set(SANITY_FLAGS -Wfloat-equal -Wshadow -Wpointer-arith -Wall -Wextra -pedantic -fstack-protector-all -pedantic)
|
set(SANITY_FLAGS -Wfloat-equal -Wshadow -Wpointer-arith -Wall -Wextra -pedantic -fstack-protector-all -pedantic)
|
||||||
target_compile_features(gpufetch PRIVATE cxx_std_11)
|
target_compile_features(gpufetch PRIVATE cxx_std_11)
|
||||||
target_compile_options(gpufetch PRIVATE ${SANITY_FLAGS})
|
target_compile_options(gpufetch PRIVATE ${SANITY_FLAGS})
|
||||||
|
|
||||||
|
if (CMAKE_ENABLE_PCIUTILS)
|
||||||
|
target_compile_definitions(gpufetch PUBLIC BACKEND_USE_PCI)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ENABLE_INTEL_BACKEND)
|
if(ENABLE_INTEL_BACKEND)
|
||||||
target_compile_definitions(gpufetch PUBLIC BACKEND_INTEL)
|
target_compile_definitions(gpufetch PUBLIC BACKEND_INTEL)
|
||||||
|
|
||||||
@@ -156,7 +185,7 @@ if(ENABLE_HSA_BACKEND)
|
|||||||
target_link_libraries(gpufetch hsa_backend)
|
target_link_libraries(gpufetch hsa_backend)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(gpufetch pci z)
|
target_link_libraries(gpufetch ${GPUFETCH_LINK_TARGETS})
|
||||||
install(TARGETS gpufetch DESTINATION bin)
|
install(TARGETS gpufetch DESTINATION bin)
|
||||||
|
|
||||||
if(NOT WIN32)
|
if(NOT WIN32)
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "../cuda/pci.hpp"
|
|
||||||
|
|
||||||
#define UNKNOWN_FREQ -1
|
#define UNKNOWN_FREQ -1
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
#include "../cuda/cuda.hpp"
|
#include "../cuda/cuda.hpp"
|
||||||
#include "../cuda/uarch.hpp"
|
#include "../cuda/uarch.hpp"
|
||||||
|
|
||||||
|
#ifdef BACKEND_USE_PCI
|
||||||
|
#include "pci.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char* VERSION = "0.30";
|
static const char* VERSION = "0.30";
|
||||||
|
|
||||||
void print_help(char *argv[]) {
|
void print_help(char *argv[]) {
|
||||||
@@ -79,8 +83,12 @@ int main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(get_num_gpus_available(list) == 0) {
|
if(get_num_gpus_available(list) == 0) {
|
||||||
|
#ifdef BACKEND_USE_PCI
|
||||||
printErr("No GPU was detected! Available GPUs are:");
|
printErr("No GPU was detected! Available GPUs are:");
|
||||||
print_gpus_list_pci();
|
print_gpus_list_pci();
|
||||||
|
#else
|
||||||
|
printErr("No GPU was detected!");
|
||||||
|
#endif
|
||||||
printf("Please, make sure that the appropiate backend is enabled:\n");
|
printf("Please, make sure that the appropiate backend is enabled:\n");
|
||||||
print_enabled_backends();
|
print_enabled_backends();
|
||||||
printf("Visit https://github.com/Dr-Noob/gpufetch#2-backends for more information\n");
|
printf("Visit https://github.com/Dr-Noob/gpufetch#2-backends for more information\n");
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "pci.hpp"
|
#ifdef BACKEND_USE_PCI
|
||||||
|
#include "pci.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "global.hpp"
|
#include "global.hpp"
|
||||||
#include "colors.hpp"
|
#include "colors.hpp"
|
||||||
#include "master.hpp"
|
#include "master.hpp"
|
||||||
@@ -19,7 +22,9 @@ struct gpu_list {
|
|||||||
|
|
||||||
struct gpu_list* get_gpu_list() {
|
struct gpu_list* get_gpu_list() {
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
|
#ifdef BACKEND_USE_PCI
|
||||||
struct pci_dev *devices = get_pci_devices_from_pciutils();
|
struct pci_dev *devices = get_pci_devices_from_pciutils();
|
||||||
|
#endif
|
||||||
struct gpu_list* list = (struct gpu_list*) malloc(sizeof(struct gpu_list));
|
struct gpu_list* list = (struct gpu_list*) malloc(sizeof(struct gpu_list));
|
||||||
list->num_gpus = 0;
|
list->num_gpus = 0;
|
||||||
list->gpus = (struct gpu_info**) malloc(sizeof(struct info*) * MAX_GPUS);
|
list->gpus = (struct gpu_info**) malloc(sizeof(struct info*) * MAX_GPUS);
|
||||||
@@ -40,7 +45,7 @@ struct gpu_list* get_gpu_list() {
|
|||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
||||||
while(valid) {
|
while(valid) {
|
||||||
list->gpus[idx] = get_gpu_info_hsa(devices, idx);
|
list->gpus[idx] = get_gpu_info_hsa(idx);
|
||||||
if(list->gpus[idx] != NULL) idx++;
|
if(list->gpus[idx] != NULL) idx++;
|
||||||
else valid = false;
|
else valid = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
#include "cuda.hpp"
|
#include "cuda.hpp"
|
||||||
#include "uarch.hpp"
|
#include "uarch.hpp"
|
||||||
|
#include "pci.hpp"
|
||||||
#include "gpufetch_helper_cuda.hpp"
|
#include "gpufetch_helper_cuda.hpp"
|
||||||
#include "../common/pci.hpp"
|
|
||||||
#include "../common/global.hpp"
|
#include "../common/global.hpp"
|
||||||
#include "../common/uarch.hpp"
|
#include "../common/uarch.hpp"
|
||||||
|
|
||||||
@@ -33,10 +33,8 @@ int get_tensor_cores(struct uarch* arch, int sm, int major) {
|
|||||||
if(major == 7) {
|
if(major == 7) {
|
||||||
// TU116 does not have tensor cores!
|
// TU116 does not have tensor cores!
|
||||||
// https://www.anandtech.com/show/13973/nvidia-gtx-1660-ti-review-feat-evga-xc-gaming/2
|
// https://www.anandtech.com/show/13973/nvidia-gtx-1660-ti-review-feat-evga-xc-gaming/2
|
||||||
if(arch->chip == CHIP_TU116 || arch->chip == CHIP_TU116BM ||
|
if (is_chip_TU116(arch))
|
||||||
arch->chip == CHIP_TU116GL || arch->chip == CHIP_TU116M) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
return sm * 8;
|
return sm * 8;
|
||||||
}
|
}
|
||||||
else if(major == 8) return sm * 4;
|
else if(major == 8) return sm * 4;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "../common/uarch.hpp"
|
#include "../common/uarch.hpp"
|
||||||
#include "../common/global.hpp"
|
#include "../common/global.hpp"
|
||||||
#include "../common/gpu.hpp"
|
#include "../common/gpu.hpp"
|
||||||
|
#include "pci.hpp"
|
||||||
#include "chips.hpp"
|
#include "chips.hpp"
|
||||||
|
|
||||||
// Any clock multiplier
|
// Any clock multiplier
|
||||||
@@ -361,3 +362,8 @@ void free_uarch_struct(struct uarch* arch) {
|
|||||||
free(arch->chip_str);
|
free(arch->chip_str);
|
||||||
free(arch);
|
free(arch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_chip_TU116(struct uarch* arch) {
|
||||||
|
return arch->chip == CHIP_TU116 || arch->chip == CHIP_TU116BM ||
|
||||||
|
arch->chip == CHIP_TU116GL || arch->chip == CHIP_TU116M;
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,5 +13,6 @@ char* get_str_cc(struct uarch* arch);
|
|||||||
char* get_str_chip(struct uarch* arch);
|
char* get_str_chip(struct uarch* arch);
|
||||||
char* get_str_process(struct uarch* arch);
|
char* get_str_process(struct uarch* arch);
|
||||||
void free_uarch_struct(struct uarch* arch);
|
void free_uarch_struct(struct uarch* arch);
|
||||||
|
bool is_chip_TU116(struct uarch* arch);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
|
|
||||||
#include "hsa.hpp"
|
#include "hsa.hpp"
|
||||||
#include "uarch.hpp"
|
#include "uarch.hpp"
|
||||||
#include "../common/pci.hpp"
|
|
||||||
#include "../common/global.hpp"
|
#include "../common/global.hpp"
|
||||||
#include "../common/uarch.hpp"
|
#include "../common/uarch.hpp"
|
||||||
|
|
||||||
@@ -76,7 +75,7 @@ struct topology_h* get_topology_info(struct agent_info info) {
|
|||||||
return topo;
|
return topo;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gpu_info* get_gpu_info_hsa(struct pci_dev *devices, int gpu_idx) {
|
struct gpu_info* get_gpu_info_hsa(int gpu_idx) {
|
||||||
struct gpu_info* gpu = (struct gpu_info*) emalloc(sizeof(struct gpu_info));
|
struct gpu_info* gpu = (struct gpu_info*) emalloc(sizeof(struct gpu_info));
|
||||||
gpu->pci = NULL;
|
gpu->pci = NULL;
|
||||||
gpu->idx = gpu_idx;
|
gpu->idx = gpu_idx;
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "../common/gpu.hpp"
|
#include "../common/gpu.hpp"
|
||||||
|
|
||||||
struct gpu_info* get_gpu_info_hsa(struct pci_dev *devices, int gpu_idx);
|
struct gpu_info* get_gpu_info_hsa(int gpu_idx);
|
||||||
char* get_str_cu(struct gpu_info* gpu);
|
char* get_str_cu(struct gpu_info* gpu);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ enum {
|
|||||||
#define CHECK_UARCH_START if (false) {}
|
#define CHECK_UARCH_START if (false) {}
|
||||||
#define CHECK_UARCH(arch, chip_, str, uarch, process) \
|
#define CHECK_UARCH(arch, chip_, str, uarch, process) \
|
||||||
else if (arch->chip == chip_) fill_uarch(arch, str, uarch, process);
|
else if (arch->chip == chip_) fill_uarch(arch, str, uarch, process);
|
||||||
#define CHECK_UARCH_END else { if(arch->chip != CHIP_UNKNOWN_CUDA) printBug("map_chip_to_uarch_hsa: Unknown chip id: %d", arch->chip); fill_uarch(arch, STRING_UNKNOWN, UARCH_UNKNOWN, UNK); }
|
#define CHECK_UARCH_END else { if(arch->chip != CHIP_UNKNOWN_HSA) printBug("map_chip_to_uarch_hsa: Unknown chip id: %d", arch->chip); fill_uarch(arch, STRING_UNKNOWN, UARCH_UNKNOWN, UNK); }
|
||||||
|
|
||||||
void fill_uarch(struct uarch* arch, char const *str, MICROARCH u, uint32_t process) {
|
void fill_uarch(struct uarch* arch, char const *str, MICROARCH u, uint32_t process) {
|
||||||
arch->chip_str = (char *) emalloc(sizeof(char) * (strlen(str)+1));
|
arch->chip_str = (char *) emalloc(sizeof(char) * (strlen(str)+1));
|
||||||
|
|||||||
Reference in New Issue
Block a user