24 #ifndef SEASTAR_MODULE
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>
36 SEASTAR_MODULE_EXPORT_BEGIN
38 template <
size_t N,
int RW,
int LOC>
41 template<
int RW,
int LOC>
46 template <
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);
61 template<
typename T,
int LOC = 3>
62 void prefetch(T* ptr) {
66 template<
typename Iterator,
int LOC = 3>
67 void prefetch(Iterator begin, Iterator end) {
68 std::for_each(begin, end, [] (
auto v) { prefetch<decltype(*v), LOC>(v); });
71 template<
size_t C,
typename T,
int LOC = 3>
72 void 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)); } );
76 template<
size_t L,
int LOC = 3>
77 void prefetch(
void* ptr) {
78 prefetcher<L*cache_line_size, 0, LOC>(
reinterpret_cast<uintptr_t
>(ptr));
81 template<
size_t L,
typename Iterator,
int LOC = 3>
82 void prefetch_n(Iterator begin, Iterator end) {
83 std::for_each(begin, end, [] (
auto v) { prefetch<L, LOC>(v); });
86 template<
size_t L,
size_t C,
typename T,
int LOC = 3>
87 void 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)); } );
91 template<
typename T,
int LOC = 3>
92 void prefetchw(T* ptr) {
93 prefetcher<align_up(sizeof(T), cache_line_size), 1, LOC>(
reinterpret_cast<uintptr_t
>(ptr));
96 template<
typename Iterator,
int LOC = 3>
97 void prefetchw_n(Iterator begin, Iterator end) {
98 std::for_each(begin, end, [] (
auto v) { prefetchw<decltype(*v), LOC>(v); });
101 template<
size_t C,
typename T,
int LOC = 3>
102 void 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)); } );
106 template<
size_t L,
int LOC = 3>
107 void prefetchw(
void* ptr) {
108 prefetcher<L*cache_line_size, 1, LOC>(
reinterpret_cast<uintptr_t
>(ptr));
111 template<
size_t L,
typename Iterator,
int LOC = 3>
112 void prefetchw_n(Iterator begin, Iterator end) {
113 std::for_each(begin, end, [] (
auto v) { prefetchw<L, LOC>(v); });
116 template<
size_t L,
size_t C,
typename T,
int LOC = 3>
117 void 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)); } );
120 SEASTAR_MODULE_EXPORT_END
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Definition: prefetch.hh:47