Skip to content

Commit 255922b

Browse files
committed
[OpenMP] Clean up AMD handling for -fopenmp-targets=amdgcn arch inference
Previously we had some special handling here that errored out if multiple architectures were detected. This isn't a problem anymore as the runtime can handle multi-archicture binaries automatically. So it's safe to simply take the first architecture that we know works. If users use `--offload-arch=native` instead it will build for all the architectures at the same time rather than just picking one. This patch makes it consisten with the NVPTX version. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D142138
1 parent 56b038f commit 255922b

File tree

2 files changed

+15
-39
lines changed

2 files changed

+15
-39
lines changed

clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -29,32 +29,6 @@ using namespace clang::driver::tools;
2929
using namespace clang;
3030
using namespace llvm::opt;
3131

32-
namespace {
33-
34-
static bool checkSystemForAMDGPU(const ArgList &Args, const AMDGPUToolChain &TC,
35-
std::string &GPUArch) {
36-
auto CheckError = [&](llvm::Error Err) -> bool {
37-
std::string ErrMsg =
38-
llvm::formatv("{0}", llvm::fmt_consume(std::move(Err)));
39-
TC.getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
40-
<< llvm::Triple::getArchTypeName(TC.getArch()) << ErrMsg << "-march";
41-
return false;
42-
};
43-
44-
auto ArchsOrErr = TC.getSystemGPUArchs(Args);
45-
if (!ArchsOrErr)
46-
return CheckError(ArchsOrErr.takeError());
47-
48-
if (ArchsOrErr->size() > 1)
49-
if (!llvm::all_equal(*ArchsOrErr))
50-
return CheckError(llvm::createStringError(
51-
std::error_code(), "Multiple AMD GPUs found with different archs"));
52-
53-
GPUArch = ArchsOrErr->front();
54-
return true;
55-
}
56-
} // namespace
57-
5832
AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,
5933
const llvm::Triple &Triple,
6034
const ToolChain &HostTC,
@@ -70,11 +44,8 @@ void AMDGPUOpenMPToolChain::addClangTargetOptions(
7044
Action::OffloadKind DeviceOffloadingKind) const {
7145
HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);
7246

73-
std::string GPUArch = DriverArgs.getLastArgValue(options::OPT_march_EQ).str();
74-
if (GPUArch.empty()) {
75-
if (!checkSystemForAMDGPU(DriverArgs, *this, GPUArch))
76-
return;
77-
}
47+
StringRef GPUArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
48+
assert(!GPUArch.empty() && "Must have an explicit GPU arch.");
7849

7950
assert(DeviceOffloadingKind == Action::OFK_OpenMP &&
8051
"Only OpenMP offloading kinds are supported.");
@@ -115,9 +86,19 @@ llvm::opt::DerivedArgList *AMDGPUOpenMPToolChain::TranslateArgs(
11586
DAL->append(A);
11687

11788
if (!DAL->hasArg(options::OPT_march_EQ)) {
118-
std::string Arch = BoundArch.str();
119-
if (BoundArch.empty())
120-
checkSystemForAMDGPU(Args, *this, Arch);
89+
StringRef Arch = BoundArch;
90+
if (Arch.empty()) {
91+
auto ArchsOrErr = getSystemGPUArchs(Args);
92+
if (!ArchsOrErr) {
93+
std::string ErrMsg =
94+
llvm::formatv("{0}", llvm::fmt_consume(ArchsOrErr.takeError()));
95+
getDriver().Diag(diag::err_drv_undetermined_gpu_arch)
96+
<< llvm::Triple::getArchTypeName(getArch()) << ErrMsg << "-march";
97+
Arch = CudaArchToString(CudaArch::HIPDefault);
98+
} else {
99+
Arch = Args.MakeArgString(ArchsOrErr->front());
100+
}
101+
}
121102
DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), Arch);
122103
}
123104

clang/test/Driver/amdgpu-openmp-system-arch-fail.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@
1717
// RUN: | FileCheck %s --check-prefix=NO-OUTPUT-ERROR
1818
// NO-OUTPUT-ERROR: error: cannot determine amdgcn architecture{{.*}}; consider passing it via '-march'
1919

20-
// case when amdgpu_arch returns multiple gpus but all are different
21-
// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp -fopenmp-targets=amdgcn-amd-amdhsa -nogpulib --amdgpu-arch-tool=%t/amdgpu_arch_different %s 2>&1 \
22-
// RUN: | FileCheck %s --check-prefix=MULTIPLE-OUTPUT-ERROR
23-
// MULTIPLE-OUTPUT-ERROR: error: cannot determine amdgcn architecture: Multiple AMD GPUs found with different archs; consider passing it via '-march'
24-
2520
// case when amdgpu_arch does not return anything with successful execution
2621
// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp -fopenmp-targets=amdgcn-amd-amdhsa -nogpulib --amdgpu-arch-tool=%t/amdgpu_arch_empty %s 2>&1 \
2722
// RUN: | FileCheck %s --check-prefix=EMPTY-OUTPUT

0 commit comments

Comments
 (0)