The simd module contains a unified interface to provide simd types and functions used in seqan3.
More...
|
template<uint8_t index, simd::simd_concept simd_t> |
constexpr simd_t | seqan3::detail::extract_eighth (simd_t const &src) |
| Extracts one eighth of the given simd vector and stores it in the lower eighth of the target vector. More...
|
|
template<uint8_t index, simd::simd_concept simd_t> |
constexpr simd_t | seqan3::detail::extract_half (simd_t const &src) |
| Extracts one half of the given simd vector and stores the result in the lower half of the target vector. More...
|
|
template<size_t divisor, simd_concept simd_t> |
constexpr simd_t | seqan3::detail::extract_impl (simd_t const &src, uint8_t const mask) |
| Helper function to extract a part of the given simd vector. More...
|
|
template<uint8_t index, simd::simd_concept simd_t> |
constexpr simd_t | seqan3::detail::extract_quarter (simd_t const &src) |
| Extracts one quarter of the given simd vector and stores it in the lower quarter of the target vector. More...
|
|
template<simd::simd_concept simd_t> |
constexpr simd_t | seqan3::simd::fill (typename simd_traits< simd_t >::scalar_type const scalar) noexcept |
| Fills a seqan3::simd::simd_type vector with a scalar value. More...
|
|
template<simd::simd_concept simd_t, size_t... I> |
constexpr simd_t | seqan3::detail::fill_impl (typename simd_traits< simd_t >::scalar_type const scalar, std::index_sequence< I... >) noexcept |
| Helper function for seqan3::simd::fill.
|
|
template<simd::simd_concept simd_t> |
constexpr simd_t | seqan3::simd::iota (typename simd_traits< simd_t >::scalar_type const offset) |
| Fills a seqan3::simd::simd_type vector with the scalar values offset, offset+1, offset+2, ... More...
|
|
template<simd::simd_concept simd_t, typename scalar_t , scalar_t... I> |
constexpr simd_t | seqan3::detail::iota_impl (scalar_t const offset, std::integer_sequence< scalar_t, I... >) |
| Helper function for seqan3::simd::iota.
|
|
template<simd::simd_concept simd_t> |
constexpr simd_t | seqan3::simd::load (void const *mem_addr) |
| Load simd_t size bits of integral data from memory. More...
|
|
template<typename char_t , typename simd_t > |
debug_stream_type< char_t > & | seqan3::operator<< (debug_stream_type< char_t > &s, simd_t &&simd) |
| Overload for debug_stream for simd types. More...
|
|
template<simd::simd_concept simd_t> |
constexpr void | seqan3::simd::transpose (std::array< simd_t, simd_traits< simd_t >::length > &matrix) |
| Transposes the given simd vector matrix. More...
|
|
template<simd::simd_concept target_simd_t, simd::simd_concept source_simd_t> |
constexpr target_simd_t | seqan3::simd::upcast (source_simd_t const &src) |
| Upcasts the given vector into the target vector using sign extension of packed values. More...
|
|
template<simd::simd_concept target_simd_t, simd::simd_concept source_simd_t> |
constexpr target_simd_t | seqan3::detail::upcast_signed (source_simd_t const &src) |
| Upcasts the given vector into the target vector using signed extension of packed values. More...
|
|
template<simd::simd_concept target_simd_t, simd::simd_concept source_simd_t> |
constexpr target_simd_t | seqan3::detail::upcast_unsigned (source_simd_t const &src) |
| Upcasts the given vector into the target vector using unsigned extension of packed values. More...
|
|
The simd module contains a unified interface to provide simd types and functions used in seqan3.
template<simd_concept index_simd_t>
An iota view over a simd vector.
- Template Parameters
-
This view is an equivalent implementation to:
int main()
{
{
return seqan3::simd::fill<uint16x8_t>(idx);
});
for (auto && simd_id : simd_iota_view)
return 0;
}
constexpr simd_t iota(typename simd_traits< simd_t >::scalar_type const offset)
Fills a seqan3::simd::simd_type vector with the scalar values offset, offset+1, offset+2,...
Definition: algorithm.hpp:299
decltype(detail::transform< trait_t >(list_t{})) transform
Apply a transformation trait to every type in the list and return a seqan3::type_list of the results.
Definition: traits.hpp:434
Adaptations of concepts from the Ranges TS.
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
.
View properties
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.
Example
int main()
{
for (auto && simd_id : seqan3::views::iota_simd<uint16x8_t>(0, 10))
return 0;
}
template<simd::simd_concept simd_t>
constexpr auto seqan3::views::to_simd |
|
inlineconstexpr |
A view that transforms a range of ranges into chunks of seqan3::simd vectors.
- Template Parameters
-
urng_t | The type of the range being processed. |
simd_t | The target simd vector type. |
- Parameters
-
[in] | urange | The range being processed. |
[in] | padding | An optional padding value. |
- Returns
- A range of ranges with the original sequences transformed into simd vectors.
Header File
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.
View properties
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).
- the expression
std::ranges::input_range<std::ranges::range_value_t<urng_t>
must evaluate to true
- the expression
std::default_initializable<std::ranges::range_value_t<urng_t>>
must evaluate to true
- the expression
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.
- for more details, see Views.
Example
int main()
{
using seqan3::operator""_dna4;
batch.
push_back(
"AGTGAGCTACGGACTAGCTACGACT"_dna4);
batch.
push_back(
"GACTAGCACGAGCGAGATCG"_dna4);
batch.
push_back(
"ACGTACGACGGACGTACGAGCGAGCTACGAGC"_dna4);
batch.
push_back(
"GTACGGATGGTAAACCGCACAT"_dna4);
auto to_soa = batch | seqan3::views::to_simd<uint16x8_t>(8);
size_t chunk_count = 0;
for (auto && chunk : to_soa)
{
for (auto & vec : chunk)
}
return 0;
}
Provides seqan3::dna4, container aliases and string literals.
The output is as follows:
Chunk 0:
[0,0,2,2,0,0,2,8]
[1,2,0,2,1,1,3,8]
[2,3,1,0,2,2,0,8]
[3,2,3,3,3,0,1,8]
[0,0,0,1,0,3,2,8]
[1,2,2,2,1,1,2,8]
[2,1,1,0,2,2,0,8]
[3,3,0,1,0,0,3,8]
Chunk 1:
[0,0,1,2,1,1,2,8]
[1,1,2,2,2,2,2,8]
[2,2,0,0,2,0,3,8]
[3,2,2,1,0,1,0,8]
[0,0,1,3,1,3,0,8]
[1,1,2,0,2,0,0,8]
[2,3,0,2,3,2,1,8]
[0,0,2,1,0,1,1,8]
Chunk 2:
[3,2,0,8,1,2,2,8]
[1,1,3,8,2,0,1,8]
[2,3,1,8,0,1,0,8]
[8,0,2,8,2,8,1,8]
[8,1,8,8,1,8,0,8]
[8,2,8,8,2,8,3,8]
[8,0,8,8,0,8,8,8]
[8,1,8,8,2,8,8,8]
Chunk 3:
[8,3,8,8,1,8,8,8]
[8,8,8,8,3,8,8,8]
[8,8,8,8,0,8,8,8]
[8,8,8,8,1,8,8,8]
[8,8,8,8,2,8,8,8]
[8,8,8,8,0,8,8,8]
[8,8,8,8,2,8,8,8]
[8,8,8,8,1,8,8,8]