Skip to content

Commit

Permalink
Basic CUDA-10 support.
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D57771

llvm-svn: 353232
  • Loading branch information
Artem-B committed Feb 5, 2019
1 parent 421380a commit 4071763
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 3 deletions.
5 changes: 4 additions & 1 deletion clang/include/clang/Basic/Cuda.h
Expand Up @@ -25,7 +25,8 @@ enum class CudaVersion {
CUDA_91,
CUDA_92,
CUDA_100,
LATEST = CUDA_100,
CUDA_101,
LATEST = CUDA_101,
};
const char *CudaVersionToString(CudaVersion V);
// Input is "Major.Minor"
Expand Down Expand Up @@ -107,6 +108,8 @@ CudaVersion MaxVersionForCudaArch(CudaArch A);
enum class CudaFeature {
// CUDA-9.2+ uses a new API for launching kernels.
CUDA_USES_NEW_LAUNCH,
// CUDA-10.1+ needs explicit end of GPU binary registration.
CUDA_USES_FATBIN_REGISTER_END,
};

bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature);
Expand Down
9 changes: 8 additions & 1 deletion clang/lib/Basic/Cuda.cpp
Expand Up @@ -25,6 +25,8 @@ const char *CudaVersionToString(CudaVersion V) {
return "9.2";
case CudaVersion::CUDA_100:
return "10.0";
case CudaVersion::CUDA_101:
return "10.1";
}
llvm_unreachable("invalid enum");
}
Expand All @@ -37,7 +39,8 @@ CudaVersion CudaStringToVersion(llvm::StringRef S) {
.Case("9.0", CudaVersion::CUDA_90)
.Case("9.1", CudaVersion::CUDA_91)
.Case("9.2", CudaVersion::CUDA_92)
.Case("10.0", CudaVersion::CUDA_100);
.Case("10.0", CudaVersion::CUDA_100)
.Case("10.1", CudaVersion::CUDA_101);
}

const char *CudaArchToString(CudaArch A) {
Expand Down Expand Up @@ -352,6 +355,8 @@ static CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
return CudaVersion::CUDA_92;
case 100:
return CudaVersion::CUDA_100;
case 101:
return CudaVersion::CUDA_101;
default:
return CudaVersion::UNKNOWN;
}
Expand All @@ -365,6 +370,8 @@ bool CudaFeatureEnabled(CudaVersion Version, CudaFeature Feature) {
switch (Feature) {
case CudaFeature::CUDA_USES_NEW_LAUNCH:
return Version >= CudaVersion::CUDA_92;
case CudaFeature::CUDA_USES_FATBIN_REGISTER_END:
return Version >= CudaVersion::CUDA_101;
}
llvm_unreachable("Unknown CUDA feature.");
}
Expand Down
10 changes: 10 additions & 0 deletions clang/lib/CodeGen/CGCUDANV.cpp
Expand Up @@ -616,6 +616,16 @@ llvm::Function *CGNVCUDARuntime::makeModuleCtorFunction() {
// Call __cuda_register_globals(GpuBinaryHandle);
if (RegisterGlobalsFunc)
CtorBuilder.CreateCall(RegisterGlobalsFunc, RegisterFatbinCall);

// Call __cudaRegisterFatBinaryEnd(Handle) if this CUDA version needs it.
if (CudaFeatureEnabled(CGM.getTarget().getSDKVersion(),
CudaFeature::CUDA_USES_FATBIN_REGISTER_END)) {
// void __cudaRegisterFatBinaryEnd(void **);
llvm::FunctionCallee RegisterFatbinEndFunc = CGM.CreateRuntimeFunction(
llvm::FunctionType::get(VoidTy, VoidPtrPtrTy, false),
"__cudaRegisterFatBinaryEnd");
CtorBuilder.CreateCall(RegisterFatbinEndFunc, RegisterFatbinCall);
}
} else {
// Generate a unique module ID.
SmallString<64> ModuleID;
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/Driver/ToolChains/Cuda.cpp
Expand Up @@ -60,6 +60,8 @@ static CudaVersion ParseCudaVersionFile(llvm::StringRef V) {
return CudaVersion::CUDA_92;
if (Major == 10 && Minor == 0)
return CudaVersion::CUDA_100;
if (Major == 10 && Minor == 1)
return CudaVersion::CUDA_101;
return CudaVersion::UNKNOWN;
}

Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Headers/__clang_cuda_runtime_wrapper.h
Expand Up @@ -62,7 +62,7 @@
#include "cuda.h"
#if !defined(CUDA_VERSION)
#error "cuda.h did not define CUDA_VERSION"
#elif CUDA_VERSION < 7000 || CUDA_VERSION > 10000
#elif CUDA_VERSION < 7000 || CUDA_VERSION > 10010
#error "Unsupported CUDA version!"
#endif

Expand Down

0 comments on commit 4071763

Please sign in to comment.