Skip to content

Commit b2c826f

Browse files
authored
Implement internal vector type traits (#6619)
1 parent 5d85f26 commit b2c826f

File tree

2 files changed

+472
-0
lines changed

2 files changed

+472
-0
lines changed
Lines changed: 355 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,355 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of libcu++, the C++ Standard Library for your entire system,
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES.
8+
//
9+
//===----------------------------------------------------------------------===//
10+
11+
#ifndef _CUDA__TYPE_TRAITS_VECTOR_TYPE_H
12+
#define _CUDA__TYPE_TRAITS_VECTOR_TYPE_H
13+
14+
#include <cuda/std/detail/__config>
15+
16+
#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)
17+
# pragma GCC system_header
18+
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)
19+
# pragma clang system_header
20+
#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)
21+
# pragma system_header
22+
#endif // no system header
23+
24+
#if _CCCL_HAS_CTK()
25+
26+
# include <cuda/std/__cstddef/types.h>
27+
# include <cuda/std/__type_traits/always_false.h>
28+
# include <cuda/std/__type_traits/is_same.h>
29+
30+
# if !_CCCL_CUDA_COMPILATION()
31+
# include <vector_types.h>
32+
# endif // !_CCCL_CUDA_COMPILATION()
33+
34+
# include <cuda/std/__cccl/prologue.h>
35+
36+
_CCCL_BEGIN_NAMESPACE_CUDA
37+
38+
template <class _Tp, ::cuda::std::size_t _Size>
39+
[[nodiscard]] _CCCL_API _CCCL_CONSTEVAL auto __cccl_vector_type_t_impl() noexcept
40+
{
41+
if constexpr (::cuda::std::is_same_v<_Tp, signed char>)
42+
{
43+
if constexpr (_Size == 1)
44+
{
45+
return ::char1{};
46+
}
47+
else if constexpr (_Size == 2)
48+
{
49+
return ::char2{};
50+
}
51+
else if constexpr (_Size == 3)
52+
{
53+
return ::char3{};
54+
}
55+
else if constexpr (_Size == 4)
56+
{
57+
return ::char4{};
58+
}
59+
else
60+
{
61+
return;
62+
}
63+
}
64+
else if constexpr (::cuda::std::is_same_v<_Tp, unsigned char>)
65+
{
66+
if constexpr (_Size == 1)
67+
{
68+
return ::uchar1{};
69+
}
70+
else if constexpr (_Size == 2)
71+
{
72+
return ::uchar2{};
73+
}
74+
else if constexpr (_Size == 3)
75+
{
76+
return ::uchar3{};
77+
}
78+
else if constexpr (_Size == 4)
79+
{
80+
return ::uchar4{};
81+
}
82+
else
83+
{
84+
return;
85+
}
86+
}
87+
else if constexpr (::cuda::std::is_same_v<_Tp, short>)
88+
{
89+
if constexpr (_Size == 1)
90+
{
91+
return ::short1{};
92+
}
93+
else if constexpr (_Size == 2)
94+
{
95+
return ::short2{};
96+
}
97+
else if constexpr (_Size == 3)
98+
{
99+
return ::short3{};
100+
}
101+
else if constexpr (_Size == 4)
102+
{
103+
return ::short4{};
104+
}
105+
else
106+
{
107+
return;
108+
}
109+
}
110+
else if constexpr (::cuda::std::is_same_v<_Tp, unsigned short>)
111+
{
112+
if constexpr (_Size == 1)
113+
{
114+
return ::ushort1{};
115+
}
116+
else if constexpr (_Size == 2)
117+
{
118+
return ::ushort2{};
119+
}
120+
else if constexpr (_Size == 3)
121+
{
122+
return ::ushort3{};
123+
}
124+
else if constexpr (_Size == 4)
125+
{
126+
return ::ushort4{};
127+
}
128+
else
129+
{
130+
return;
131+
}
132+
}
133+
else if constexpr (::cuda::std::is_same_v<_Tp, int>)
134+
{
135+
if constexpr (_Size == 1)
136+
{
137+
return ::int1{};
138+
}
139+
else if constexpr (_Size == 2)
140+
{
141+
return ::int2{};
142+
}
143+
else if constexpr (_Size == 3)
144+
{
145+
return ::int3{};
146+
}
147+
else if constexpr (_Size == 4)
148+
{
149+
return ::int4{};
150+
}
151+
else
152+
{
153+
return;
154+
}
155+
}
156+
else if constexpr (::cuda::std::is_same_v<_Tp, unsigned>)
157+
{
158+
if constexpr (_Size == 1)
159+
{
160+
return ::uint1{};
161+
}
162+
else if constexpr (_Size == 2)
163+
{
164+
return ::uint2{};
165+
}
166+
else if constexpr (_Size == 3)
167+
{
168+
return ::uint3{};
169+
}
170+
else if constexpr (_Size == 4)
171+
{
172+
return ::uint4{};
173+
}
174+
else
175+
{
176+
return;
177+
}
178+
}
179+
else if constexpr (::cuda::std::is_same_v<_Tp, long>)
180+
{
181+
if constexpr (_Size == 1)
182+
{
183+
return ::long1{};
184+
}
185+
else if constexpr (_Size == 2)
186+
{
187+
return ::long2{};
188+
}
189+
else if constexpr (_Size == 3)
190+
{
191+
return ::long3{};
192+
}
193+
else if constexpr (_Size == 4)
194+
{
195+
# if _CCCL_CTK_AT_LEAST(13, 0)
196+
return ::long4_32a{};
197+
# else // ^^^ _CCCL_CTK_AT_LEAST(13, 0) ^^^ / vvv _CCCL_CTK_BELOW(13, 0) vvv
198+
return ::long4{};
199+
# endif // ^^^ _CCCL_CTK_BELOW(13, 0) ^^^
200+
}
201+
else
202+
{
203+
return;
204+
}
205+
}
206+
else if constexpr (::cuda::std::is_same_v<_Tp, unsigned long>)
207+
{
208+
if constexpr (_Size == 1)
209+
{
210+
return ::ulong1{};
211+
}
212+
else if constexpr (_Size == 2)
213+
{
214+
return ::ulong2{};
215+
}
216+
else if constexpr (_Size == 3)
217+
{
218+
return ::ulong3{};
219+
}
220+
else if constexpr (_Size == 4)
221+
{
222+
# if _CCCL_CTK_AT_LEAST(13, 0)
223+
return ::ulong4_32a{};
224+
# else // ^^^ _CCCL_CTK_AT_LEAST(13, 0) ^^^ / vvv _CCCL_CTK_BELOW(13, 0) vvv
225+
return ::ulong4{};
226+
# endif // ^^^ _CCCL_CTK_BELOW(13, 0) ^^^
227+
}
228+
else
229+
{
230+
return;
231+
}
232+
}
233+
else if constexpr (::cuda::std::is_same_v<_Tp, long long>)
234+
{
235+
if constexpr (_Size == 1)
236+
{
237+
return ::longlong1{};
238+
}
239+
else if constexpr (_Size == 2)
240+
{
241+
return ::longlong2{};
242+
}
243+
else if constexpr (_Size == 3)
244+
{
245+
return ::longlong3{};
246+
}
247+
else if constexpr (_Size == 4)
248+
{
249+
# if _CCCL_CTK_AT_LEAST(13, 0)
250+
return ::longlong4_32a{};
251+
# else // ^^^ _CCCL_CTK_AT_LEAST(13, 0) ^^^ / vvv _CCCL_CTK_BELOW(13, 0) vvv
252+
return ::longlong4{};
253+
# endif // ^^^ _CCCL_CTK_BELOW(13, 0) ^^^
254+
}
255+
else
256+
{
257+
return;
258+
}
259+
}
260+
else if constexpr (::cuda::std::is_same_v<_Tp, unsigned long long>)
261+
{
262+
if constexpr (_Size == 1)
263+
{
264+
return ::ulonglong1{};
265+
}
266+
else if constexpr (_Size == 2)
267+
{
268+
return ::ulonglong2{};
269+
}
270+
else if constexpr (_Size == 3)
271+
{
272+
return ::ulonglong3{};
273+
}
274+
else if constexpr (_Size == 4)
275+
{
276+
# if _CCCL_CTK_AT_LEAST(13, 0)
277+
return ::ulonglong4_32a{};
278+
# else // ^^^ _CCCL_CTK_AT_LEAST(13, 0) ^^^ / vvv _CCCL_CTK_BELOW(13, 0) vvv
279+
return ::ulonglong4{};
280+
# endif // ^^^ _CCCL_CTK_BELOW(13, 0) ^^^
281+
}
282+
else
283+
{
284+
return;
285+
}
286+
}
287+
else if constexpr (::cuda::std::is_same_v<_Tp, float>)
288+
{
289+
if constexpr (_Size == 1)
290+
{
291+
return ::float1{};
292+
}
293+
else if constexpr (_Size == 2)
294+
{
295+
return ::float2{};
296+
}
297+
else if constexpr (_Size == 3)
298+
{
299+
return ::float3{};
300+
}
301+
else if constexpr (_Size == 4)
302+
{
303+
return ::float4{};
304+
}
305+
else
306+
{
307+
return;
308+
}
309+
}
310+
else if constexpr (::cuda::std::is_same_v<_Tp, double>)
311+
{
312+
if constexpr (_Size == 1)
313+
{
314+
return ::double1{};
315+
}
316+
else if constexpr (_Size == 2)
317+
{
318+
return ::double2{};
319+
}
320+
else if constexpr (_Size == 3)
321+
{
322+
return ::double3{};
323+
}
324+
else if constexpr (_Size == 4)
325+
{
326+
# if _CCCL_CTK_AT_LEAST(13, 0)
327+
return ::double4_32a{};
328+
# else // ^^^ _CCCL_CTK_AT_LEAST(13, 0) ^^^ / vvv _CCCL_CTK_BELOW(13, 0) vvv
329+
return ::double4{};
330+
# endif // ^^^ _CCCL_CTK_BELOW(13, 0) ^^^
331+
}
332+
else
333+
{
334+
return;
335+
}
336+
}
337+
else
338+
{
339+
return;
340+
}
341+
}
342+
343+
template <class _Tp, ::cuda::std::size_t _Size>
344+
using __vector_type_t = decltype(::cuda::__cccl_vector_type_t_impl<_Tp, _Size>());
345+
346+
template <class _Tp, ::cuda::std::size_t _Size>
347+
inline constexpr bool __has_vector_type_v = !::cuda::std::is_same_v<__vector_type_t<_Tp, _Size>, void>;
348+
349+
_CCCL_END_NAMESPACE_CUDA
350+
351+
# include <cuda/std/__cccl/epilogue.h>
352+
353+
#endif // !_CCCL_HAS_CTK()
354+
355+
#endif // _CUDA__TYPE_TRAITS_VECTOR_TYPE_H

0 commit comments

Comments
 (0)