annotate clang/lib/Headers/__clang_cuda_builtin_vars.h @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 /*===---- cuda_builtin_vars.h - CUDA built-in variables ---------------------===
anatofuz
parents:
diff changeset
2 *
anatofuz
parents:
diff changeset
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 * See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 *
anatofuz
parents:
diff changeset
7 *===-----------------------------------------------------------------------===
anatofuz
parents:
diff changeset
8 */
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 #ifndef __CUDA_BUILTIN_VARS_H
anatofuz
parents:
diff changeset
11 #define __CUDA_BUILTIN_VARS_H
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 // Forward declares from vector_types.h.
anatofuz
parents:
diff changeset
14 struct uint3;
anatofuz
parents:
diff changeset
15 struct dim3;
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 // The file implements built-in CUDA variables using __declspec(property).
anatofuz
parents:
diff changeset
18 // https://msdn.microsoft.com/en-us/library/yhfk0thd.aspx
anatofuz
parents:
diff changeset
19 // All read accesses of built-in variable fields get converted into calls to a
anatofuz
parents:
diff changeset
20 // getter function which in turn calls the appropriate builtin to fetch the
anatofuz
parents:
diff changeset
21 // value.
anatofuz
parents:
diff changeset
22 //
anatofuz
parents:
diff changeset
23 // Example:
anatofuz
parents:
diff changeset
24 // int x = threadIdx.x;
anatofuz
parents:
diff changeset
25 // IR output:
anatofuz
parents:
diff changeset
26 // %0 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x() #3
anatofuz
parents:
diff changeset
27 // PTX output:
anatofuz
parents:
diff changeset
28 // mov.u32 %r2, %tid.x;
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 #define __CUDA_DEVICE_BUILTIN(FIELD, INTRINSIC) \
anatofuz
parents:
diff changeset
31 __declspec(property(get = __fetch_builtin_##FIELD)) unsigned int FIELD; \
anatofuz
parents:
diff changeset
32 static inline __attribute__((always_inline)) \
anatofuz
parents:
diff changeset
33 __attribute__((device)) unsigned int __fetch_builtin_##FIELD(void) { \
anatofuz
parents:
diff changeset
34 return INTRINSIC; \
anatofuz
parents:
diff changeset
35 }
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 #if __cplusplus >= 201103L
anatofuz
parents:
diff changeset
38 #define __DELETE =delete
anatofuz
parents:
diff changeset
39 #else
anatofuz
parents:
diff changeset
40 #define __DELETE
anatofuz
parents:
diff changeset
41 #endif
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 // Make sure nobody can create instances of the special variable types. nvcc
anatofuz
parents:
diff changeset
44 // also disallows taking address of special variables, so we disable address-of
anatofuz
parents:
diff changeset
45 // operator as well.
anatofuz
parents:
diff changeset
46 #define __CUDA_DISALLOW_BUILTINVAR_ACCESS(TypeName) \
anatofuz
parents:
diff changeset
47 __attribute__((device)) TypeName() __DELETE; \
anatofuz
parents:
diff changeset
48 __attribute__((device)) TypeName(const TypeName &) __DELETE; \
anatofuz
parents:
diff changeset
49 __attribute__((device)) void operator=(const TypeName &) const __DELETE; \
anatofuz
parents:
diff changeset
50 __attribute__((device)) TypeName *operator&() const __DELETE
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 struct __cuda_builtin_threadIdx_t {
anatofuz
parents:
diff changeset
53 __CUDA_DEVICE_BUILTIN(x,__nvvm_read_ptx_sreg_tid_x());
anatofuz
parents:
diff changeset
54 __CUDA_DEVICE_BUILTIN(y,__nvvm_read_ptx_sreg_tid_y());
anatofuz
parents:
diff changeset
55 __CUDA_DEVICE_BUILTIN(z,__nvvm_read_ptx_sreg_tid_z());
anatofuz
parents:
diff changeset
56 // threadIdx should be convertible to uint3 (in fact in nvcc, it *is* a
anatofuz
parents:
diff changeset
57 // uint3). This function is defined after we pull in vector_types.h.
anatofuz
parents:
diff changeset
58 __attribute__((device)) operator uint3() const;
anatofuz
parents:
diff changeset
59 private:
anatofuz
parents:
diff changeset
60 __CUDA_DISALLOW_BUILTINVAR_ACCESS(__cuda_builtin_threadIdx_t);
anatofuz
parents:
diff changeset
61 };
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 struct __cuda_builtin_blockIdx_t {
anatofuz
parents:
diff changeset
64 __CUDA_DEVICE_BUILTIN(x,__nvvm_read_ptx_sreg_ctaid_x());
anatofuz
parents:
diff changeset
65 __CUDA_DEVICE_BUILTIN(y,__nvvm_read_ptx_sreg_ctaid_y());
anatofuz
parents:
diff changeset
66 __CUDA_DEVICE_BUILTIN(z,__nvvm_read_ptx_sreg_ctaid_z());
anatofuz
parents:
diff changeset
67 // blockIdx should be convertible to uint3 (in fact in nvcc, it *is* a
anatofuz
parents:
diff changeset
68 // uint3). This function is defined after we pull in vector_types.h.
anatofuz
parents:
diff changeset
69 __attribute__((device)) operator uint3() const;
anatofuz
parents:
diff changeset
70 private:
anatofuz
parents:
diff changeset
71 __CUDA_DISALLOW_BUILTINVAR_ACCESS(__cuda_builtin_blockIdx_t);
anatofuz
parents:
diff changeset
72 };
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 struct __cuda_builtin_blockDim_t {
anatofuz
parents:
diff changeset
75 __CUDA_DEVICE_BUILTIN(x,__nvvm_read_ptx_sreg_ntid_x());
anatofuz
parents:
diff changeset
76 __CUDA_DEVICE_BUILTIN(y,__nvvm_read_ptx_sreg_ntid_y());
anatofuz
parents:
diff changeset
77 __CUDA_DEVICE_BUILTIN(z,__nvvm_read_ptx_sreg_ntid_z());
anatofuz
parents:
diff changeset
78 // blockDim should be convertible to dim3 (in fact in nvcc, it *is* a
anatofuz
parents:
diff changeset
79 // dim3). This function is defined after we pull in vector_types.h.
anatofuz
parents:
diff changeset
80 __attribute__((device)) operator dim3() const;
anatofuz
parents:
diff changeset
81 private:
anatofuz
parents:
diff changeset
82 __CUDA_DISALLOW_BUILTINVAR_ACCESS(__cuda_builtin_blockDim_t);
anatofuz
parents:
diff changeset
83 };
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 struct __cuda_builtin_gridDim_t {
anatofuz
parents:
diff changeset
86 __CUDA_DEVICE_BUILTIN(x,__nvvm_read_ptx_sreg_nctaid_x());
anatofuz
parents:
diff changeset
87 __CUDA_DEVICE_BUILTIN(y,__nvvm_read_ptx_sreg_nctaid_y());
anatofuz
parents:
diff changeset
88 __CUDA_DEVICE_BUILTIN(z,__nvvm_read_ptx_sreg_nctaid_z());
anatofuz
parents:
diff changeset
89 // gridDim should be convertible to dim3 (in fact in nvcc, it *is* a
anatofuz
parents:
diff changeset
90 // dim3). This function is defined after we pull in vector_types.h.
anatofuz
parents:
diff changeset
91 __attribute__((device)) operator dim3() const;
anatofuz
parents:
diff changeset
92 private:
anatofuz
parents:
diff changeset
93 __CUDA_DISALLOW_BUILTINVAR_ACCESS(__cuda_builtin_gridDim_t);
anatofuz
parents:
diff changeset
94 };
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 #define __CUDA_BUILTIN_VAR \
anatofuz
parents:
diff changeset
97 extern const __attribute__((device)) __attribute__((weak))
anatofuz
parents:
diff changeset
98 __CUDA_BUILTIN_VAR __cuda_builtin_threadIdx_t threadIdx;
anatofuz
parents:
diff changeset
99 __CUDA_BUILTIN_VAR __cuda_builtin_blockIdx_t blockIdx;
anatofuz
parents:
diff changeset
100 __CUDA_BUILTIN_VAR __cuda_builtin_blockDim_t blockDim;
anatofuz
parents:
diff changeset
101 __CUDA_BUILTIN_VAR __cuda_builtin_gridDim_t gridDim;
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 // warpSize should translate to read of %WARP_SZ but there's currently no
anatofuz
parents:
diff changeset
104 // builtin to do so. According to PTX v4.2 docs 'to date, all target
anatofuz
parents:
diff changeset
105 // architectures have a WARP_SZ value of 32'.
anatofuz
parents:
diff changeset
106 __attribute__((device)) const int warpSize = 32;
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 #undef __CUDA_DEVICE_BUILTIN
anatofuz
parents:
diff changeset
109 #undef __CUDA_BUILTIN_VAR
anatofuz
parents:
diff changeset
110 #undef __CUDA_DISALLOW_BUILTINVAR_ACCESS
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 #endif /* __CUDA_BUILTIN_VARS_H */