@@ -251,52 +251,17 @@ class BlockManager {
251
251
return m_block_table[seq_id];
252
252
}
253
253
254
- const size_t free_rightest_blocks (SequenceGroup::Ptr sequence_group) {
255
- size_t blocks_released = 0 ;
254
+ const size_t free_group_partially (SequenceGroup::Ptr sequence_group, size_t num_required_blocks ) {
255
+ size_t blocks_num = std::ceil (num_required_blocks / sequence_group-> get_not_finished_sequences (). size ()) ;
256
256
auto running_sequences = sequence_group->get_not_finished_sequences ();
257
257
std::set<size_t > blocks_released_indices;
258
258
for (size_t idx = 0 ; idx < running_sequences.size (); ++idx) {
259
259
auto seq_id = running_sequences[idx]->get_id ();
260
260
OPENVINO_ASSERT (m_block_table.count (seq_id) > 0 , " Invalid sequence group." );
261
261
auto block_table = m_block_table[seq_id];
262
- if (free_last_block (seq_id)) {
263
- blocks_released++;
264
- }
265
- }
266
- return blocks_released;
267
- }
268
-
269
- const bool free_group_partially_multiple_runnning_sequence (SequenceGroup::Ptr sequence_group, size_t num_required_blocks, size_t & phisical_blocks_released, size_t & logical_blocks_released) {
270
- phisical_blocks_released = 0 ;
271
- logical_blocks_released = 0 ;
272
- while (num_required_blocks > phisical_blocks_released) {
273
- size_t released_count = free_rightest_blocks (sequence_group);
274
- logical_blocks_released += 1 ;
275
- if (get_number_of_blocks_occupied_by_sequence (sequence_group) == 0 ) {
276
- break ;
277
- }
278
- phisical_blocks_released += released_count;
262
+ free_sequence_partially (seq_id, blocks_num);
279
263
}
280
- return num_required_blocks <= phisical_blocks_released;
281
- }
282
-
283
- const bool free_group_partially_single_runnning_sequence (SequenceGroup::Ptr sequence_group, size_t num_required_blocks, size_t & phisical_blocks_released) {
284
- auto sequences = sequence_group->get_not_finished_sequences ();
285
- OPENVINO_ASSERT (sequences.size () == 1 );
286
- auto running_sequence = sequences[0 ];
287
- auto seq_id = running_sequence->get_id ();
288
- if (!has_block_table (seq_id)) {
289
- // no blocks are allocated for this sequence, so it can't be preempted
290
- return false ;
291
- }
292
- auto block_table = get_block_table (seq_id);
293
- auto prev_blocks_count = num_free_blocks ();
294
- free_sequence_partially_single_runnning_sequence (seq_id, num_required_blocks);
295
-
296
- // calculate the number of released blocks
297
- phisical_blocks_released = num_free_blocks () - prev_blocks_count;
298
-
299
- return num_required_blocks <= phisical_blocks_released;
264
+ return blocks_num;
300
265
}
301
266
302
267
const size_t get_number_of_blocks_occupied_by_sequence (SequenceGroup::Ptr sequence_group) {
@@ -399,15 +364,13 @@ class BlockManager {
399
364
return block_table[block_idx]->is_free ();
400
365
}
401
366
402
- void free_sequence_partially_single_runnning_sequence (size_t seq_id, size_t block_num) {
403
- // this method is applicable only for groups with single sequences
367
+ void free_sequence_partially (size_t seq_id, size_t block_num) {
404
368
405
369
auto block_table = m_block_table[seq_id];
406
370
OPENVINO_ASSERT (block_table.size () >= block_num);
407
371
for (size_t idx = 0 ; idx < block_num; idx++) {
408
372
size_t block_idx = m_block_table[seq_id].size () - idx - 1 ;
409
373
m_allocator.free (block_table[block_idx]);
410
- OPENVINO_ASSERT (block_table[block_idx]->is_free ());
411
374
}
412
375
m_block_table[seq_id].resize (m_block_table[seq_id].size () - block_num);
413
376
0 commit comments