SeqAn3 3.4.0-rc.1
The Modern C++ library for sequence analysis.
|
SIMD related views. More...
Classes | |
class | seqan3::detail::counted_simd_iterator< index_simd_t > |
Implements a special version of a counted iterator over a simd vector. More... | |
class | seqan3::detail::iota_simd_view< index_simd_t > |
The simd iota view. More... | |
struct | seqan3::detail::iota_simd_view_fn< index_simd_t > |
The view adaptor returning the seqan3::detail::iota_simd_view. More... | |
struct | seqan3::detail::to_simd_fn< simd_t > |
views::to_simd's range adaptor closure object type. More... | |
class | seqan3::detail::view_to_simd< urng_t, simd_t > |
Transforms a range of ranges into chunks of seqan3::simd vectors. More... | |
Variables | |
template<simd_concept index_simd_t> | |
constexpr detail::iota_simd_view_fn< index_simd_t > | seqan3::views::iota_simd |
An iota view over a simd vector. | |
template<simd::simd_concept simd_t> | |
constexpr auto | seqan3::views::to_simd |
A view that transforms a range of ranges into chunks of seqan3::simd vectors. | |
SIMD related views.
|
inlineconstexpr |
An iota view over a simd vector.
index_simd_t | The represented index type; must model seqan3::simd::simd_concept. |
This view is an equivalent implementation to:
However, benchmarks showed that increasing a simd vector is faster than constructing it every time (up-to 2x speed-up). This speed-up justifies an own class that does this task more efficiently.
This view is a lightweight wrapper around a seqan3::detail::counted_simd_iterator pair. Note the regular std::views::iota view cannot be used with two simd types:
because the return type of the comparison of two simd vector types is not convertible to bool
.
Concepts and traits | rrng_t (returned range type) |
---|---|
std::ranges::input_range | guaranteed |
std::ranges::forward_range | guaranteed |
std::ranges::bidirectional_range | lost |
std::ranges::random_access_range | lost |
std::ranges::contiguous_range | lost |
std::ranges::viewable_range | guaranteed |
std::ranges::view | guaranteed |
std::ranges::sized_range | guaranteed |
std::ranges::common_range | guaranteed |
std::ranges::output_range | lost |
std::ranges::borrowed_range | guaranteed |
seqan3::const_iterable_range | guaranteed |
std::ranges::range_reference_t | index_simd_t |
This is a source view. For more details, see views.
|
inlineconstexpr |
A view that transforms a range of ranges into chunks of seqan3::simd vectors.
urng_t | The type of the range being processed. |
simd_t | The target simd vector type. |
[in] | urange | The range being processed. |
[in] | padding | An optional padding value. |
Header File
#include <seqan3/utility/simd/views/to_simd.hpp>
This view can be used to transform a collection of sequences into chunks of simd vectors. This transformation is also known as Array-of-Structure to Structure-of-Array transformation. It is used to transform the memory layout of the sequences to a more efficient form when used in vectorised algorithms. The number of sequences contained in the range to be transformed cannot be larger than the number of elements stored in the target simd vector, i.e. the size of urange
<= simd_traits<simd_t>::length. After applying the transformation one column of the outer range is transposed into a simd vector. This means that the characters of all sequences at a given position x
are stored in a simd vector retaining the original order. The returned range itself is a range-of-ranges. When dereferencing the iterator a std::span over a std::array with at most simd length many vectors is returned. If a sequence is empty or ends before the largest sequence in the collection, it can be padded with an optional value.
Concepts and traits | urng_t (underlying range type) | rrng_t (returned range type) |
---|---|---|
std::ranges::input_range | required | preserved |
std::ranges::forward_range | required | lost |
std::ranges::bidirectional_range | lost | |
std::ranges::random_access_range | lost | |
std::ranges::contiguous_range | lost | |
std::ranges::viewable_range | required | guaranteed |
std::ranges::view | guaranteed | |
std::ranges::sized_range | preserved (iff std::ranges::sized_range<std::ranges::range_value_t<urng_t>> is true ) | |
std::ranges::common_range | lost | |
std::ranges::output_range | lost | |
seqan3::const_iterable_range | lost | |
std::ranges::range_reference_t | std::span<simd_t> |
urng_t
is the type of the range modified by this view (input).std::ranges::input_range<std::ranges::range_value_t<urng_t>
must evaluate to true
std::default_initializable<std::ranges::range_value_t<urng_t>>
must evaluate to true
semialphabet<std::ranges::range_value_t<std::ranges::range_value_t<urng_t>>>
must evaluate to true
rrng_type
is the type of the range returned by this view.The output is as follows: