mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-01 11:50:11 -05:00
Merge topic 'cuda-factor-out-lang'
b32ea7cff0CUDA: Factor out helper to generate CUDA architecture flagsb3a1f17567CUDA: Factor out helper to validate CMAKE_CUDA_ARCHITECTURES8617c28221CUDA: Factor out helper for detecting native CUDA architectures0db0fe7958CUDA: Factor out helper to compute all CUDA architecturesc16f1e2b93CUDA: Factor out helper to find CUDA Toolkit for compilera6841a967bCUDA: Factor out helper to filter implicit link librariesdeff0e638dCUDA: Factor out helper to parse NVCC implicit compiler and linker flagse1b2a5062fCUDA: Factor out some NVCC compiler information ... Acked-by: Kitware Robot <kwrobot@kitware.com> Reviewed-by: Raul Tambre <raul@tambre.ee> Merge-request: !8816
This commit is contained in:
@@ -3387,12 +3387,12 @@ void cmGeneratorTarget::AddExplicitLanguageFlags(std::string& flags,
|
||||
}
|
||||
|
||||
void cmGeneratorTarget::AddCUDAArchitectureFlags(cmBuildStep compileOrLink,
|
||||
const std::string& config,
|
||||
std::string const& config,
|
||||
std::string& flags) const
|
||||
{
|
||||
std::string property = this->GetSafeProperty("CUDA_ARCHITECTURES");
|
||||
std::string arch = this->GetSafeProperty("CUDA_ARCHITECTURES");
|
||||
|
||||
if (property.empty()) {
|
||||
if (arch.empty()) {
|
||||
switch (this->GetPolicyStatusCMP0104()) {
|
||||
case cmPolicies::WARN:
|
||||
if (!this->LocalGenerator->GetCMakeInstance()->GetIsInTryCompile()) {
|
||||
@@ -3414,48 +3414,60 @@ void cmGeneratorTarget::AddCUDAArchitectureFlags(cmBuildStep compileOrLink,
|
||||
}
|
||||
|
||||
// If CUDA_ARCHITECTURES is false we don't add any architectures.
|
||||
if (cmIsOff(property)) {
|
||||
if (cmIsOff(arch)) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::string const& compiler =
|
||||
this->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_ID");
|
||||
const bool ipoEnabled = this->IsIPOEnabled("CUDA", config);
|
||||
return this->AddCUDAArchitectureFlagsImpl(compileOrLink, config, "CUDA",
|
||||
std::move(arch), flags);
|
||||
}
|
||||
|
||||
void cmGeneratorTarget::AddCUDAArchitectureFlagsImpl(cmBuildStep compileOrLink,
|
||||
std::string const& config,
|
||||
std::string const& lang,
|
||||
std::string arch,
|
||||
std::string& flags) const
|
||||
{
|
||||
std::string const& compiler = this->Makefile->GetSafeDefinition(
|
||||
cmStrCat("CMAKE_", lang, "_COMPILER_ID"));
|
||||
const bool ipoEnabled = this->IsIPOEnabled(lang, config);
|
||||
|
||||
// Check for special modes: `all`, `all-major`.
|
||||
if (property == "all" || property == "all-major") {
|
||||
if (arch == "all" || arch == "all-major") {
|
||||
if (compiler == "NVIDIA" &&
|
||||
cmSystemTools::VersionCompare(
|
||||
cmSystemTools::OP_GREATER_EQUAL,
|
||||
this->Makefile->GetDefinition("CMAKE_CUDA_COMPILER_VERSION"),
|
||||
"11.5")) {
|
||||
flags = cmStrCat(flags, " -arch=", property);
|
||||
cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER_EQUAL,
|
||||
this->Makefile->GetDefinition(cmStrCat(
|
||||
"CMAKE_", lang, "_COMPILER_VERSION")),
|
||||
"11.5")) {
|
||||
flags = cmStrCat(flags, " -arch=", arch);
|
||||
return;
|
||||
}
|
||||
if (property == "all") {
|
||||
property =
|
||||
*this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL");
|
||||
} else if (property == "all-major") {
|
||||
property =
|
||||
*this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR");
|
||||
if (arch == "all") {
|
||||
arch = *this->Makefile->GetDefinition(
|
||||
cmStrCat("CMAKE_", lang, "_ARCHITECTURES_ALL"));
|
||||
} else if (arch == "all-major") {
|
||||
arch = *this->Makefile->GetDefinition(
|
||||
cmStrCat("CMAKE_", lang, "_ARCHITECTURES_ALL_MAJOR"));
|
||||
}
|
||||
} else if (property == "native") {
|
||||
cmValue native =
|
||||
this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_NATIVE");
|
||||
} else if (arch == "native") {
|
||||
cmValue native = this->Makefile->GetDefinition(
|
||||
cmStrCat("CMAKE_", lang, "_ARCHITECTURES_NATIVE"));
|
||||
if (native.IsEmpty()) {
|
||||
this->Makefile->IssueMessage(
|
||||
MessageType::FATAL_ERROR,
|
||||
"CUDA_ARCHITECTURES is set to \"native\", but no GPU was detected.");
|
||||
cmStrCat(lang,
|
||||
"_ARCHITECTURES is set to \"native\", but no NVIDIA GPU was "
|
||||
"detected."));
|
||||
}
|
||||
if (compiler == "NVIDIA" &&
|
||||
cmSystemTools::VersionCompare(
|
||||
cmSystemTools::OP_GREATER_EQUAL,
|
||||
this->Makefile->GetDefinition("CMAKE_CUDA_COMPILER_VERSION"),
|
||||
"11.6")) {
|
||||
flags = cmStrCat(flags, " -arch=", property);
|
||||
cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER_EQUAL,
|
||||
this->Makefile->GetDefinition(cmStrCat(
|
||||
"CMAKE_", lang, "_COMPILER_VERSION")),
|
||||
"11.6")) {
|
||||
flags = cmStrCat(flags, " -arch=", arch);
|
||||
return;
|
||||
}
|
||||
property = *native;
|
||||
arch = *native;
|
||||
}
|
||||
|
||||
struct CudaArchitecture
|
||||
@@ -3467,7 +3479,7 @@ void cmGeneratorTarget::AddCUDAArchitectureFlags(cmBuildStep compileOrLink,
|
||||
std::vector<CudaArchitecture> architectures;
|
||||
|
||||
{
|
||||
cmList options(property);
|
||||
cmList options(arch);
|
||||
|
||||
for (auto& option : options) {
|
||||
CudaArchitecture architecture;
|
||||
@@ -3500,8 +3512,8 @@ void cmGeneratorTarget::AddCUDAArchitectureFlags(cmBuildStep compileOrLink,
|
||||
|
||||
if (compiler == "NVIDIA") {
|
||||
if (ipoEnabled && compileOrLink == cmBuildStep::Link) {
|
||||
if (cmValue cudaIPOFlags =
|
||||
this->Makefile->GetDefinition("CMAKE_CUDA_LINK_OPTIONS_IPO")) {
|
||||
if (cmValue cudaIPOFlags = this->Makefile->GetDefinition(
|
||||
cmStrCat("CMAKE_", lang, "_LINK_OPTIONS_IPO"))) {
|
||||
flags += *cudaIPOFlags;
|
||||
}
|
||||
}
|
||||
@@ -3549,10 +3561,10 @@ void cmGeneratorTarget::AddCUDAArchitectureFlags(cmBuildStep compileOrLink,
|
||||
|
||||
void cmGeneratorTarget::AddISPCTargetFlags(std::string& flags) const
|
||||
{
|
||||
const std::string& property = this->GetSafeProperty("ISPC_INSTRUCTION_SETS");
|
||||
const std::string& arch = this->GetSafeProperty("ISPC_INSTRUCTION_SETS");
|
||||
|
||||
// If ISPC_TARGET is false we don't add any architectures.
|
||||
if (cmIsOff(property)) {
|
||||
if (cmIsOff(arch)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3560,7 +3572,7 @@ void cmGeneratorTarget::AddISPCTargetFlags(std::string& flags) const
|
||||
this->Makefile->GetSafeDefinition("CMAKE_ISPC_COMPILER_ID");
|
||||
|
||||
if (compiler == "Intel") {
|
||||
cmList targets(property);
|
||||
cmList targets(arch);
|
||||
if (!targets.empty()) {
|
||||
flags += cmStrCat(" --target=", cmWrap("", targets, "", ","));
|
||||
}
|
||||
@@ -3569,20 +3581,20 @@ void cmGeneratorTarget::AddISPCTargetFlags(std::string& flags) const
|
||||
|
||||
void cmGeneratorTarget::AddHIPArchitectureFlags(std::string& flags) const
|
||||
{
|
||||
const std::string& property = this->GetSafeProperty("HIP_ARCHITECTURES");
|
||||
const std::string& arch = this->GetSafeProperty("HIP_ARCHITECTURES");
|
||||
|
||||
if (property.empty()) {
|
||||
if (arch.empty()) {
|
||||
this->Makefile->IssueMessage(MessageType::FATAL_ERROR,
|
||||
"HIP_ARCHITECTURES is empty for target \"" +
|
||||
this->GetName() + "\".");
|
||||
}
|
||||
|
||||
// If HIP_ARCHITECTURES is false we don't add any architectures.
|
||||
if (cmIsOff(property)) {
|
||||
if (cmIsOff(arch)) {
|
||||
return;
|
||||
}
|
||||
|
||||
cmList options(property);
|
||||
cmList options(arch);
|
||||
|
||||
for (std::string& option : options) {
|
||||
flags += " --offload-arch=" + option;
|
||||
|
||||
@@ -496,8 +496,12 @@ public:
|
||||
cmSourceFile const& sf) const;
|
||||
|
||||
void AddCUDAArchitectureFlags(cmBuildStep compileOrLink,
|
||||
const std::string& config,
|
||||
std::string const& config,
|
||||
std::string& flags) const;
|
||||
void AddCUDAArchitectureFlagsImpl(cmBuildStep compileOrLink,
|
||||
std::string const& config,
|
||||
std::string const& lang, std::string arch,
|
||||
std::string& flags) const;
|
||||
void AddCUDAToolkitFlags(std::string& flags) const;
|
||||
|
||||
void AddHIPArchitectureFlags(std::string& flags) const;
|
||||
|
||||
Reference in New Issue
Block a user