Skip to content

Commit ee9b856

Browse files
authored
implement make_integer_sequence in terms of intrinsics whenever possible (#2384)
* use the `__make_integer_seq` intrinsic on MSVC when available * use the `__integer_pack` builtin to implement `make_integer_sequence` when possible * define and use a `_LIBCUDACXX_HAS_INTEGER_PACK` config macro
1 parent 371a434 commit ee9b856

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

libcudacxx/include/cuda/std/__utility/integer_sequence.h

+26-12
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,26 @@ template <class _IdxType, _IdxType... _Values>
3333
struct __integer_sequence
3434
{
3535
template <template <class _OIdxType, _OIdxType...> class _ToIndexSeq, class _ToIndexType>
36-
using __convert = _ToIndexSeq<_ToIndexType, _Values...>;
36+
using __convert _LIBCUDACXX_NODEBUG_TYPE = _ToIndexSeq<_ToIndexType, _Values...>;
3737

3838
template <size_t _Sp>
39-
using __to_tuple_indices = __tuple_indices<(_Values + _Sp)...>;
39+
using __to_tuple_indices _LIBCUDACXX_NODEBUG_TYPE = __tuple_indices<(_Values + _Sp)...>;
4040
};
4141

42-
#ifndef _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
42+
#if defined(_LIBCUDACXX_HAS_MAKE_INTEGER_SEQ)
43+
44+
template <size_t _Ep, size_t _Sp>
45+
using __make_indices_imp _LIBCUDACXX_NODEBUG_TYPE =
46+
typename __make_integer_seq<__integer_sequence, size_t, _Ep - _Sp>::template __to_tuple_indices<_Sp>;
47+
48+
#elif defined(_LIBCUDACXX_HAS_INTEGER_PACK) // ^^^ _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ ^^^
49+
// vvv _LIBCUDACXX_HAS_INTEGER_PACK vvv
50+
51+
template <size_t _Ep, size_t _Sp>
52+
using __make_indices_imp _LIBCUDACXX_NODEBUG_TYPE =
53+
typename __integer_sequence<size_t, __integer_pack(_Ep - _Sp)...>::template __to_tuple_indices<_Sp>;
54+
55+
#else // ^^^ _LIBCUDACXX_HAS_INTEGER_PACK ^^^ / vvv !_LIBCUDACXX_HAS_INTEGER_PACK vvv
4356

4457
namespace __detail
4558
{
@@ -65,6 +78,7 @@ struct __repeat<__integer_sequence<_Tp, _Np...>, _Extra...>
6578

6679
template <size_t _Np>
6780
struct __parity;
81+
6882
template <size_t _Np>
6983
struct __make : __parity<_Np % 8>::template __pmake<_Np>
7084
{};
@@ -170,15 +184,9 @@ struct __parity<7>
170184

171185
} // namespace __detail
172186

173-
#endif // !_LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
174-
175-
#ifdef _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
176-
template <size_t _Ep, size_t _Sp>
177-
using __make_indices_imp =
178-
typename __make_integer_seq<__integer_sequence, size_t, _Ep - _Sp>::template __to_tuple_indices<_Sp>;
179-
#else
180187
template <size_t _Ep, size_t _Sp>
181-
using __make_indices_imp = typename __detail::__make<_Ep - _Sp>::type::template __to_tuple_indices<_Sp>;
188+
using __make_indices_imp _LIBCUDACXX_NODEBUG_TYPE =
189+
typename __detail::__make<_Ep - _Sp>::type::template __to_tuple_indices<_Sp>;
182190

183191
#endif
184192

@@ -201,7 +209,13 @@ using index_sequence = integer_sequence<size_t, _Ip...>;
201209
template <class _Tp, _Tp _Ep>
202210
using __make_integer_sequence _LIBCUDACXX_NODEBUG_TYPE = __make_integer_seq<integer_sequence, _Tp, _Ep>;
203211

204-
#else // _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
212+
#elif defined(_LIBCUDACXX_HAS_INTEGER_PACK) // ^^^ _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ ^^^
213+
// vvv _LIBCUDACXX_HAS_INTEGER_PACK vvv
214+
215+
template <class _Tp, _Tp _Ep>
216+
using __make_integer_sequence _LIBCUDACXX_NODEBUG_TYPE = integer_sequence<_Tp, __integer_pack(_Ep)...>;
217+
218+
#else // ^^^ _LIBCUDACXX_HAS_INTEGER_PACK ^^^ / vvv !_LIBCUDACXX_HAS_INTEGER_PACK vvv
205219

206220
template <typename _Tp, _Tp _Np>
207221
using __make_integer_sequence_unchecked _LIBCUDACXX_NODEBUG_TYPE =

libcudacxx/include/cuda/std/detail/libcxx/include/__config

+11-2
Original file line numberDiff line numberDiff line change
@@ -1056,8 +1056,17 @@ typedef unsigned int char32_t;
10561056
# define _LIBCUDACXX_HAS_NO_BUILTIN_OPERATOR_NEW_DELETE
10571057
# endif
10581058

1059-
# if __check_builtin(make_integer_seq) && !defined(_LIBCUDACXX_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
1060-
# define _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
1059+
# if !defined(_LIBCUDACXX_TESTING_FALLBACK_MAKE_INTEGER_SEQUENCE)
1060+
# if __check_builtin(make_integer_seq)
1061+
# define _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
1062+
# elif defined(_CCCL_COMPILER_MSVC)
1063+
# if _CCCL_MSVC_VERSION_FULL >= 190023918
1064+
# define _LIBCUDACXX_HAS_MAKE_INTEGER_SEQ
1065+
# endif
1066+
# endif
1067+
# if __check_builtin(integer_pack)
1068+
# define _LIBCUDACXX_HAS_INTEGER_PACK
1069+
# endif
10611070
# endif
10621071

10631072
# ifdef _LIBCUDACXX_DEBUG

0 commit comments

Comments
 (0)