[PATCH] D11310: [CUDA] Moved device-side triple calculation to buildCudaActions
Justin Bogner
mail at justinbogner.com
Fri Jul 17 13:51:21 PDT 2015
Artem Belevich <tra at google.com> writes:
> tra created this revision.
> tra added reviewers: bogner, echristo.
> tra added a subscriber: cfe-commits.
>
> This attempts to keep this bit of cuda-specific knowledge out of
> relatively generic BuildJobsForActions.
LGTM.
> http://reviews.llvm.org/D11310
>
> Files:
> include/clang/Driver/Action.h
> lib/Driver/Action.cpp
> lib/Driver/Driver.cpp
>
> Index: lib/Driver/Driver.cpp
> ===================================================================
> --- lib/Driver/Driver.cpp
> +++ lib/Driver/Driver.cpp
> @@ -1237,11 +1237,8 @@
> // side actions.
> static std::unique_ptr<Action>
> buildCudaActions(const Driver &D, const ToolChain &TC, DerivedArgList &Args,
> - const Arg *InputArg, const types::ID InputType,
> - std::unique_ptr<Action> Current, ActionList &Actions) {
> -
> - assert(InputType == types::TY_CUDA &&
> - "CUDA Actions only apply to CUDA inputs.");
> + const Arg *InputArg, std::unique_ptr<Action> HostAction,
> + ActionList &Actions) {
>
> // Collect all cuda_gpu_arch parameters, removing duplicates.
> SmallVector<const char *, 4> GpuArchList;
> @@ -1279,6 +1276,12 @@
> }
> }
>
> + // Figure out which NVPTX triple to use for device-side compilation based on
> + // whether host is 64-bit.
> + const char *DeviceTriple = TC.getTriple().isArch64Bit()
> + ? "nvptx64-nvidia-cuda"
> + : "nvptx-nvidia-cuda";
> +
> // Figure out what to do with device actions -- pass them as inputs to the
> // host action or run each of them independently.
> bool DeviceOnlyCompilation = Args.hasArg(options::OPT_cuda_device_only);
> @@ -1295,26 +1298,26 @@
> }
>
> for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I)
> - Actions.push_back(
> - new CudaDeviceAction(std::unique_ptr<Action>(CudaDeviceActions[I]),
> - GpuArchList[I], /* AtTopLevel */ true));
> + Actions.push_back(new CudaDeviceAction(
> + std::unique_ptr<Action>(CudaDeviceActions[I]), GpuArchList[I],
> + DeviceTriple, /* AtTopLevel */ true));
> // Kill host action in case of device-only compilation.
> if (DeviceOnlyCompilation)
> - Current.reset(nullptr);
> - return Current;
> + HostAction.reset(nullptr);
> + return HostAction;
> }
>
> // Outputs of device actions during complete CUDA compilation get created
> // with AtTopLevel=false and become inputs for the host action.
> ActionList DeviceActions;
> for (unsigned I = 0, E = GpuArchList.size(); I != E; ++I)
> - DeviceActions.push_back(
> - new CudaDeviceAction(std::unique_ptr<Action>(CudaDeviceActions[I]),
> - GpuArchList[I], /* AtTopLevel */ false));
> + DeviceActions.push_back(new CudaDeviceAction(
> + std::unique_ptr<Action>(CudaDeviceActions[I]), GpuArchList[I],
> + DeviceTriple, /* AtTopLevel */ false));
> // Return a new host action that incorporates original host action and all
> // device actions.
> return std::unique_ptr<Action>(
> - new CudaHostAction(std::move(Current), DeviceActions));
> + new CudaHostAction(std::move(HostAction), DeviceActions));
> }
>
> void Driver::BuildActions(const ToolChain &TC, DerivedArgList &Args,
> @@ -1451,7 +1454,7 @@
> Current = ConstructPhaseAction(TC, Args, Phase, std::move(Current));
>
> if (InjectCuda && Phase == CudaInjectionPhase) {
> - Current = buildCudaActions(*this, TC, Args, InputArg, InputType,
> + Current = buildCudaActions(*this, TC, Args, InputArg,
> std::move(Current), Actions);
> if (!Current)
> break;
> @@ -1794,15 +1797,11 @@
> }
>
> if (const CudaDeviceAction *CDA = dyn_cast<CudaDeviceAction>(A)) {
> - // Figure out which NVPTX triple to use for device-side compilation based on
> - // whether host is 64-bit.
> - llvm::Triple DeviceTriple(TC->getTriple().isArch64Bit()
> - ? "nvptx64-nvidia-cuda"
> - : "nvptx-nvidia-cuda");
> - BuildJobsForAction(C, *CDA->begin(),
> - &getToolChain(C.getArgs(), DeviceTriple),
> - CDA->getGpuArchName(), CDA->isAtTopLevel(),
> - /*MultipleArchs*/ true, LinkingOutput, Result);
> + BuildJobsForAction(
> + C, *CDA->begin(),
> + &getToolChain(C.getArgs(), llvm::Triple(CDA->getDeviceTriple())),
> + CDA->getGpuArchName(), CDA->isAtTopLevel(),
> + /*MultipleArchs*/ true, LinkingOutput, Result);
> return;
> }
>
> Index: lib/Driver/Action.cpp
> ===================================================================
> --- lib/Driver/Action.cpp
> +++ lib/Driver/Action.cpp
> @@ -58,9 +58,10 @@
> void CudaDeviceAction::anchor() {}
>
> CudaDeviceAction::CudaDeviceAction(std::unique_ptr<Action> Input,
> - const char *ArchName, bool AtTopLevel)
> + const char *ArchName,
> + const char *DeviceTriple, bool AtTopLevel)
> : Action(CudaDeviceClass, std::move(Input)), GpuArchName(ArchName),
> - AtTopLevel(AtTopLevel) {}
> + DeviceTriple(DeviceTriple), AtTopLevel(AtTopLevel) {}
>
> void CudaHostAction::anchor() {}
>
> Index: include/clang/Driver/Action.h
> ===================================================================
> --- include/clang/Driver/Action.h
> +++ include/clang/Driver/Action.h
> @@ -139,15 +139,17 @@
> virtual void anchor();
> /// GPU architecture to bind -- e.g 'sm_35'.
> const char *GpuArchName;
> + const char *DeviceTriple;
> /// True when action results are not consumed by the host action (e.g when
> /// -fsyntax-only or --cuda-device-only options are used).
> bool AtTopLevel;
>
> public:
> CudaDeviceAction(std::unique_ptr<Action> Input, const char *ArchName,
> - bool AtTopLevel);
> + const char *DeviceTriple, bool AtTopLevel);
>
> const char *getGpuArchName() const { return GpuArchName; }
> + const char *getDeviceTriple() const { return DeviceTriple; }
> bool isAtTopLevel() const { return AtTopLevel; }
>
> static bool classof(const Action *A) {
More information about the cfe-commits
mailing list