15 #ifndef STXXL_BLOCK_PREFETCHER_HEADER
16 #define STXXL_BLOCK_PREFETCHER_HEADER
21 #include <stxxl/bits/common/switch.h>
22 #include <stxxl/bits/io/request_ptr.h>
23 #include <stxxl/bits/io/iostats.h>
26 __STXXL_BEGIN_NAMESPACE
32 class set_switch_handler
34 onoff_switch & switch_;
39 : switch_(switch__), on_compl(on_compl)
42 void operator () (
request * req)
53 template <
typename block_type,
typename b
id_iterator_type>
57 typedef typename block_type::bid_type bid_type;
60 bid_iterator_type consume_seq_begin;
61 bid_iterator_type consume_seq_end;
62 unsigned_type seq_length;
64 int_type * prefetch_seq;
66 unsigned_type nextread;
67 unsigned_type nextconsume;
69 const int_type nreadblocks;
71 block_type * read_buffers;
75 onoff_switch * completed;
76 int_type * pref_buffer;
80 block_type * wait(int_type iblock)
82 STXXL_VERBOSE1(
"block_prefetcher: waiting block " << iblock);
84 stats::scoped_wait_timer wait_timer(stats::WAIT_OP_READ);
86 completed[iblock].wait_for_on();
88 STXXL_VERBOSE1(
"block_prefetcher: finished waiting block " << iblock);
89 int_type ibuffer = pref_buffer[iblock];
90 STXXL_VERBOSE1(
"block_prefetcher: returning buffer " << ibuffer);
91 assert(ibuffer >= 0 && ibuffer < nreadblocks);
92 return (read_buffers + ibuffer);
103 bid_iterator_type _cons_begin,
104 bid_iterator_type _cons_end,
105 int_type * _pref_seq,
106 int_type _prefetch_buf_size,
109 consume_seq_begin(_cons_begin),
110 consume_seq_end(_cons_end),
111 seq_length(_cons_end - _cons_begin),
112 prefetch_seq(_pref_seq),
113 nextread(STXXL_MIN(unsigned_type(_prefetch_buf_size), seq_length)),
115 nreadblocks(nextread),
116 do_after_fetch(do_after_fetch)
118 STXXL_VERBOSE1(
"block_prefetcher: seq_length=" << seq_length);
119 STXXL_VERBOSE1(
"block_prefetcher: _prefetch_buf_size=" << _prefetch_buf_size);
120 assert(seq_length > 0);
121 assert(_prefetch_buf_size > 0);
123 read_buffers =
new block_type[nreadblocks];
125 read_bids =
new bid_type[nreadblocks];
126 pref_buffer =
new int_type[seq_length];
128 std::fill(pref_buffer, pref_buffer + seq_length, -1);
130 completed =
new onoff_switch[seq_length];
132 for (i = 0; i < nreadblocks; ++i)
134 assert(prefetch_seq[i] < int_type(seq_length));
135 assert(prefetch_seq[i] >= 0);
136 read_bids[i] = *(consume_seq_begin + prefetch_seq[i]);
137 STXXL_VERBOSE1(
"block_prefetcher: reading block " << i <<
138 " prefetch_seq[" << i <<
"]=" << prefetch_seq[i] <<
139 " @ " << &read_buffers[i] <<
140 " @ " << read_bids[i]);
141 read_reqs[i] = read_buffers[i].read(
143 set_switch_handler(*(completed + prefetch_seq[i]), do_after_fetch));
144 pref_buffer[prefetch_seq[i]] = i;
151 STXXL_VERBOSE1(
"block_prefetcher: pulling a block");
152 return wait(nextconsume++);
161 int_type ibuffer = buffer - read_buffers;
162 STXXL_VERBOSE1(
"block_prefetcher: buffer " << ibuffer <<
" consumed");
163 if (read_reqs[ibuffer].valid())
164 read_reqs[ibuffer]->
wait();
166 read_reqs[ibuffer] = NULL;
168 if (nextread < seq_length)
170 assert(ibuffer >= 0 && ibuffer < nreadblocks);
171 int_type next_2_prefetch = prefetch_seq[nextread++];
172 STXXL_VERBOSE1(
"block_prefetcher: prefetching block " << next_2_prefetch);
174 assert((next_2_prefetch < int_type(seq_length)) && (next_2_prefetch >= 0));
175 assert(!completed[next_2_prefetch].is_on());
177 pref_buffer[next_2_prefetch] = ibuffer;
178 read_bids[ibuffer] = *(consume_seq_begin + next_2_prefetch);
179 read_reqs[ibuffer] = read_buffers[ibuffer].read(
181 set_switch_handler(*(completed + next_2_prefetch), do_after_fetch)
185 if (nextconsume >= seq_length)
189 buffer = wait(nextconsume++);
198 return nextconsume >= seq_length;
202 unsigned_type pos()
const
210 for (int_type i = 0; i < nreadblocks; ++i)
211 if (read_reqs[i].valid())
212 read_reqs[i]->
wait();
218 delete[] pref_buffer;
219 delete[] read_buffers;
225 __STXXL_END_NAMESPACE
227 #endif // !STXXL_BLOCK_PREFETCHER_HEADER
bool block_consumed(block_type *&buffer)
Exchanges buffers between prefetcher and application.
Definition: block_prefetcher.h:159
Default completion handler class.
Definition: completion_handler.h:94
Request with basic properties like file and offset.
Definition: request.h:39
Completion handler class (Loki-style)
Definition: completion_handler.h:63
block_type * pull_block()
Pulls next unconsumed block from the consumption sequence.
Definition: block_prefetcher.h:149
block_prefetcher(bid_iterator_type _cons_begin, bid_iterator_type _cons_end, int_type *_pref_seq, int_type _prefetch_buf_size, completion_handler do_after_fetch=default_completion_handler())
Constructs an object and immediately starts prefetching.
Definition: block_prefetcher.h:102
Implemented as reference counting smart pointer.
Definition: request_ptr.h:34
Encapsulates asynchronous prefetching engine.
Definition: block_prefetcher.h:54
virtual void wait(bool measure_time=true)=0
Suspends calling thread until completion of the request.
~block_prefetcher()
Frees used memory.
Definition: block_prefetcher.h:208