Browse Source

CUDA: MSVC pass all cuda gencode flags via AdditionalOptions

Fixes #23491
pull/354/head
Robert Maynard 3 years ago
parent
commit
e3983168da
  1. 25
      Source/cmVisualStudio10TargetGenerator.cxx
  2. 71
      Source/cmVisualStudioGeneratorOptions.cxx
  3. 112
      Templates/MSBuild/FlagTables/v10_Cuda.json

25
Source/cmVisualStudio10TargetGenerator.cxx

@ -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,

71
Source/cmVisualStudioGeneratorOptions.cxx

@ -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()

112
Templates/MSBuild/FlagTables/v10_Cuda.json

@ -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",

Loading…
Cancel
Save