Skip to content

Commit 7d9aaf7

Browse files
committed
Require HPX V1.8.1, use HPX policy conversion functions, github action fixes
1 parent bbc339d commit 7d9aaf7

7 files changed

Lines changed: 85 additions & 62 deletions

File tree

.github/workflows/linux_hpx.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
- name: Build
2727
shell: bash
2828
run: |
29-
make install
29+
make
3030
- name: Test
3131
shell: bash
3232
run: |

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ if(LINALG_ENABLE_KOKKOS)
155155
endif()
156156

157157
if(LINALG_ENABLE_HPX)
158-
find_package(HPX 1.8 REQUIRED)
158+
find_package(HPX 1.8.1 REQUIRED)
159159
target_link_libraries(linalg INTERFACE HPX::hpx)
160160
target_include_directories(linalg INTERFACE
161161
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/tpl-implementations/include>

examples/hpx-based/add_hpx.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ int main(int argc, char* argv[])
4646
value_type* y_ptr = y_data.data();
4747
value_type* z_ptr = z_data.data();
4848

49-
using dyn_1d_ext_type =
50-
std::experimental::extents<std::experimental::dynamic_extent>;
49+
using dyn_1d_ext_type = std::experimental::extents<std::size_t,
50+
std::experimental::dynamic_extent>;
5151
using mdspan_type = std::experimental::mdspan<value_type, dyn_1d_ext_type>;
5252
mdspan_type x(x_ptr, N);
5353
mdspan_type y(y_ptr, N);

examples/hpx-based/scale_hpx.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <experimental/linalg>
77
#include <experimental/mdspan>
88

9+
#include <cstddef>
910
#include <iostream>
1011

1112
int main(int argc, char* argv[])
@@ -20,7 +21,7 @@ int main(int argc, char* argv[])
2021
// Requires CTAD working, GCC 11.1 works but some others are buggy
2122
// std::experimental::mdspan a(a_ptr,N);
2223
std::experimental::mdspan<double,
23-
std::experimental::extents<std::experimental::dynamic_extent>>
24+
std::experimental::extents<std::size_t, std::experimental::dynamic_extent>>
2425
a(a_ptr, N);
2526
for (std::size_t i = 0; i < a.extent(0); i++)
2627
a(i) = double(i);

tpl-implementations/include/experimental/__p1673_bits/hpx-kernels/blas1_add_hpx.hpp

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
#include <cstddef>
5353
#include <type_traits>
5454

55+
#include "exec_policy_wrapper_hpx.hpp"
5556
#include "signal_hpx_impl_called.hpp"
5657

5758
namespace HPXKernelsSTD {
@@ -84,49 +85,48 @@ void add_rank_1(ExPolicy&& policy,
8485
y.static_extent(0) == std::experimental::dynamic_extent ||
8586
x.static_extent(0) == y.static_extent(0));
8687

87-
#if defined(HPX_HAVE_DATAPAR)
88-
using mdspan_x_t = std::experimental::mdspan<ElementType_x,
89-
std::experimental::extents<SizeType_x, ext_x>, Layout_x, Accessor_x>;
90-
using mdspan_y_t = std::experimental::mdspan<ElementType_y,
91-
std::experimental::extents<SizeType_y, ext_y>, Layout_y, Accessor_y>;
92-
using mdspan_z_t = std::experimental::mdspan<ElementType_z,
93-
std::experimental::extents<SizeType_z, ext_z>, Layout_z, Accessor_z>;
94-
95-
constexpr bool allow_explicit_vectorization =
96-
std::is_arithmetic_v<ElementType_x> &&
97-
std::is_arithmetic_v<ElementType_y> &&
98-
std::is_arithmetic_v<ElementType_z> &&
99-
mdspan_x_t::is_always_contiguous() &&
100-
mdspan_y_t::is_always_contiguous() &&
101-
mdspan_z_t::is_always_contiguous() &&
102-
(hpx::is_vectorpack_execution_policy_v<ExPolicy> ||
103-
hpx::is_unsequenced_execution_policy_v<ExPolicy>);
104-
105-
if constexpr (allow_explicit_vectorization)
88+
if constexpr (supports_vectorization_v<ExPolicy>)
10689
{
107-
// vectorize only if the arrays are contiguous and not strided
108-
if (x.is_contiguous() && x.stride(0) == 1 && y.is_contiguous() &&
109-
y.stride(0) == 1 && z.is_contiguous() && z.stride(0) == 1)
90+
using mdspan_x_t = std::experimental::mdspan<ElementType_x,
91+
std::experimental::extents<SizeType_x, ext_x>, Layout_x,
92+
Accessor_x>;
93+
using mdspan_y_t = std::experimental::mdspan<ElementType_y,
94+
std::experimental::extents<SizeType_y, ext_y>, Layout_y,
95+
Accessor_y>;
96+
using mdspan_z_t = std::experimental::mdspan<ElementType_z,
97+
std::experimental::extents<SizeType_z, ext_z>, Layout_z,
98+
Accessor_z>;
99+
100+
if constexpr (allow_vectorization_v<mdspan_x_t> &&
101+
allow_vectorization_v<mdspan_y_t> &&
102+
allow_vectorization_v<mdspan_z_t>)
110103
{
111-
auto zip = hpx::util::make_zip_iterator(x.data(), y.data());
112-
hpx::transform(policy, zip, zip + x.extent(0), z.data(),
113-
[&](auto v) { return hpx::get<0>(v) + hpx::get<1>(v); });
104+
// vectorize only if the arrays are contiguous and not strided
105+
if (x.is_contiguous() && x.stride(0) == 1 && y.is_contiguous() &&
106+
y.stride(0) == 1 && z.is_contiguous() && z.stride(0) == 1)
107+
{
108+
auto zip = hpx::util::make_zip_iterator(x.data(), y.data());
109+
hpx::transform(policy, zip, zip + x.extent(0), z.data(),
110+
[&](auto v) { return hpx::get<0>(v) + hpx::get<1>(v); });
111+
}
112+
else
113+
{
114+
// fall back to the underlying base policy
115+
hpx::experimental::for_loop(
116+
hpx::execution::experimental::to_non_simd(policy),
117+
SizeType_z(0), x.extent(0),
118+
[&](auto i) { z(i) = x(i) + y(i); });
119+
}
114120
}
115121
else
116122
{
117-
// fall back to the underlying base policy
118-
hpx::experimental::for_loop(policy.base_policy(), SizeType_z(0),
119-
x.extent(0), [&](auto i) { z(i) = x(i) + y(i); });
123+
hpx::experimental::for_loop(
124+
hpx::execution::experimental::to_non_simd(policy),
125+
SizeType_z(0), z.extent(0),
126+
[&](auto i) { z(i) = x(i) + y(i); });
120127
}
121128
}
122129
else
123-
if constexpr (hpx::is_vectorpack_execution_policy_v<ExPolicy>)
124-
{
125-
hpx::experimental::for_loop(policy.base_policy(), SizeType_z(0),
126-
z.extent(0), [&](auto i) { z(i) = x(i) + y(i); });
127-
}
128-
else
129-
#endif
130130
{
131131
hpx::experimental::for_loop(policy, SizeType_z(0), z.extent(0),
132132
[&](auto i) { z(i) = x(i) + y(i); });

tpl-implementations/include/experimental/__p1673_bits/hpx-kernels/blas1_scale_hpx.hpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <cstddef>
1212
#include <type_traits>
1313

14+
#include "exec_policy_wrapper_hpx.hpp"
1415
#include "signal_hpx_impl_called.hpp"
1516

1617
namespace HPXKernelsSTD {
@@ -24,37 +25,35 @@ void linalg_scale_rank_1(ExPolicy&& policy, const Scalar alpha,
2425
std::experimental::extents<SizeType, ext0>, Layout, Accessor>
2526
x)
2627
{
27-
#if defined(HPX_HAVE_DATAPAR)
28-
using mdspan_t = std::experimental::mdspan<ElementType,
29-
std::experimental::extents<SizeType, ext0>, Layout, Accessor>;
30-
31-
constexpr bool allow_explicit_vectorization =
32-
std::is_arithmetic_v<ElementType> && mdspan_t::is_always_contiguous() &&
33-
(hpx::is_vectorpack_execution_policy_v<ExPolicy> ||
34-
hpx::is_unsequenced_execution_policy_v<ExPolicy>);
35-
36-
if constexpr (allow_explicit_vectorization)
28+
if constexpr (supports_vectorization_v<ExPolicy>)
3729
{
38-
// vectorize only if the array is contiguous and not strided
39-
if (x.is_contiguous() && x.stride(0) == 1)
30+
using mdspan_t = std::experimental::mdspan<ElementType,
31+
std::experimental::extents<SizeType, ext0>, Layout, Accessor>;
32+
33+
if constexpr (allow_vectorization_v<mdspan_t>)
4034
{
41-
hpx::for_each(policy, x.data(), x.data() + x.extent(0),
42-
[&](auto& v) { v *= alpha; });
35+
// vectorize only if the array is contiguous and not strided
36+
if (x.is_contiguous() && x.stride(0) == 1)
37+
{
38+
hpx::for_each(policy, x.data(), x.data() + x.extent(0),
39+
[&](auto& v) { v *= alpha; });
40+
}
41+
else
42+
{
43+
// fall back to the underlying base policy
44+
hpx::experimental::for_loop(
45+
hpx::execution::experimental::to_non_simd(policy),
46+
SizeType(0), x.extent(0), [&](auto i) { x(i) *= alpha; });
47+
}
4348
}
4449
else
4550
{
46-
// fall back to the underlying base policy
47-
hpx::experimental::for_loop(policy.base_policy(), SizeType(0),
51+
hpx::experimental::for_loop(
52+
hpx::execution::experimental::to_non_simd(policy), SizeType(0),
4853
x.extent(0), [&](auto i) { x(i) *= alpha; });
4954
}
5055
}
51-
else if constexpr (hpx::is_vectorpack_execution_policy_v<ExPolicy>)
52-
{
53-
hpx::experimental::for_loop(policy.base_policy(), SizeType(0),
54-
x.extent(0), [&](auto i) { x(i) *= alpha; });
55-
}
5656
else
57-
#endif
5857
{
5958
hpx::experimental::for_loop(
6059
policy, SizeType(0), x.extent(0), [&](auto i) { x(i) *= alpha; });

tpl-implementations/include/experimental/__p1673_bits/hpx-kernels/exec_policy_wrapper_hpx.hpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#ifdef LINALG_ENABLE_HPX_DEFAULT
99
#include <execution>
1010
#endif
11+
#include <type_traits>
1112
#include <utility>
1213

1314
namespace HPXKernelsSTD {
@@ -24,6 +25,28 @@ auto execpolicy_mapper(hpx_exec<ExPolicy> policy)
2425
{
2526
return policy;
2627
}
28+
29+
template <typename MdSpan, typename Enable = void>
30+
struct allow_vectorization : std::false_type
31+
{};
32+
33+
#if defined(HPX_WITH_DATAPAR)
34+
template <typename MdSpan>
35+
struct allow_vectorization<MdSpan,
36+
std::enable_if_t<std::is_arithmetic_v<typename MdSpan::element_type>>>
37+
: std::true_type
38+
{};
39+
#endif
40+
41+
template <typename MdSpan>
42+
inline constexpr bool allow_vectorization_v =
43+
allow_vectorization<MdSpan>::value;
44+
45+
template <typename ExPolicy>
46+
inline constexpr bool supports_vectorization_v =
47+
hpx::is_vectorpack_execution_policy_v<ExPolicy> ||
48+
hpx::is_unsequenced_execution_policy_v<ExPolicy>;
49+
2750
} // namespace HPXKernelsSTD
2851

2952
// Remap standard execution policies to HPX

0 commit comments

Comments
 (0)