Summary: These two tools do the same thing, we should unify them into a single tool. We create symlinks for backward compatiblity and provide a way to get the old vendor specific behavior with `--amdgpu-only` and `--nvptx-only`.
88 lines
2.6 KiB
C++
88 lines
2.6 KiB
C++
//===- OffloadArch.cpp - list available GPUs ------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/Basic/Version.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/Path.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden);
|
|
|
|
// Mark all our options with this category.
|
|
static cl::OptionCategory OffloadArchCategory("offload-arch options");
|
|
|
|
enum VendorName {
|
|
all,
|
|
amdgpu,
|
|
nvptx,
|
|
};
|
|
|
|
static cl::opt<VendorName>
|
|
Only("only", cl::desc("Restrict to vendor:"), cl::cat(OffloadArchCategory),
|
|
cl::init(all),
|
|
cl::values(clEnumVal(all, "Print all GPUs (default)"),
|
|
clEnumVal(amdgpu, "Only print AMD GPUs"),
|
|
clEnumVal(nvptx, "Only print NVIDIA GPUs")));
|
|
|
|
cl::opt<bool> Verbose("verbose", cl::desc("Enable verbose output"),
|
|
cl::init(false), cl::cat(OffloadArchCategory));
|
|
|
|
static void PrintVersion(raw_ostream &OS) {
|
|
OS << clang::getClangToolFullVersion("offload-arch") << '\n';
|
|
}
|
|
|
|
int printGPUsByKFD();
|
|
int printGPUsByHIP();
|
|
int printGPUsByCUDA();
|
|
|
|
static int printAMD() {
|
|
#ifndef _WIN32
|
|
if (!printGPUsByKFD())
|
|
return 0;
|
|
#endif
|
|
|
|
return printGPUsByHIP();
|
|
}
|
|
|
|
static int printNVIDIA() { return printGPUsByCUDA(); }
|
|
|
|
int main(int argc, char *argv[]) {
|
|
cl::HideUnrelatedOptions(OffloadArchCategory);
|
|
|
|
cl::SetVersionPrinter(PrintVersion);
|
|
cl::ParseCommandLineOptions(
|
|
argc, argv,
|
|
"A tool to detect the presence of offloading devices on the system. \n\n"
|
|
"The tool will output each detected GPU architecture separated by a\n"
|
|
"newline character. If multiple GPUs of the same architecture are found\n"
|
|
"a string will be printed for each\n");
|
|
|
|
if (Help) {
|
|
cl::PrintHelpMessage();
|
|
return 0;
|
|
}
|
|
|
|
// If this was invoked from the legacy symlinks provide the same behavior.
|
|
bool AMDGPUOnly = Only == VendorName::amdgpu ||
|
|
sys::path::stem(argv[0]).starts_with("amdgpu-arch");
|
|
bool NVIDIAOnly = Only == VendorName::nvptx ||
|
|
sys::path::stem(argv[0]).starts_with("nvptx-arch");
|
|
|
|
int NVIDIAResult = 0;
|
|
if (!AMDGPUOnly)
|
|
NVIDIAResult = printNVIDIA();
|
|
|
|
int AMDResult = 0;
|
|
if (!NVIDIAOnly)
|
|
AMDResult = printAMD();
|
|
|
|
// We only failed if all cases returned an error.
|
|
return AMDResult && NVIDIAResult;
|
|
}
|