27#include <boost/mpl/range_c.hpp>
28#include <boost/mpl/for_each.hpp>
29#include <seastar/core/align.hh>
30#include <seastar/core/cacheline.hh>
31#include <seastar/util/modules.hh>
36SEASTAR_MODULE_EXPORT_BEGIN
38template <
size_t N,
int RW,
int LOC>
41template<
int RW,
int LOC>
46template <
size_t N,
int RW,
int LOC>
49 __builtin_prefetch(
reinterpret_cast<void*
>(ptr), RW, LOC);
50 std::atomic_signal_fence(std::memory_order_seq_cst);
51 prefetcher<N-cache_line_size, RW, LOC>(ptr + cache_line_size);
61template<
typename T,
int LOC = 3>
62void prefetch(T* ptr) {
66template<
typename Iterator,
int LOC = 3>
67void prefetch(Iterator begin, Iterator end) {
68 std::for_each(begin, end, [] (
auto v) { prefetch<decltype(*v), LOC>(v); });
71template<
size_t C,
typename T,
int LOC = 3>
72void prefetch_n(T** pptr) {
73 boost::mpl::for_each< boost::mpl::range_c<size_t,0,C> >( [pptr] (
size_t x) { prefetch<T, LOC>(*(pptr + x)); } );
76template<
size_t L,
int LOC = 3>
77void prefetch(
void* ptr) {
78 prefetcher<L*cache_line_size, 0, LOC>(
reinterpret_cast<uintptr_t
>(ptr));
81template<
size_t L,
typename Iterator,
int LOC = 3>
82void prefetch_n(Iterator begin, Iterator end) {
83 std::for_each(begin, end, [] (
auto v) { prefetch<L, LOC>(v); });
86template<
size_t L,
size_t C,
typename T,
int LOC = 3>
87void prefetch_n(T** pptr) {
88 boost::mpl::for_each< boost::mpl::range_c<size_t,0,C> >( [pptr] (
size_t x) { prefetch<L, LOC>(*(pptr + x)); } );
91template<
typename T,
int LOC = 3>
92void prefetchw(T* ptr) {
93 prefetcher<align_up(sizeof(T), cache_line_size), 1, LOC>(
reinterpret_cast<uintptr_t
>(ptr));
96template<
typename Iterator,
int LOC = 3>
97void prefetchw_n(Iterator begin, Iterator end) {
98 std::for_each(begin, end, [] (
auto v) { prefetchw<decltype(*v), LOC>(v); });
101template<
size_t C,
typename T,
int LOC = 3>
102void prefetchw_n(T** pptr) {
103 boost::mpl::for_each< boost::mpl::range_c<size_t,0,C> >( [pptr] (
size_t x) { prefetchw<T, LOC>(*(pptr + x)); } );
106template<
size_t L,
int LOC = 3>
107void prefetchw(
void* ptr) {
108 prefetcher<L*cache_line_size, 1, LOC>(
reinterpret_cast<uintptr_t
>(ptr));
111template<
size_t L,
typename Iterator,
int LOC = 3>
112void prefetchw_n(Iterator begin, Iterator end) {
113 std::for_each(begin, end, [] (
auto v) { prefetchw<L, LOC>(v); });
116template<
size_t L,
size_t C,
typename T,
int LOC = 3>
117void prefetchw_n(T** pptr) {
118 boost::mpl::for_each< boost::mpl::range_c<size_t,0,C> >( [pptr] (
size_t x) { prefetchw<L, LOC>(*(pptr + x)); } );
120SEASTAR_MODULE_EXPORT_END
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Definition: prefetch.hh:47