Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Datapar backend #2438

Merged
merged 3 commits into from Dec 28, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions CMakeLists.txt
Expand Up @@ -1150,6 +1150,10 @@ if(WIN32)
hpx_add_target_compile_option(-Gw
CONFIGURATIONS Release RelWithDebInfo MinSizeRelease)
hpx_add_target_compile_option(-Zo CONFIGURATIONS RelWithDebInfo)
if(HPX_WITH_DATAPAR_VC)
hpx_add_target_compile_option(-std:c++latest)
hpx_add_config_define(_HAS_AUTO_PTR_ETC 1)
endif()
endif()

# Exceptions
Expand Down
65 changes: 65 additions & 0 deletions hpx/parallel/traits/detail/vc/vector_pack_alignment_size.hpp
Expand Up @@ -15,6 +15,8 @@

#include <Vc/Vc>

#if Vc_IS_VERSION_1

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace parallel { namespace traits
{
Expand Down Expand Up @@ -118,6 +120,69 @@ namespace hpx { namespace parallel { namespace traits
};
}}}

#else

#include <Vc/datapar>

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace parallel { namespace traits
{
///////////////////////////////////////////////////////////////////////////
template <typename T, typename Abi>
struct is_vector_pack<Vc::datapar<T, Abi> >
: std::true_type
{};

///////////////////////////////////////////////////////////////////////////
template <typename T, typename Abi>
struct is_scalar_vector_pack
: std::false_type
{};

template <typename T>
struct is_scalar_vector_pack<Vc::datapar<T, Vc::datapar_abi::fixed_size<1> >
: std::true_type
{};

template <typename T>
struct is_scalar_vector_pack<Vc::datapar<T, Vc::datapar_abi::scalar> >
: std::true_type
{};

///////////////////////////////////////////////////////////////////////////
template <typename T, typename Abi>
struct is_non_scalar_vector_pack<Vc::datapar<T, Abi> >
: std::true_type
{};

template <typename T>
struct is_non_scalar_vector_pack<Vc::datapar<T, Vc::datapar_abi::fixed_size<1> >
: std::false_type
{};

template <typename T>
struct is_non_scalar_vector_pack<Vc::datapar<T, Vc::datapar_abi::scalar> >
: std::false_type
{};

///////////////////////////////////////////////////////////////////////////
template <typename T, typename Enable>
struct vector_pack_alignment
{
static std::size_t const value =
Vc::memory_alignment<Vc::datapar<T> >::value;
};

///////////////////////////////////////////////////////////////////////////
template <typename T, typename Enable>
struct vector_pack_size
{
static std::size_t const value = Vc::datapar<T>::size();
};
}}}

#endif // Vc_IS_VERSION_1

#endif
#endif

19 changes: 19 additions & 0 deletions hpx/parallel/traits/detail/vc/vector_pack_count_bits.hpp
Expand Up @@ -14,6 +14,8 @@

#include <Vc/Vc>

#if Vc_IS_VERSION_1

namespace hpx { namespace parallel { namespace traits
{
///////////////////////////////////////////////////////////////////////
Expand All @@ -25,6 +27,23 @@ namespace hpx { namespace parallel { namespace traits
}
}}}

#else

#include <Vc/datapar>

namespace hpx { namespace parallel { namespace traits
{
///////////////////////////////////////////////////////////////////////
template <typename T, typename Abi>
HPX_HOST_DEVICE HPX_FORCEINLINE
std::size_t count_bits(Vc::mask<T, Abi> const& mask)
{
return Vc::popcount(mask);
}
}}}

#endif // Vc_IS_VERSION_1

#endif
#endif

75 changes: 72 additions & 3 deletions hpx/parallel/traits/detail/vc/vector_pack_load_store.hpp
Expand Up @@ -17,6 +17,8 @@

#include <Vc/Vc>

#if Vc_IS_VERSION_1

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace parallel { namespace traits
{
Expand All @@ -27,7 +29,8 @@ namespace hpx { namespace parallel { namespace traits
typedef Vc::Vector<NewT, Abi> type;
};

template <typename T, std::size_t N, typename V, std::size_t W, typename NewT>
template <typename T, std::size_t N, typename V, std::size_t W,
typename NewT>
struct rebind_pack<Vc::SimdArray<T, N, V, W>, NewT>
{
typedef Vc::SimdArray<NewT, N, V, W> type;
Expand Down Expand Up @@ -99,7 +102,8 @@ namespace hpx { namespace parallel { namespace traits
}
};

template <typename Value, typename T, std::size_t N, typename V, std::size_t W>
template <typename Value, typename T, std::size_t N, typename V,
std::size_t W>
struct vector_pack_load<Value, Vc::SimdArray<T, N, V, W> >
{
template <typename Iter>
Expand Down Expand Up @@ -150,7 +154,8 @@ namespace hpx { namespace parallel { namespace traits
}
};

template <typename Value, typename T, std::size_t N, typename V, std::size_t W>
template <typename Value, typename T, std::size_t N, typename V,
std::size_t W>
struct vector_pack_store<Value, Vc::SimdArray<T, N, V, W> >
{
template <typename Iter>
Expand All @@ -167,5 +172,69 @@ namespace hpx { namespace parallel { namespace traits
};
}}}

#else

#include <Vc/datapar>

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace parallel { namespace traits
{
///////////////////////////////////////////////////////////////////////////
template <typename T, typename Abi, typename NewT>
struct rebind_pack<Vc::datapar<T, Abi>, NewT>
{
typedef Vc::datapar<NewT, Abi> type;
};

// don't wrap types twice
template <typename T, typename Abi1, typename NewT, typename Abi2>
struct rebind_pack<Vc::datapar<T, Abi1>, Vc::datapar<NewT, Abi2> >
{
typedef Vc::datapar<NewT, Abi2> type;
};

///////////////////////////////////////////////////////////////////////////
template <typename V, typename ValueType, typename Enable>
struct vector_pack_load
{
template <typename Iter>
static typename rebind_pack<V, ValueType>::type
aligned(Iter const& iter)
{
typedef typename rebind_pack<V, ValueType>::type vector_pack_type;
return vector_pack_type(std::addressof(*iter),
Vc::flags::vector_aligned_tag);
}

template <typename Iter>
static typename rebind_pack<V, ValueType>::type
unaligned(Iter const& iter)
{
typedef typename rebind_pack<V, ValueType>::type vector_pack_type;
return vector_pack_type(std::addressof(*iter),
Vc::flags::element_aligned_tag);
}
};

///////////////////////////////////////////////////////////////////////////
template <typename V, typename ValueType, typename Enable>
struct vector_pack_store
{
template <typename Iter>
static void aligned(V const& value, Iter const& iter)
{
value.copy_to(std::addressof(*iter), Vc::flags::vector_aligned_tag);
}

template <typename Iter>
static void unaligned(V const& value, Iter const& iter)
{
value.copy_to(std::addressof(*iter), Vc::flags::element_aligned_tag);
}
};
}}}

#endif // Vc_IS_VERSION_1

#endif
#endif
55 changes: 55 additions & 0 deletions hpx/parallel/traits/detail/vc/vector_pack_type.hpp
Expand Up @@ -16,6 +16,8 @@

#include <Vc/Vc>

#if Vc_IS_VERSION_1

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace parallel { namespace traits
{
Expand Down Expand Up @@ -72,6 +74,59 @@ namespace hpx { namespace parallel { namespace traits
};
}}}

#else

#include <Vc/datapar>

///////////////////////////////////////////////////////////////////////////////
namespace hpx { namespace parallel { namespace traits
{
///////////////////////////////////////////////////////////////////////////
namespace detail
{
// specifying both, N and an Abi is not allowed
template <typename T, std::size_t N, typename Abi>
struct vector_pack_type;

template <typename T, std::size_t N>
struct vector_pack_type<T, N, void>
{
typedef Vc::datapar<T, Vc::datapar_abi::fixed_size<N> > type;
};

template <typename T, typename Abi>
struct vector_pack_type<T, 0, Abi>
{
typedef typename std::conditional<
std::is_void<Abi>::value, Vc::datapar_abi::native, Abi
>::type abi_type;

typedef Vc::datapar<T, abi_type> type;
};

template <typename T, typename Abi>
struct vector_pack_type<T, 1, Abi>
{
typedef Vc::datapar<T, Vc::datapar_abi::scalar> type;
};
}

///////////////////////////////////////////////////////////////////////////
template <typename T, std::size_t N, typename Abi>
struct vector_pack_type
: detail::vector_pack_type<T, N, Abi>
{};

// don't wrap types twice
template <typename T, std::size_t N, typename Abi1, typename Abi2>
struct vector_pack_type<Vc::datapar<T, Abi1>, N, Abi2>
{
typedef Vc::datapar<T, Abi1> type;
};
}}}

#endif // Vc_IS_VERSION_1

#endif
#endif