ATLAS Offline Software
Loading...
Searching...
No Matches
prefetch.h
Go to the documentation of this file.
1// This file's extension implies that it's C, but it's really -*- C++ -*-.
2
3/*
4 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
5*/
6
7// $Id$
14
15
16#ifndef CXXUTILS_PREFETCH_H
17#define CXXUTILS_PREFETCH_H
18
19
20#include <cstdlib>
21
22
23// Macro implementing prefetch on an address.
24// Set to a no-op if we don't know how to implement it for this
25// compiler / architecture.
26// One can also predefine CXXUTILS_PREFETCH_ADDRESS for testing purposes.
27#ifndef CXXUTILS_PREFETCH_ADDRESS
28# ifdef __GNUC__
29// gcc provides special builtin
30# define CXXUTILS_PREFETCH_ADDRESS(ADDR) __builtin_prefetch(ADDR)
31# else
32# define CXXUTILS_PREFETCH_ADDRESS(ADDR) do {} while(0) // no-op
33# endif
34#endif
35
36
37namespace CxxUtils {
38
39
59enum { CacheLineSize = 64 };
60
61
72inline
73void prefetchOne (const void* address)
74{
76}
77
78
83template <size_t N>
84inline
85void prefetchN (const void* ptr)
86{
87 const char* pp = reinterpret_cast<const char*> (ptr);
88
89 // The compiler will unroll this loop for small N.
90 for (size_t i = 0; i < N; i += CacheLineSize)
91 prefetchOne (pp + i);
92
93 // Issue a prefetch for the last byte as well, in case it crosses
94 // cache lines.
95 prefetchOne (pp + N - 1);
96}
97
98
106template <typename T>
107inline
108void prefetchObj(const T* ptr)
109{
111}
112
128template <typename Iter>
129inline
130void prefetchNext (Iter iter, Iter endIter)
131{
132 if (++iter != endIter)
133 prefetchObj(*iter);
134}
135
136
152template <typename Iter>
153inline
154void prefetchTwo (Iter iter, Iter endIter)
155{
156 if (iter != endIter) {
157 prefetchObj(*iter);
158 if (++iter != endIter) {
159 prefetchObj(*iter);
160 }
161 }
162}
163
164
165} // namespace CxxUtils
166
167
168#endif // not CXXUTILS_PREFETCH_H
@ CacheLineSize
Definition prefetch.h:59
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
Definition prefetch.h:130
void prefetchN(const void *ptr)
Prefetch an N-byte block of memory.
Definition prefetch.h:85
void prefetchOne(const void *address)
Generic prefetch method.
Definition prefetch.h:73
void prefetchTwo(Iter iter, Iter endIter)
Prefetch two objects.
Definition prefetch.h:154
void prefetchObj(const T *ptr)
Generic prefetch of the object of specific types (sizes).
Definition prefetch.h:108
#define CXXUTILS_PREFETCH_ADDRESS(ADDR)
Definition prefetch.h:32