ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Control
CxxUtils
CxxUtils
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
37
namespace
CxxUtils
{
38
39
59
enum
{
CacheLineSize
= 64 };
60
61
72
inline
73
void
prefetchOne
(
const
void
* address)
74
{
75
CXXUTILS_PREFETCH_ADDRESS
(address);
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
Definition
aligned_vector.h:29
CxxUtils::CacheLineSize
@ CacheLineSize
Definition
prefetch.h:59
CxxUtils::prefetchNext
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
Definition
prefetch.h:130
CxxUtils::prefetchN
void prefetchN(const void *ptr)
Prefetch an N-byte block of memory.
Definition
prefetch.h:85
CxxUtils::prefetchOne
void prefetchOne(const void *address)
Generic prefetch method.
Definition
prefetch.h:73
CxxUtils::prefetchTwo
void prefetchTwo(Iter iter, Iter endIter)
Prefetch two objects.
Definition
prefetch.h:154
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
Generated on
for ATLAS Offline Software by
1.17.0