diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b0641dffaa..049732daf9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,60 @@ # CHANGELOG +## 5.1.0 + +[Full Changelog](https://github.com/kokkos/kokkos/compare/5.0.2...5.1.0) + +### Features: +* Export Kokkos type traits as C++20 concepts [\#8494](https://github.com/kokkos/kokkos/pull/8494) + +### Backend and Architecture Enhancements: + +#### CUDA: +* Added `Kokkos_ARCH_BLACKWELL103` configure option for NVIDIA B300 GPUs [\#8791](https://github.com/kokkos/kokkos/pull/8791) +* Fix compiling with Clang+Cuda+OpenMP with Kokkos_ENABLE_COMPILE_AS_CMAKE_LANGUAGE=ON [\#8810](https://github.com/kokkos/kokkos/pull/8810) +* `nvcc_wrapper`: Add support for `-Ofc` and `--fdevice-time-trace` flags [\#8865](https://github.com/kokkos/kokkos/pull/8865) + +#### HIP: +* Search the CMake variable `ROCM_PATH` for dependencies [\#8669](https://github.com/kokkos/kokkos/pull/8669) +* Added support for brain floating-point (`bhalf_t`) [\#8705](https://github.com/kokkos/kokkos/pull/8705) +* Implemented true reduced-precision mathematical functions (instead of falling back to `float`) [\#8705](https://github.com/kokkos/kokkos/pull/8705) +* Add support for AMD MI355 and MI350 (`AMD_GFX950`) [\#8839](https://github.com/kokkos/kokkos/pull/8839) +* Fix race conditions in HIP `parallel_scan` when running on MI300A [\#8648](https://github.com/kokkos/kokkos/pull/8648) + +### General Enhancements +* Enable ScatterView to contribute into a View that is an rvalue [\#8594](https://github.com/kokkos/kokkos/pull/8594) +* Add bitwise operators to simd vectors and simd masks [\#8565](https://github.com/kokkos/kokkos/pull/8565) +* Use Array::size_type for subscript operators [\#8692](https://github.com/kokkos/kokkos/pull/8692) +* Add missing numeric trait `denorm_min` for `Kokkos::Experimental::half_t` and `Kokkos::Experimental::bhalf_t` [\#8769](https://github.com/kokkos/kokkos/pull/8769) +* Use StaticBatchSize in ViewFill [\#8795](https://github.com/kokkos/kokkos/pull/8795) +* Enforce failure when exceeding team_size_max and scratch_size_max checks [\#7445](https://github.com/kokkos/kokkos/pull/7445) +* Enable MPI detection with PALS [\#8895](https://github.com/kokkos/kokkos/pull/8895) +* Add simd memory permute functions [\#8775](https://github.com/kokkos/kokkos/pull/8775) +* Performance improvements using `MDRangePolicy` with `CUDA`, `HIP` and `SYCL` [\#8638](https://github.com/kokkos/kokkos/pull/8638), [\#8731](https://github.com/kokkos/kokkos/pull/8731) +* Add `Kokkos::norm`for `Kokkos::complex`- similar to `std::norm` [\#8627](https://github.com/kokkos/kokkos/pull/8927) +* Use neon and sve SIMD instructions if `nvcc` supports them [\#8667](https://github.com/kokkos/kokkos/pull/8667) +* Expand math support: complete the implementation of all remaining math functions and increase half-type support [\#8595](https://github.com/kokkos/kokkos/pull/8789) [\#8858](https://github.com/kokkos/kokkos/pull/8858) [\#8873](https://github.com/kokkos/kokkos/pull/8873) [\#8712](https://github.com/kokkos/kokkos/pull/8712) [\#8827](https://github.com/kokkos/kokkos/pull/8827) [\#8819](https://github.com/kokkos/kokkos/pull/8819) [\#8719](https://github.com/kokkos/kokkos/pull/8719) [\#8863](https://github.com/kokkos/kokkos/pull/8863) [\#8862](https://github.com/kokkos/kokkos/pull/8862) [\#8778](https://github.com/kokkos/kokkos/pull/8778) [\#8891](https://github.com/kokkos/kokkos/pull/8891) +* Improve performance of `deep_copy` from scalar in view fill using StaticBatchSize [\#8795](https://github.com/kokkos/kokkos/pull/8795) [\#8829](https://github.com/kokkos/kokkos/pull/8829) + +### Build System Changes +* Warn about multiple device architectures enabled by `find_package(HIP)` [\#8938](https://github.com/kokkos/kokkos/pull/8938) + +### Incompatibilities (i.e. breaking changes) +* Execution spaces can only be constructed after `Kokkos::initialize()` has been called and must be destructed before `Kokkos::finalize()` [\#8546](https://github.com/kokkos/kokkos/pull/8546) [\#8677](https://github.com/kokkos/kokkos/pull/8677) +* ScatterValue isn't move constructible/assignable anymore [\#8761](https://github.com/kokkos/kokkos/pull/8761) +* Enforce TeamPolicy constructor preconditions (includes vector length must be a power of two) [\#8904](https://github.com/kokkos/kokkos/pull/8904) [\#8907](https://github.com/kokkos/kokkos/pull/8907) +* OpenMP: Warn on exec space instance created within omp region [\#8919](https://github.com/kokkos/kokkos/pull/8919) +* Remove the deprecated OpenMPTarget backend [\#8701](https://github.com/kokkos/kokkos/pull/8701) [\#8717](https://github.com/kokkos/kokkos/pull/8717) [\#8749](https://github.com/kokkos/kokkos/pull/8749) [\#8767](https://github.com/kokkos/kokkos/pull/8767) + +### Bug Fixes +* Fix reduction_identity for BAnd [\#8715](https://github.com/kokkos/kokkos/pull/8715) +* Restrict lock free host atomics to the actual sizes that are lock free [\#8809](https://github.com/kokkos/kokkos/pull/8809) +* Use intrinsics when calling min and max on simd vectors of integral types [\#8899](https://github.com/kokkos/kokkos/pull/8899) +* Adds missing `constexpr` specifiers on `conj()`, and for the `real()` and `imag()` non-member functions taking complex numbers [\#8928](https://github.com/kokkos/kokkos/pull/8928) +* Ensure that execution space instances fence on finalize [\#8626](https://github.com/kokkos/kokkos/pull/8626) +* Update `team_fan_{in|out}` member functions of `ThreadsExecTeamMember` not to call host-only fuctions on the device [\#8730](https://github.com/kokkos/kokkos/pull/8730) +* Make overloads of `isnormal` compliant with std [\#8857](https://github.com/kokkos/kokkos/pull/8857) +* Fix compiler macros identify GCC and LLVM Clang on OSX [\#8592](https://github.com/kokkos/kokkos/pull/8592) [\#8952](https://github.com/kokkos/kokkos/pull/8952) + ## 5.0.2 [Full Changelog](https://github.com/kokkos/kokkos/compare/5.0.1...5.0.2) diff --git a/CMakeLists.txt b/CMakeLists.txt index d292a98a34b..5ae54e88acd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,8 +140,8 @@ elseif(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) endif() set(Kokkos_VERSION_MAJOR 5) -set(Kokkos_VERSION_MINOR 0) -set(Kokkos_VERSION_PATCH 99) +set(Kokkos_VERSION_MINOR 1) +set(Kokkos_VERSION_PATCH 1) set(Kokkos_VERSION "${Kokkos_VERSION_MAJOR}.${Kokkos_VERSION_MINOR}.${Kokkos_VERSION_PATCH}") message(STATUS "Kokkos version: ${Kokkos_VERSION}") math(EXPR KOKKOS_VERSION "${Kokkos_VERSION_MAJOR} * 10000 + ${Kokkos_VERSION_MINOR} * 100 + ${Kokkos_VERSION_PATCH}") diff --git a/core/src/Kokkos_Macros.hpp b/core/src/Kokkos_Macros.hpp index c40b26f516e..08d542f1e6e 100644 --- a/core/src/Kokkos_Macros.hpp +++ b/core/src/Kokkos_Macros.hpp @@ -18,6 +18,12 @@ * KOKKOS_ENABLE_CUDA_UVM Use CUDA UVM for Cuda memory space. */ +#ifndef KOKKOS_DONT_INCLUDE_CORE_CONFIG_H +#include +#include +#include +#endif + #define KOKKOS_VERSION_LESS(MAJOR, MINOR, PATCH) \ (KOKKOS_VERSION < ((MAJOR)*10000 + (MINOR)*100 + (PATCH))) @@ -38,12 +44,6 @@ #error implementation bug #endif -#ifndef KOKKOS_DONT_INCLUDE_CORE_CONFIG_H -#include -#include -#include -#endif - #if __has_include() #include #else @@ -126,7 +126,8 @@ // CRAY compiler for host code #define KOKKOS_COMPILER_CRAYC _CRAYC -#elif defined(__APPLE_CC__) && defined(__clang__) +#elif defined(__APPLE_CC__) && defined(__clang__) && \ + defined(__apple_build_version__) #define KOKKOS_COMPILER_APPLECC __APPLE_CC__ #elif defined(__NVCOMPILER) diff --git a/core/src/View/Kokkos_BasicView.hpp b/core/src/View/Kokkos_BasicView.hpp index a67ce315d35..65c659364e8 100644 --- a/core/src/View/Kokkos_BasicView.hpp +++ b/core/src/View/Kokkos_BasicView.hpp @@ -597,7 +597,8 @@ class BasicView { // Explicit cast is needed because submdspan_mapping may return a different // layout type. using sub_accessor_t = typename OtherAccessorPolicy::offset_policy; - m_ptr = src_view.m_acc.offset(src_view.m_ptr, sub_mapping_result.offset); + m_ptr = static_cast( + src_view.m_acc.offset(src_view.m_ptr, sub_mapping_result.offset)); m_map = mapping_type(sub_mapping_result.mapping); m_acc = sub_accessor_t(src_view.m_acc); diff --git a/core/unit_test/CMakeLists.txt b/core/unit_test/CMakeLists.txt index d6539dc9daa..0ec1d3cccee 100644 --- a/core/unit_test/CMakeLists.txt +++ b/core/unit_test/CMakeLists.txt @@ -299,7 +299,16 @@ foreach(Tag Threads;Serial;OpenMP;Cuda;HPX;OpenACC;HIP;SYCL) endforeach() set(${Tag}_SOURCES2D) - foreach(Name SubView_c10 SubView_c11 SubView_c12 SubView_c13 SubView_c14 SubView_c15) + foreach( + Name + SubView_c10 + SubView_c11 + SubView_c12 + SubView_c13 + SubView_c14 + SubView_c15 + SubView_c16 + ) set(file ${dir}/Test${Tag}_${Name}.cpp) # Write to a temporary intermediate file and call configure_file to avoid # updating timestamps triggering unnecessary rebuilds on subsequent cmake runs. diff --git a/core/unit_test/TestSubView_c15.hpp b/core/unit_test/TestSubView_c15.hpp index 6718e40ff5b..b51a4f18069 100644 --- a/core/unit_test/TestSubView_c15.hpp +++ b/core/unit_test/TestSubView_c15.hpp @@ -27,7 +27,7 @@ TEST(TEST_CATEGORY_DEATH, view_subview_constructor_layout_compatibility) { (void)Kokkos::View(a1, Kokkos::ALL, 1); // FIXME: This doesn't compile for BasicView, but should - //(void)Kokkos::View(a, Kokkos::ALL, 1); + // (void)Kokkos::View(a1, Kokkos::ALL, 1); } { // Using subview dims (1, ALL). For a LayoutLeft, diff --git a/core/unit_test/TestSubView_c16.hpp b/core/unit_test/TestSubView_c16.hpp new file mode 100644 index 00000000000..711123cdb5f --- /dev/null +++ b/core/unit_test/TestSubView_c16.hpp @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// SPDX-FileCopyrightText: Copyright Contributors to the Kokkos project + +#include +#include +#ifdef KOKKOS_ENABLE_EXPERIMENTAL_CXX20_MODULES +import kokkos.core; +#else +#include +#endif + +namespace { +// Test that the subview constructor works for constructing subviews from +// Views where one of them has the Kokkos::Unmanaged memory trait +TEST(TEST_CATEGORY, view_create_unmanaged_subview_from_managed) { + int N = 10; + using LR = Kokkos::LayoutRight; + using LL = Kokkos::LayoutLeft; + using LS = Kokkos::LayoutStride; + + Kokkos::View a1("A1", N, N); + Kokkos::View> a1_unmanaged( + a1.data(), N, N); + { + // Using subview dims (ALL, 1). For a LayoutLeft, + // any subview layout should be appropriate. + (void)Kokkos::View>( + a1, Kokkos::ALL, 1); + (void)Kokkos::View>( + a1, Kokkos::ALL, 1); + + (void)Kokkos::View(a1_unmanaged, Kokkos::ALL, 1); + (void)Kokkos::View(a1_unmanaged, Kokkos::ALL, 1); + // FIXME: This doesn't compile for BasicView, but should + // (void)Kokkos::View(a1_unmanaged, Kokkos::ALL, 1); + } + + Kokkos::View a2("A2", 1, N); + Kokkos::View> a2_unmanaged( + a2.data(), 1, N); + { + // Using subview dims (0, ALL). Any subview layout should be appropriate. + (void)Kokkos::View>( + a2, 0, Kokkos::ALL); + (void)Kokkos::View>( + a2, 0, Kokkos::ALL); + (void)Kokkos::View>( + a2, 0, Kokkos::ALL); + + (void)Kokkos::View(a2_unmanaged, 0, Kokkos::ALL); + (void)Kokkos::View(a2_unmanaged, 0, Kokkos::ALL); + (void)Kokkos::View(a2_unmanaged, 0, Kokkos::ALL); + } +} +} // namespace diff --git a/simd/src/Kokkos_SIMD.hpp b/simd/src/Kokkos_SIMD.hpp index 41f23cc55e9..d3fa40253a9 100644 --- a/simd/src/Kokkos_SIMD.hpp +++ b/simd/src/Kokkos_SIMD.hpp @@ -236,9 +236,9 @@ simd_unchecked_load(const T* ptr, return simd_unchecked_load>(ptr, flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::NonScalarAbi> KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto unchecked_gather_from( R&& in, const I& indices, simd_flags flag = simd_flag_default) { @@ -246,9 +246,9 @@ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto unchecked_gather_from( basic_simd>>(in, indices, flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::ScalarAbi> KOKKOS_FORCEINLINE_FUNCTION auto unchecked_gather_from( R&& in, const I& indices, simd_flags flag = simd_flag_default) { @@ -256,9 +256,9 @@ KOKKOS_FORCEINLINE_FUNCTION auto unchecked_gather_from( flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::NonScalarAbi> KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto unchecked_gather_from( R&& in, const typename I::mask_type& mask, const I& indices, @@ -268,9 +268,9 @@ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto unchecked_gather_from( flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::ScalarAbi> KOKKOS_FORCEINLINE_FUNCTION auto unchecked_gather_from( R&& in, const typename I::mask_type& mask, const I& indices, @@ -279,9 +279,9 @@ KOKKOS_FORCEINLINE_FUNCTION auto unchecked_gather_from( indices, flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::NonScalarAbi> KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto partial_gather_from( R&& in, const I& indices, simd_flags flag = simd_flag_default) { @@ -289,9 +289,9 @@ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto partial_gather_from( basic_simd>>(in, indices, flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::ScalarAbi> KOKKOS_FORCEINLINE_FUNCTION auto partial_gather_from( R&& in, const I& indices, simd_flags flag = simd_flag_default) { @@ -299,9 +299,9 @@ KOKKOS_FORCEINLINE_FUNCTION auto partial_gather_from( flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::NonScalarAbi> KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto partial_gather_from( R&& in, const typename I::mask_type& mask, const I& indices, @@ -311,9 +311,9 @@ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION auto partial_gather_from( flag); } -template > - requires std::ranges::sized_range && +template > + requires Impl::Ranges::sized_range && Impl::ScalarAbi> KOKKOS_FORCEINLINE_FUNCTION auto partial_gather_from( R&& in, const typename I::mask_type& mask, const I& indices, diff --git a/simd/src/Kokkos_SIMD_AVX2.hpp b/simd/src/Kokkos_SIMD_AVX2.hpp index 4ef953576df..ce65b5b8895 100644 --- a/simd/src/Kokkos_SIMD_AVX2.hpp +++ b/simd/src/Kokkos_SIMD_AVX2.hpp @@ -3466,7 +3466,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( double, simd_abi::avx2_fixed_size<4>, { __m128i idx = static_cast<__m128i>( basic_simd>{indices}); - return V(_mm256_i32gather_pd(std::ranges::data(in), idx, 8)); + return V(_mm256_i32gather_pd(Impl::Ranges::data(in), idx, 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3478,7 +3478,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( __m256d mmask = static_cast<__m256d>(basic_simd_mask{mask}); return V(_mm256_mask_i32gather_pd(_mm256_set1_pd(value_type{}), - std::ranges::data(in), idx, mmask, 8)); + Impl::Ranges::data(in), idx, mmask, 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3515,7 +3515,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( float, simd_abi::avx2_fixed_size<4>, { __m128i idx = static_cast<__m128i>( basic_simd>{indices}); - return V(_mm_i32gather_ps(std::ranges::data(in), idx, 4)); + return V(_mm_i32gather_ps(Impl::Ranges::data(in), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3527,7 +3527,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( __m128 mmask = static_cast<__m128>(basic_simd_mask{mask}); return V(_mm_mask_i32gather_ps(_mm_set1_ps(value_type{}), - std::ranges::data(in), idx, mmask, 4)); + Impl::Ranges::data(in), idx, mmask, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3564,7 +3564,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( float, simd_abi::avx2_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm256_i32gather_ps(std::ranges::data(in), idx, 4)); + return V(_mm256_i32gather_ps(Impl::Ranges::data(in), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3576,7 +3576,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( __m256 mmask = static_cast<__m256>(basic_simd_mask{mask}); return V(_mm256_mask_i32gather_ps(_mm256_set1_ps(value_type{}), - std::ranges::data(in), idx, mmask, 4)); + Impl::Ranges::data(in), idx, mmask, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3613,7 +3613,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::int32_t, simd_abi::avx2_fixed_size<4>, { __m128i idx = static_cast<__m128i>( basic_simd>{indices}); - return V(_mm_i32gather_epi32(std::ranges::data(in), idx, 4)); + return V(_mm_i32gather_epi32(Impl::Ranges::data(in), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3625,7 +3625,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( __m128i mmask = static_cast<__m128i>(basic_simd_mask{mask}); return V(_mm_mask_i32gather_epi32(_mm_set1_epi32(value_type{}), - std::ranges::data(in), idx, mmask, 4)); + Impl::Ranges::data(in), idx, mmask, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3662,7 +3662,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::int32_t, simd_abi::avx2_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm256_i32gather_epi32(std::ranges::data(in), idx, 4)); + return V(_mm256_i32gather_epi32(Impl::Ranges::data(in), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3674,7 +3674,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( __m256i mmask = static_cast<__m256i>(basic_simd_mask{mask}); return V(_mm256_mask_i32gather_epi32(_mm256_set1_epi32(value_type{}), - std::ranges::data(in), idx, mmask, + Impl::Ranges::data(in), idx, mmask, 4)); }) @@ -3713,7 +3713,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( __m128i idx = static_cast<__m128i>( basic_simd>{indices}); return V(_mm256_i32gather_epi64( - reinterpret_cast(std::ranges::data(in)), idx, 8)); + reinterpret_cast(Impl::Ranges::data(in)), idx, 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3726,8 +3726,8 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( static_cast<__m256i>(basic_simd_mask{mask}); return V(_mm256_mask_i32gather_epi64( _mm256_set1_epi64x(value_type{}), - reinterpret_cast(std::ranges::data(in)), idx, mmask, - 8)); + reinterpret_cast(Impl::Ranges::data(in)), idx, + mmask, 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3765,7 +3765,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( __m128i idx = static_cast<__m128i>( basic_simd>{indices}); return V(_mm256_i32gather_epi64( - reinterpret_cast(std::ranges::data(in)), idx, 8)); + reinterpret_cast(Impl::Ranges::data(in)), idx, 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3778,8 +3778,8 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( static_cast<__m256i>(basic_simd_mask{mask}); return V(_mm256_mask_i32gather_epi64( _mm256_set1_epi64x(value_type{}), - reinterpret_cast(std::ranges::data(in)), idx, mmask, - 8)); + reinterpret_cast(Impl::Ranges::data(in)), idx, + mmask, 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( diff --git a/simd/src/Kokkos_SIMD_AVX512.hpp b/simd/src/Kokkos_SIMD_AVX512.hpp index 47881832179..d4fd91a45b4 100644 --- a/simd/src/Kokkos_SIMD_AVX512.hpp +++ b/simd/src/Kokkos_SIMD_AVX512.hpp @@ -4015,7 +4015,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( double, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm512_i32gather_pd(idx, std::ranges::data(in), 8)); + return V(_mm512_i32gather_pd(idx, Impl::Ranges::data(in), 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4025,7 +4025,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm512_mask_i32gather_pd(_mm512_set1_pd(value_type{}), static_cast<__mmask8>(mask), idx, - std::ranges::data(in), 8)); + Impl::Ranges::data(in), 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4040,15 +4040,15 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( double, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm512_i32scatter_pd(std::ranges::data(out), idx, static_cast<__m512d>(v), - 8); + _mm512_i32scatter_pd(Impl::Ranges::data(out), idx, + static_cast<__m512d>(v), 8); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( double, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm512_mask_i32scatter_pd(std::ranges::data(out), + _mm512_mask_i32scatter_pd(Impl::Ranges::data(out), static_cast<__mmask8>(mask), idx, static_cast<__m512d>(v), 8); }) @@ -4065,7 +4065,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( float, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm256_i32gather_ps(std::ranges::data(in), idx, 4)); + return V(_mm256_i32gather_ps(Impl::Ranges::data(in), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4076,7 +4076,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( __m256 on = _mm256_castsi256_ps(_mm256_set1_epi32(-1)); __m256 m = _mm256_maskz_mov_ps(static_cast<__mmask8>(mask), on); return V(_mm256_mask_i32gather_ps(_mm256_set1_ps(value_type{}), - std::ranges::data(in), idx, m, 4)); + Impl::Ranges::data(in), idx, m, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4091,7 +4091,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( float, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm256_i32scatter_ps(std::ranges::data(out), idx, static_cast<__m256>(v), + _mm256_i32scatter_ps(Impl::Ranges::data(out), idx, static_cast<__m256>(v), 4); }) @@ -4099,7 +4099,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( float, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm256_mask_i32scatter_ps(std::ranges::data(out), + _mm256_mask_i32scatter_ps(Impl::Ranges::data(out), static_cast<__mmask8>(mask), idx, static_cast<__m256>(v), 4); }) @@ -4116,7 +4116,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( float, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - return V(_mm512_i32gather_ps(idx, std::ranges::data(in), 4)); + return V(_mm512_i32gather_ps(idx, Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4126,7 +4126,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm512_mask_i32gather_ps(_mm512_set1_ps(value_type{}), static_cast<__mmask16>(mask), idx, - std::ranges::data(in), 4)); + Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4141,7 +4141,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( float, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - _mm512_i32scatter_ps(std::ranges::data(out), idx, static_cast<__m512>(v), + _mm512_i32scatter_ps(Impl::Ranges::data(out), idx, static_cast<__m512>(v), 4); }) @@ -4149,7 +4149,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( float, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - _mm512_mask_i32scatter_ps(std::ranges::data(out), + _mm512_mask_i32scatter_ps(Impl::Ranges::data(out), static_cast<__mmask16>(mask), idx, static_cast<__m512>(v), 4); }) @@ -4166,7 +4166,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::int32_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm256_i32gather_epi32(std::ranges::data(in), idx, 4)); + return V(_mm256_i32gather_epi32(Impl::Ranges::data(in), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4176,7 +4176,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm256_mmask_i32gather_epi32(_mm256_set1_epi32(value_type{}), static_cast<__mmask8>(mask), idx, - std::ranges::data(in), 4)); + Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4191,7 +4191,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( std::int32_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm256_i32scatter_epi32(std::ranges::data(out), idx, + _mm256_i32scatter_epi32(Impl::Ranges::data(out), idx, static_cast<__m256i>(v), 4); }) @@ -4199,7 +4199,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( std::int32_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm256_mask_i32scatter_epi32(std::ranges::data(out), + _mm256_mask_i32scatter_epi32(Impl::Ranges::data(out), static_cast<__mmask8>(mask), idx, static_cast<__m256i>(v), 4); }) @@ -4216,7 +4216,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::int32_t, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - return V(_mm512_i32gather_epi32(idx, std::ranges::data(in), 4)); + return V(_mm512_i32gather_epi32(idx, Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4226,7 +4226,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm512_mask_i32gather_epi32(_mm512_set1_epi32(value_type{}), static_cast<__mmask16>(mask), idx, - std::ranges::data(in), 4)); + Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4241,7 +4241,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( std::int32_t, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - _mm512_i32scatter_epi32(std::ranges::data(out), idx, + _mm512_i32scatter_epi32(Impl::Ranges::data(out), idx, static_cast<__m512i>(v), 4); }) @@ -4249,7 +4249,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( std::int32_t, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - _mm512_mask_i32scatter_epi32(std::ranges::data(out), + _mm512_mask_i32scatter_epi32(Impl::Ranges::data(out), static_cast<__mmask16>(mask), idx, static_cast<__m512i>(v), 4); }) @@ -4267,7 +4267,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( __m256i idx = static_cast<__m256i>( basic_simd>{indices}); return V(_mm256_i32gather_epi32( - reinterpret_cast(std::ranges::data(in)), idx, 4)); + reinterpret_cast(Impl::Ranges::data(in)), idx, 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4277,7 +4277,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm256_mmask_i32gather_epi32(_mm256_set1_epi32(value_type{}), static_cast<__mmask8>(mask), idx, - std::ranges::data(in), 4)); + Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4292,7 +4292,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( std::uint32_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm256_i32scatter_epi32(std::ranges::data(out), idx, + _mm256_i32scatter_epi32(Impl::Ranges::data(out), idx, static_cast<__m256i>(v), 4); }) @@ -4300,7 +4300,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( std::uint32_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm256_mask_i32scatter_epi32(std::ranges::data(out), + _mm256_mask_i32scatter_epi32(Impl::Ranges::data(out), static_cast<__mmask8>(mask), idx, static_cast<__m256i>(v), 4); }) @@ -4317,7 +4317,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::uint32_t, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - return V(_mm512_i32gather_epi32(idx, std::ranges::data(in), 4)); + return V(_mm512_i32gather_epi32(idx, Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4327,7 +4327,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm512_mask_i32gather_epi32(_mm512_set1_epi32(value_type{}), static_cast<__mmask16>(mask), idx, - std::ranges::data(in), 4)); + Impl::Ranges::data(in), 4)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4342,7 +4342,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( std::uint32_t, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - _mm512_i32scatter_epi32(std::ranges::data(out), idx, + _mm512_i32scatter_epi32(Impl::Ranges::data(out), idx, static_cast<__m512i>(v), 4); }) @@ -4350,7 +4350,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( std::uint32_t, simd_abi::avx512_fixed_size<16>, { __m512i idx = static_cast<__m512i>( basic_simd>{indices}); - _mm512_mask_i32scatter_epi32(std::ranges::data(out), + _mm512_mask_i32scatter_epi32(Impl::Ranges::data(out), static_cast<__mmask16>(mask), idx, static_cast<__m512i>(v), 4); }) @@ -4367,7 +4367,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::int64_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm512_i32gather_epi64(idx, std::ranges::data(in), 8)); + return V(_mm512_i32gather_epi64(idx, Impl::Ranges::data(in), 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4377,7 +4377,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm512_mask_i32gather_epi64(_mm512_set1_epi64(value_type{}), static_cast<__mmask8>(mask), idx, - std::ranges::data(in), 8)); + Impl::Ranges::data(in), 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4392,7 +4392,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( std::int64_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm512_i32scatter_epi64(std::ranges::data(out), idx, + _mm512_i32scatter_epi64(Impl::Ranges::data(out), idx, static_cast<__m512i>(v), 8); }) @@ -4400,7 +4400,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( std::int64_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm512_mask_i32scatter_epi64(std::ranges::data(out), + _mm512_mask_i32scatter_epi64(Impl::Ranges::data(out), static_cast<__mmask8>(mask), idx, static_cast<__m512i>(v), 8); }) @@ -4417,7 +4417,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( std::uint64_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - return V(_mm512_i32gather_epi64(idx, std::ranges::data(in), 8)); + return V(_mm512_i32gather_epi64(idx, Impl::Ranges::data(in), 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -4427,7 +4427,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(_mm512_mask_i32gather_epi64(_mm512_set1_epi64(value_type{}), static_cast<__mmask8>(mask), idx, - std::ranges::data(in), 8)); + Impl::Ranges::data(in), 8)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -4442,7 +4442,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( std::uint64_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm512_i32scatter_epi64(std::ranges::data(out), idx, + _mm512_i32scatter_epi64(Impl::Ranges::data(out), idx, static_cast<__m512i>(v), 8); }) @@ -4450,7 +4450,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( std::uint64_t, simd_abi::avx512_fixed_size<8>, { __m256i idx = static_cast<__m256i>( basic_simd>{indices}); - _mm512_mask_i32scatter_epi64(std::ranges::data(out), + _mm512_mask_i32scatter_epi64(Impl::Ranges::data(out), static_cast<__mmask8>(mask), idx, static_cast<__m512i>(v), 8); }) diff --git a/simd/src/Kokkos_SIMD_Common.hpp b/simd/src/Kokkos_SIMD_Common.hpp index 8742afa36c6..3519758134d 100644 --- a/simd/src/Kokkos_SIMD_Common.hpp +++ b/simd/src/Kokkos_SIMD_Common.hpp @@ -12,12 +12,12 @@ import kokkos.core_impl; #include #endif #include +#include #include #include #include #include #include -#include namespace Kokkos { diff --git a/simd/src/Kokkos_SIMD_SVE.hpp b/simd/src/Kokkos_SIMD_SVE.hpp index 7e9f074eaa6..9cc37a86e89 100644 --- a/simd/src/Kokkos_SIMD_SVE.hpp +++ b/simd/src/Kokkos_SIMD_SVE.hpp @@ -3553,7 +3553,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( basic_simd>{indices}); return V(static_cast( - svld1_gather_index(svptrue_b64(), std::ranges::data(in), idx))); + svld1_gather_index(svptrue_b64(), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3562,7 +3562,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(static_cast(svld1_gather_index( - static_cast(mask), std::ranges::data(in), idx))); + static_cast(mask), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3578,7 +3578,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( vls_int64_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(svptrue_b64(), std::ranges::data(out), idx, + svst1_scatter_index(svptrue_b64(), Impl::Ranges::data(out), idx, static_cast(v)); }) @@ -3587,8 +3587,9 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( vls_int64_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(static_cast(mask), std::ranges::data(out), - idx, static_cast(v)); + svst1_scatter_index(static_cast(mask), + Impl::Ranges::data(out), idx, + static_cast(v)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_SCATTER_TO( @@ -3605,7 +3606,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( basic_simd>{indices}); return V(static_cast( - svld1_gather_index(svptrue_b32(), std::ranges::data(in), idx))); + svld1_gather_index(svptrue_b32(), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3614,7 +3615,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(static_cast(svld1_gather_index( - static_cast(mask), std::ranges::data(in), idx))); + static_cast(mask), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3630,7 +3631,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( vls_int32_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(svptrue_b32(), std::ranges::data(out), idx, + svst1_scatter_index(svptrue_b32(), Impl::Ranges::data(out), idx, static_cast(v)); }) @@ -3639,8 +3640,9 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( vls_int32_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(static_cast(mask), std::ranges::data(out), - idx, static_cast(v)); + svst1_scatter_index(static_cast(mask), + Impl::Ranges::data(out), idx, + static_cast(v)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_SCATTER_TO( @@ -3657,7 +3659,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( basic_simd>{indices}); return V(static_cast( - svld1_gather_index(svptrue_b32(), std::ranges::data(in), idx))); + svld1_gather_index(svptrue_b32(), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3666,7 +3668,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(static_cast(svld1_gather_index( - static_cast(mask), std::ranges::data(in), idx))); + static_cast(mask), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3682,7 +3684,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( vls_int32_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(svptrue_b32(), std::ranges::data(out), idx, + svst1_scatter_index(svptrue_b32(), Impl::Ranges::data(out), idx, static_cast(v)); }) @@ -3691,8 +3693,9 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( vls_int32_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(static_cast(mask), std::ranges::data(out), - idx, static_cast(v)); + svst1_scatter_index(static_cast(mask), + Impl::Ranges::data(out), idx, + static_cast(v)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_SCATTER_TO( @@ -3709,7 +3712,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( basic_simd>{indices}); return V(static_cast( - svld1_gather_index(svptrue_b32(), std::ranges::data(in), idx))); + svld1_gather_index(svptrue_b32(), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3718,7 +3721,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(static_cast(svld1_gather_index( - static_cast(mask), std::ranges::data(in), idx))); + static_cast(mask), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3734,7 +3737,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( vls_int32_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(svptrue_b32(), std::ranges::data(out), idx, + svst1_scatter_index(svptrue_b32(), Impl::Ranges::data(out), idx, static_cast(v)); }) @@ -3743,8 +3746,9 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( vls_int32_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(static_cast(mask), std::ranges::data(out), - idx, static_cast(v)); + svst1_scatter_index(static_cast(mask), + Impl::Ranges::data(out), idx, + static_cast(v)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_SCATTER_TO( @@ -3761,7 +3765,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( basic_simd>{indices}); return V(static_cast( - svld1_gather_index(svptrue_b64(), std::ranges::data(in), idx))); + svld1_gather_index(svptrue_b64(), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3770,7 +3774,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(static_cast(svld1_gather_index( - static_cast(mask), std::ranges::data(in), idx))); + static_cast(mask), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3786,7 +3790,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( vls_int64_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(svptrue_b64(), std::ranges::data(out), idx, + svst1_scatter_index(svptrue_b64(), Impl::Ranges::data(out), idx, static_cast(v)); }) @@ -3795,8 +3799,9 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( vls_int64_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(static_cast(mask), std::ranges::data(out), - idx, static_cast(v)); + svst1_scatter_index(static_cast(mask), + Impl::Ranges::data(out), idx, + static_cast(v)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_SCATTER_TO( @@ -3813,7 +3818,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM( basic_simd>{indices}); return V(static_cast( - svld1_gather_index(svptrue_b64(), std::ranges::data(in), idx))); + svld1_gather_index(svptrue_b64(), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( @@ -3822,7 +3827,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_GATHER_FROM_WITH_MASK( basic_simd>{indices}); return V(static_cast(svld1_gather_index( - static_cast(mask), std::ranges::data(in), idx))); + static_cast(mask), Impl::Ranges::data(in), idx))); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_GATHER_FROM( @@ -3838,7 +3843,7 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO( vls_uint64_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(svptrue_b64(), std::ranges::data(out), idx, + svst1_scatter_index(svptrue_b64(), Impl::Ranges::data(out), idx, static_cast(v)); }) @@ -3847,8 +3852,9 @@ KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_UNCHECKED_SCATTER_TO_WITH_MASK( vls_uint64_t idx = static_cast( basic_simd>{indices}); - svst1_scatter_index(static_cast(mask), std::ranges::data(out), - idx, static_cast(v)); + svst1_scatter_index(static_cast(mask), + Impl::Ranges::data(out), idx, + static_cast(v)); }) KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_PARTIAL_SCATTER_TO( diff --git a/simd/src/Kokkos_SIMD_Scalar.hpp b/simd/src/Kokkos_SIMD_Scalar.hpp index 114b55e10e0..40aade5bf14 100644 --- a/simd/src/Kokkos_SIMD_Scalar.hpp +++ b/simd/src/Kokkos_SIMD_Scalar.hpp @@ -518,9 +518,9 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr void simd_partial_store( } } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr V unchecked_gather_from( R&& in, const I& indices, simd_flags = simd_flag_default) { @@ -528,9 +528,9 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr V unchecked_gather_from( return basic_simd(in[indices[0]]); } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr V unchecked_gather_from( R&& in, const typename I::mask_type& mask, const I& indices, @@ -540,18 +540,18 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr V unchecked_gather_from( return basic_simd(val); } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr V partial_gather_from( R&& in, const I& indices, simd_flags = simd_flag_default) { return unchecked_gather_from(in, indices); } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr V partial_gather_from( R&& in, const typename I::mask_type& mask, const I& indices, @@ -559,9 +559,9 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr V partial_gather_from( return unchecked_gather_from(in, mask, indices); } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr void unchecked_scatter_to( const V& v, R&& out, const I& indices, @@ -569,9 +569,9 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr void unchecked_scatter_to( out[indices[0]] = v[0]; } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr void unchecked_scatter_to( const V& v, R&& out, const typename I::mask_type& mask, const I& indices, @@ -579,9 +579,9 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr void unchecked_scatter_to( out[indices[0]] = (mask[0]) ? v[0] : typename V::value_type{}; } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr void partial_scatter_to( const V& v, R&& out, const I& indices, @@ -589,9 +589,9 @@ KOKKOS_FORCEINLINE_FUNCTION constexpr void partial_scatter_to( unchecked_scatter_to(v, out, indices); } -template - requires std::ranges::sized_range && + requires Impl::Ranges::sized_range && std::same_as KOKKOS_FORCEINLINE_FUNCTION constexpr void partial_scatter_to( const V& v, R&& out, const typename I::mask_type& mask, const I& indices, diff --git a/simd/src/impl/Kokkos_SIMD_Impl_Macros.hpp b/simd/src/impl/Kokkos_SIMD_Impl_Macros.hpp index 53dcfd43592..db0451f7644 100644 --- a/simd/src/impl/Kokkos_SIMD_Impl_Macros.hpp +++ b/simd/src/impl/Kokkos_SIMD_Impl_Macros.hpp @@ -6,9 +6,9 @@ #define KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_GATHER_FROM(PREFIX, DATA_TYPE, \ ABI_TYPE, EXPR) \ - template \ - requires std::ranges::sized_range && \ + requires Impl::Ranges::sized_range && \ std::same_as> \ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION constexpr V PREFIX##_gather_from( \ R&& in, const I& indices, \ @@ -28,9 +28,9 @@ #define KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_GATHER_FROM_WITH_MASK( \ PREFIX, DATA_TYPE, ABI_TYPE, EXPR) \ - template \ - requires std::ranges::sized_range && \ + requires Impl::Ranges::sized_range && \ std::same_as> \ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION constexpr V PREFIX##_gather_from( \ R&& in, const typename I::mask_type& mask, const I& indices, \ @@ -50,9 +50,9 @@ #define KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_SCATTER_TO(PREFIX, DATA_TYPE, \ ABI_TYPE, EXPR) \ - template \ - requires std::ranges::sized_range && \ + requires Impl::Ranges::sized_range && \ std::same_as> \ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION constexpr void PREFIX##_scatter_to( \ const V& v, R&& out, const I& indices, \ @@ -71,9 +71,9 @@ #define KOKKOS_SIMD_IMPL_MEMORY_PERMUTE_SCATTER_TO_WITH_MASK( \ PREFIX, DATA_TYPE, ABI_TYPE, EXPR) \ - template \ - requires std::ranges::sized_range && \ + requires Impl::Ranges::sized_range && \ std::same_as> \ KOKKOS_IMPL_HOST_FORCEINLINE_FUNCTION constexpr void PREFIX##_scatter_to( \ const V& v, R&& out, const typename I::mask_type& mask, \ diff --git a/simd/src/impl/Kokkos_SIMD_RangesCtorSupport.hpp b/simd/src/impl/Kokkos_SIMD_RangesCtorSupport.hpp new file mode 100644 index 00000000000..6a23ba76781 --- /dev/null +++ b/simd/src/impl/Kokkos_SIMD_RangesCtorSupport.hpp @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// SPDX-FileCopyrightText: Copyright Contributors to the Kokkos project + +#ifndef KOKKOS_SIMD_RANGES_HPP +#define KOKKOS_SIMD_RANGES_HPP + +#include + +// FIXME: Some of the compiler versions we support come with standard +// library implementations which don't fully support C++20 ranges: +// - LLVM Clang 14, 15 +// - AppleClang 14 +// This file implements the minimal set of functionality to make the SIMD type +// ctors that take ranges work for types which otherwise would rely on ranges +// interop (e.g. standard containers). +#if defined(__cpp_lib_ranges) && (__cpp_lib_ranges >= 201911L) +#define KOKKOS_IMPL_COMPILER_SUPPORTS_CXX20_RANGES +#endif + +#if defined(KOKKOS_IMPL_COMPILER_SUPPORTS_CXX20_RANGES) +#include + +namespace Kokkos::Experimental::Impl::Ranges { +using std::ranges::contiguous_range; +using std::ranges::data; +using std::ranges::range_value_t; +using std::ranges::sized_range; +} // namespace Kokkos::Experimental::Impl::Ranges +#else +#include + +namespace Kokkos::Experimental::Impl::Ranges { + +// Use another nested Impl namespace to prevent accidental explicit +// usage of these symbols in the SIMD code - we want to only use +// the minimal set necessary for the constructors that take ranges +namespace Impl { +// We need to rely on ADL but "using" declarations cannot be used inside a +// requires clause, we use an immediately-invoked lambda returning the requires +// clause as an alternative. +template +concept range = []() { + using std::begin; + using std::end; + return requires(R& r) { + begin(r); + end(r); + }; +}(); + +inline constexpr auto begin = [](R&& r) { + using std::begin; + return begin(r); +}; + +template +using iterator_t = decltype(begin(std::declval())); + +template +using range_reference_t = decltype(*std::declval&>()); +} // namespace Impl + +inline constexpr auto data = [](R&& r) { + using std::data; + return data(r); +}; + +template +concept sized_range = Impl::range && []() { + using std::size; + return requires(R& r) { size(r); }; +}(); + +template +concept contiguous_range = + Impl::range && requires(R& r, Impl::iterator_t& it) { + { ++it } -> std::same_as&>; + { --it } -> std::same_as&>; + { it + 2 } -> std::same_as >; + { it - 2 } -> std::same_as >; + { it += 2 } -> std::same_as&>; + { it -= 2 } -> std::same_as&>; + { + it - it + } -> std::same_as > >::difference_type>; + { *it } -> std::same_as >; + { it[0] } -> std::same_as >; + { it < it } -> std::same_as; + { it > it } -> std::same_as; + { it <= it } -> std::same_as; + { it >= it } -> std::same_as; + requires std::is_same_v > >; + }; + +template +using range_value_t = typename std::iterator_traits< + std::remove_cvref_t > >::value_type; + +} // namespace Kokkos::Experimental::Impl::Ranges +#endif + +#endif