1//===--- Cuda.h - Utilities for compiling CUDA code ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_BASIC_CUDA_H
10#define LLVM_CLANG_BASIC_CUDA_H
11
12#include "clang/Basic/OffloadArch.h"
13
14namespace llvm {
15class StringRef;
16class Twine;
17class VersionTuple;
18} // namespace llvm
19
20namespace clang {
21
22enum class CudaVersion {
23 UNKNOWN,
24 CUDA_70,
25 CUDA_75,
26 CUDA_80,
27 CUDA_90,
28 CUDA_91,
29 CUDA_92,
30 CUDA_100,
31 CUDA_101,
32 CUDA_102,
33 CUDA_110,
34 CUDA_111,
35 CUDA_112,
36 CUDA_113,
37 CUDA_114,
38 CUDA_115,
39 CUDA_116,
40 CUDA_117,
41 CUDA_118,
42 CUDA_120,
43 CUDA_121,
44 CUDA_122,
45 CUDA_123,
46 CUDA_124,
47 CUDA_125,
48 CUDA_126,
49 CUDA_128,
50 FULLY_SUPPORTED = CUDA_123,
51 PARTIALLY_SUPPORTED =
52 CUDA_128, // Partially supported. Proceed with a warning.
53 NEW = 10000, // Too new. Issue a warning, but allow using it.
54};
55const char *CudaVersionToString(CudaVersion V);
56// Input is "Major.Minor"
57CudaVersion CudaStringToVersion(const llvm::Twine &S);
58
59enum class CUDAFunctionTarget {
60 Device,
61 Global,
62 Host,
63 HostDevice,
64 InvalidTarget
65};
66
67/// Get the earliest CudaVersion that supports the given OffloadArch.
68CudaVersion MinVersionForOffloadArch(OffloadArch A);
69
70/// Get the latest CudaVersion that supports the given OffloadArch.
71CudaVersion MaxVersionForOffloadArch(OffloadArch A);
72
73// Various SDK-dependent features that affect CUDA compilation
74enum class CudaFeature {
75 // CUDA-9.2+ uses a new API for launching kernels.
76 CUDA_USES_NEW_LAUNCH,
77 // CUDA-10.1+ needs explicit end of GPU binary registration.
78 CUDA_USES_FATBIN_REGISTER_END,
79};
80
81CudaVersion ToCudaVersion(llvm::VersionTuple);
82bool CudaFeatureEnabled(llvm::VersionTuple, CudaFeature);
83bool CudaFeatureEnabled(CudaVersion, CudaFeature);
84
85} // namespace clang
86
87#endif
88