ATLAS Offline Software
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$
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 
37 namespace CxxUtils {
38 
39 
59 enum { CacheLineSize = 64 };
60 
61 
72 inline
73 void prefetchOne (const void* address)
74 {
76 }
77 
78 
83 template <size_t N>
84 inline
85 void 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 
106 template <typename T>
107 inline
108 void prefetchObj(const T* ptr)
109 {
110  prefetchN<sizeof(T)> (ptr);
111 }
112 
128 template <typename Iter>
129 inline
130 void prefetchNext (Iter iter, Iter endIter)
131 {
132  if (++iter != endIter)
133  prefetchObj(*iter);
134 }
135 
136 
152 template <typename Iter>
153 inline
154 void 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
CxxUtils::CacheLineSize
@ CacheLineSize
Definition: prefetch.h:59
JetTiledMap::N
@ N
Definition: TiledEtaPhiMap.h:44
CxxUtils::prefetchTwo
void prefetchTwo(Iter iter, Iter endIter)
Prefetch two objects.
Definition: prefetch.h:154
lumiFormat.i
int i
Definition: lumiFormat.py:92
CxxUtils
Definition: aligned_vector.h:29
CxxUtils::prefetchN
void prefetchN(const void *ptr)
Prefetch an N-byte block of memory.
Definition: prefetch.h:85
CxxUtils::prefetchNext
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
Definition: prefetch.h:130
CxxUtils::prefetchOne
void prefetchOne(const void *address)
Generic prefetch method.
Definition: prefetch.h:73
RTTAlgmain.address
address
Definition: RTTAlgmain.py:55
CxxUtils::prefetchObj
void prefetchObj(const T *ptr)
Generic prefetch of the object of specific types (sizes).
Definition: prefetch.h:108
CXXUTILS_PREFETCH_ADDRESS
#define CXXUTILS_PREFETCH_ADDRESS(ADDR)
Definition: prefetch.h:32