Skip to content

Commit

Permalink
CUDA: MSVC pass all cuda gencode flags via AdditionalOptions
Browse files Browse the repository at this point in the history
Fixes #23491
  • Loading branch information
robertmaynard committed Jun 16, 2022
1 parent 87273cc commit e398316
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 186 deletions.
25 changes: 16 additions & 9 deletions Source/cmVisualStudio10TargetGenerator.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -3852,21 +3852,28 @@ bool cmVisualStudio10TargetGenerator::ComputeCudaLinkOptions(
this->GeneratorTarget->GetLinkOptions(linkOpts, configName, "CUDA");
// LINK_OPTIONS are escaped.
this->LocalGenerator->AppendCompileOptions(linkFlags, linkOpts);

cmComputeLinkInformation* pcli =
this->GeneratorTarget->GetLinkInformation(configName);
if (doDeviceLinking && pcli) {

cmLinkLineDeviceComputer computer(
this->LocalGenerator,
this->LocalGenerator->GetStateSnapshot().GetDirectory());
std::string ignored_;
this->LocalGenerator->GetDeviceLinkFlags(computer, configName, ignored_,
linkFlags, ignored_, ignored_,
this->GeneratorTarget);

this->LocalGenerator->AddLanguageFlagsForLinking(
linkFlags, this->GeneratorTarget, "CUDA", configName);
}
cudaLinkOptions.AppendFlagString("AdditionalOptions", linkFlags);

// For static libraries that have device linking enabled compute
// the libraries
if (this->GeneratorTarget->GetType() == cmStateEnums::STATIC_LIBRARY &&
doDeviceLinking) {
cmComputeLinkInformation* pcli =
this->GeneratorTarget->GetLinkInformation(configName);
if (!pcli) {
cmSystemTools::Error(
"CMake can not compute cmComputeLinkInformation for target: " +
this->Name);
return false;
}

cmComputeLinkInformation& cli = *pcli;
cmLinkLineDeviceComputer computer(
this->LocalGenerator,
Expand Down
71 changes: 6 additions & 65 deletions Source/cmVisualStudioGeneratorOptions.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -161,71 +161,12 @@ bool cmVisualStudioGeneratorOptions::UsingSBCS() const

void cmVisualStudioGeneratorOptions::FixCudaCodeGeneration()
{
// Extract temporary values stored by our flag table.
FlagValue arch = this->TakeFlag("cmake-temp-arch");
FlagValue code = this->TakeFlag("cmake-temp-code");
FlagValue gencode = this->TakeFlag("cmake-temp-gencode");

// No -code allowed without -arch.
if (arch.empty()) {
code.clear();
}

// Create a CodeGeneration field with [arch],[code] syntax in each entry.
// CUDA will convert it to `-gencode=arch=[arch],code="[code],[arch]"`.
FlagValue& result = this->FlagMap["CodeGeneration"];

// If there are no flags, leave the CodeGeneration field empty.
if (arch.empty() && gencode.empty()) {
return;
}

// First entries for the -arch=<arch> [-code=<code>,...] pair.
if (!arch.empty()) {
std::string arch_name = arch[0];
if (arch_name == "all" || arch_name == "all-major" ||
arch_name == "native") {
AppendFlagString("AdditionalOptions", "-arch=" + arch_name);
return;
}
std::vector<std::string> codes;
if (!code.empty()) {
codes = cmTokenize(code[0], ",");
}
if (codes.empty()) {
codes.push_back(arch_name);
// nvcc -arch=<arch> has a special case that allows a real
// architecture to be specified instead of a virtual arch.
// It translates to -arch=<virtual> -code=<real>.
cmSystemTools::ReplaceString(arch_name, "sm_", "compute_");
}
for (std::string const& c : codes) {
std::string entry = arch_name + "," + c;
result.push_back(entry);
}
}

// Now add entries for the following signatures:
// -gencode=<arch>,<code>
// -gencode=<arch>,[<code1>,<code2>]
// -gencode=<arch>,"<code1>,<code2>"
for (std::string const& e : gencode) {
std::string entry = e;
cmSystemTools::ReplaceString(entry, "arch=", "");
cmSystemTools::ReplaceString(entry, "code=", "");
cmSystemTools::ReplaceString(entry, "[", "");
cmSystemTools::ReplaceString(entry, "]", "");
cmSystemTools::ReplaceString(entry, "\"", "");

std::vector<std::string> codes = cmTokenize(entry, ",");
if (codes.size() >= 2) {
auto gencode_arch = cm::cbegin(codes);
for (auto ci = gencode_arch + 1; ci != cm::cend(codes); ++ci) {
std::string code_entry = *gencode_arch + "," + *ci;
result.push_back(code_entry);
}
}
}
// Create an empty CodeGeneration field, and pass the the actual
// compile flags via additional options so that we have consistent
// behavior and avoid issues with MSBuild extensions injecting
// virtual code when we request real only.
FlagValue& code_gen_flag = this->FlagMap["CodeGeneration"];
code_gen_flag = "";
}

void cmVisualStudioGeneratorOptions::FixManifestUACFlags()
Expand Down
112 changes: 0 additions & 112 deletions Templates/MSBuild/FlagTables/v10_Cuda.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,118 +69,6 @@
"UserFollowing"
]
},
{
"name": "cmake-temp-gencode",
"switch": "gencode=",
"comment": "",
"value": "",
"flags": [
"UserValue",
"SemicolonAppendable"
]
},
{
"name": "cmake-temp-gencode",
"switch": "gencode",
"comment": "",
"value": "",
"flags": [
"UserFollowing",
"SemicolonAppendable"
]
},
{
"name": "cmake-temp-gencode",
"switch": "-generate-code=",
"comment": "",
"value": "",
"flags": [
"UserValue",
"SemicolonAppendable"
]
},
{
"name": "cmake-temp-gencode",
"switch": "-generate-code",
"comment": "",
"value": "",
"flags": [
"UserFollowing",
"SemicolonAppendable"
]
},
{
"name": "cmake-temp-code",
"switch": "code=",
"comment": "",
"value": "",
"flags": [
"UserValue"
]
},
{
"name": "cmake-temp-code",
"switch": "code",
"comment": "",
"value": "",
"flags": [
"UserFollowing"
]
},
{
"name": "cmake-temp-code",
"switch": "-gpu-code=",
"comment": "",
"value": "",
"flags": [
"UserValue"
]
},
{
"name": "cmake-temp-code",
"switch": "-gpu-code",
"comment": "",
"value": "",
"flags": [
"UserFollowing"
]
},
{
"name": "cmake-temp-arch",
"switch": "arch=",
"comment": "",
"value": "",
"flags": [
"UserValue"
]
},
{
"name": "cmake-temp-arch",
"switch": "arch",
"comment": "",
"value": "",
"flags": [
"UserFollowing"
]
},
{
"name": "cmake-temp-arch",
"switch": "-gpu-architecture=",
"comment": "",
"value": "",
"flags": [
"UserValue"
]
},
{
"name": "cmake-temp-arch",
"switch": "-gpu-architecture",
"comment": "",
"value": "",
"flags": [
"UserFollowing"
]
},
{
"name": "FastMath",
"switch": "use_fast_math",
Expand Down

0 comments on commit e398316

Please sign in to comment.