From 569951c418fb3c9f82cbdde9fda3910cc7033bff Mon Sep 17 00:00:00 2001 From: liuwei1031 <46661762+liuwei1031@users.noreply.github.com> Date: Thu, 17 Oct 2019 15:16:21 +0800 Subject: [PATCH] improve the efficiency of BuddyAllocator (#19888) * improve save and load behaviour, test=develop * code cleaning, test=develop * disable check_guards and update_guards in release version, test=develop * fix compilation issue, test=develop * add buddy_allocator speed test data, test=develop * fix compilation issue, test=develop * fix comment, test=develop * update function names according to the google C++ style guide, test=develop * tweak the test data format, test=develop * move buddy_allocator_test_data to paddle/fluid/testdata, test=develop * add accessor and mutator for Desc, test=develop --- paddle/fluid/memory/detail/CMakeLists.txt | 6 + paddle/fluid/memory/detail/buddy_allocator.cc | 101 +++++++-------- .../memory/detail/buddy_allocator_test.cc | 77 ++++++++++++ paddle/fluid/memory/detail/memory_block.cc | 118 +++++++----------- paddle/fluid/memory/detail/memory_block.h | 56 +++++---- .../fluid/memory/detail/memory_block_desc.cc | 10 +- paddle/fluid/memory/detail/meta_cache.cc | 18 +-- .../fluid/testdata/buddy_allocator_test_data | 1 + 8 files changed, 227 insertions(+), 160 deletions(-) create mode 100644 paddle/fluid/testdata/buddy_allocator_test_data diff --git a/paddle/fluid/memory/detail/CMakeLists.txt b/paddle/fluid/memory/detail/CMakeLists.txt index e1c9a4f021..d80f26cb74 100644 --- a/paddle/fluid/memory/detail/CMakeLists.txt +++ b/paddle/fluid/memory/detail/CMakeLists.txt @@ -11,3 +11,9 @@ cc_test(system_allocator_test SRCS system_allocator_test.cc DEPS system_allocato cc_library(buddy_allocator SRCS buddy_allocator.cc DEPS memory_block system_allocator glog) cc_test(buddy_allocator_test SRCS buddy_allocator_test.cc DEPS buddy_allocator) + +if(WITH_TESTING) + add_custom_command(TARGET buddy_allocator_test POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/../../testdata/buddy_allocator_test_data ${CMAKE_CURRENT_BINARY_DIR}/buddy_allocator_test_data + ) +endif() diff --git a/paddle/fluid/memory/detail/buddy_allocator.cc b/paddle/fluid/memory/detail/buddy_allocator.cc index 3e4af0a47c..faa87f1f01 100644 --- a/paddle/fluid/memory/detail/buddy_allocator.cc +++ b/paddle/fluid/memory/detail/buddy_allocator.cc @@ -40,11 +40,11 @@ BuddyAllocator::~BuddyAllocator() { "have actually been freed"; while (!pool_.empty()) { auto block = static_cast(std::get<2>(*pool_.begin())); - VLOG(10) << "Free from block (" << block << ", " << block->size(cache_) - << ")"; + auto desc = cache_.LoadDesc(block); + VLOG(10) << "Free from block (" << block << ", " << desc->get_size() << ")"; - system_allocator_->Free(block, block->size(cache_), block->index(cache_)); - cache_.invalidate(block); + system_allocator_->Free(block, desc->get_size(), desc->get_index()); + cache_.Invalidate(block); pool_.erase(pool_.begin()); } } @@ -84,82 +84,83 @@ void* BuddyAllocator::Alloc(size_t unaligned_size) { } else { VLOG(10) << "Allocation from existing memory block " << std::get<2>(*it) << " at address " - << reinterpret_cast(std::get<2>(*it))->data(); + << reinterpret_cast(std::get<2>(*it))->Data(); } total_used_ += size; total_free_ -= size; // split the allocation and return data for use - return reinterpret_cast(SplitToAlloc(it, size))->data(); + return reinterpret_cast(SplitToAlloc(it, size))->Data(); } void BuddyAllocator::Free(void* p) { // Point back to metadata - auto block = static_cast(p)->metadata(); + auto block = static_cast(p)->Metadata(); // Acquire the allocator lock std::lock_guard lock(mutex_); VLOG(10) << "Free from address " << block; - if (block->type(cache_) == MemoryBlock::HUGE_CHUNK) { + auto* desc = cache_.LoadDesc(block); + if (desc->get_type() == MemoryBlock::HUGE_CHUNK) { VLOG(10) << "Free directly from system allocator"; - system_allocator_->Free(block, block->total_size(cache_), - block->index(cache_)); + system_allocator_->Free(block, desc->get_total_size(), desc->get_index()); // Invalidate GPU allocation from cache - cache_.invalidate(block); + cache_.Invalidate(block); return; } - block->mark_as_free(&cache_); + block->MarkAsFree(&cache_); - total_used_ -= block->total_size(cache_); - total_free_ += block->total_size(cache_); + total_used_ -= desc->get_total_size(); + total_free_ += desc->get_total_size(); // Trying to merge the right buddy - if (block->has_right_buddy(cache_)) { + MemoryBlock* right_buddy = block->GetRightBuddy(&cache_); + if (right_buddy) { VLOG(10) << "Merging this block " << block << " with its right buddy " - << block->right_buddy(cache_); + << right_buddy; - auto right_buddy = block->right_buddy(cache_); - - if (right_buddy->type(cache_) == MemoryBlock::FREE_CHUNK) { + auto rb_desc = cache_.LoadDesc(right_buddy); + if (rb_desc->get_type() == MemoryBlock::FREE_CHUNK) { // Take away right buddy from pool - pool_.erase(IndexSizeAddress(right_buddy->index(cache_), - right_buddy->total_size(cache_), - right_buddy)); + pool_.erase(IndexSizeAddress(rb_desc->get_index(), + rb_desc->get_total_size(), right_buddy)); // merge its right buddy to the block - block->merge(&cache_, right_buddy); + block->Merge(&cache_, right_buddy); } } // Trying to merge the left buddy - if (block->has_left_buddy(cache_)) { + MemoryBlock* left_buddy = block->GetLeftBuddy(&cache_); + if (left_buddy) { VLOG(10) << "Merging this block " << block << " with its left buddy " - << block->left_buddy(cache_); - - auto left_buddy = block->left_buddy(cache_); + << left_buddy; - if (left_buddy->type(cache_) == MemoryBlock::FREE_CHUNK) { + // auto left_buddy = block->left_buddy(cache_); + auto* lb_desc = cache_.LoadDesc(left_buddy); + if (lb_desc->get_type() == MemoryBlock::FREE_CHUNK) { // Take away right buddy from pool - pool_.erase(IndexSizeAddress(left_buddy->index(cache_), - left_buddy->total_size(cache_), left_buddy)); + pool_.erase(IndexSizeAddress(lb_desc->get_index(), + lb_desc->get_total_size(), left_buddy)); // merge the block to its left buddy - left_buddy->merge(&cache_, block); + left_buddy->Merge(&cache_, block); block = left_buddy; + desc = lb_desc; } } // Dumping this block into pool VLOG(10) << "Inserting free block (" << block << ", " - << block->total_size(cache_) << ")"; + << desc->get_total_size() << ")"; pool_.insert( - IndexSizeAddress(block->index(cache_), block->total_size(cache_), block)); + IndexSizeAddress(desc->get_index(), desc->get_total_size(), block)); } size_t BuddyAllocator::Used() { return total_used_; } @@ -174,10 +175,10 @@ void* BuddyAllocator::SystemAlloc(size_t size) { if (p == nullptr) return nullptr; - static_cast(p)->init(&cache_, MemoryBlock::HUGE_CHUNK, index, + static_cast(p)->Init(&cache_, MemoryBlock::HUGE_CHUNK, index, size, nullptr, nullptr); - return static_cast(p)->data(); + return static_cast(p)->Data(); } BuddyAllocator::PoolSet::iterator BuddyAllocator::RefillPool( @@ -209,7 +210,7 @@ BuddyAllocator::PoolSet::iterator BuddyAllocator::RefillPool( VLOG(10) << "Creating and inserting new block " << p << " from system allocator"; - static_cast(p)->init(&cache_, MemoryBlock::FREE_CHUNK, index, + static_cast(p)->Init(&cache_, MemoryBlock::FREE_CHUNK, index, allocate_bytes, nullptr, nullptr); total_free_ += allocate_bytes; @@ -243,26 +244,26 @@ BuddyAllocator::PoolSet::iterator BuddyAllocator::FindExistChunk(size_t size) { void* BuddyAllocator::SplitToAlloc(BuddyAllocator::PoolSet::iterator it, size_t size) { auto block = static_cast(std::get<2>(*it)); + auto desc = cache_.LoadDesc(block); pool_.erase(it); - VLOG(10) << "Split block (" << block << ", " << block->total_size(cache_) + VLOG(10) << "Split block (" << block << ", " << desc->get_total_size() << ") into"; - block->split(&cache_, size); + block->Split(&cache_, size); - VLOG(10) << "Left block (" << block << ", " << block->total_size(cache_) - << ")"; - block->set_type(&cache_, MemoryBlock::ARENA_CHUNK); + VLOG(10) << "Left block (" << block << ", " << desc->get_total_size() << ")"; + desc->set_type(MemoryBlock::ARENA_CHUNK); // the rest of memory if exist - if (block->has_right_buddy(cache_)) { - if (block->right_buddy(cache_)->type(cache_) == MemoryBlock::FREE_CHUNK) { - VLOG(10) << "Insert right block (" << block->right_buddy(cache_) << ", " - << block->right_buddy(cache_)->total_size(cache_) << ")"; - - pool_.insert( - IndexSizeAddress(block->right_buddy(cache_)->index(cache_), - block->right_buddy(cache_)->total_size(cache_), - block->right_buddy(cache_))); + MemoryBlock* right_buddy = block->GetRightBuddy(&cache_); + if (right_buddy) { + auto* rb_desc = cache_.LoadDesc(right_buddy); + if (rb_desc->get_type() == MemoryBlock::FREE_CHUNK) { + VLOG(10) << "Insert right block (" << right_buddy << ", " + << rb_desc->get_total_size() << ")"; + + pool_.insert(IndexSizeAddress(rb_desc->get_index(), + rb_desc->get_total_size(), right_buddy)); } } diff --git a/paddle/fluid/memory/detail/buddy_allocator_test.cc b/paddle/fluid/memory/detail/buddy_allocator_test.cc index dce48ac9ee..3d84553a28 100644 --- a/paddle/fluid/memory/detail/buddy_allocator_test.cc +++ b/paddle/fluid/memory/detail/buddy_allocator_test.cc @@ -16,6 +16,9 @@ limitations under the License. */ #include +#ifdef WITH_GPERFTOOLS +#include "gperftools/profiler.h" +#endif #include "gflags/gflags.h" #include "gtest/gtest.h" #include "paddle/fluid/memory/detail/system_allocator.h" @@ -24,6 +27,9 @@ limitations under the License. */ #ifdef PADDLE_WITH_CUDA #include +#include +#include + DECLARE_double(fraction_of_gpu_memory_to_use); DECLARE_uint64(initial_gpu_memory_in_mb); DECLARE_uint64(reallocate_gpu_memory_in_mb); @@ -235,6 +241,77 @@ TEST(BuddyAllocator, AllocFromAvailableWhenFractionIsOne) { } } +TEST(BuddyAllocator, SpeedAna) { + // In a 16 GB machine, the pool size will be about 160 MB + FLAGS_fraction_of_gpu_memory_to_use = 0.5; + FLAGS_initial_gpu_memory_in_mb = 0; + FLAGS_reallocate_gpu_memory_in_mb = 0; + + BuddyAllocator buddy_allocator( + std::unique_ptr(new GPUAllocator(TEST_GPU_ID)), + platform::GpuMinChunkSize(), platform::GpuMaxChunkSize()); + + // Less than pool size + TestBuddyAllocator(&buddy_allocator, 10); + TestBuddyAllocator(&buddy_allocator, 10 << 10); + TestBuddyAllocator(&buddy_allocator, 10 << 20); + + std::fstream in_file; + in_file.open("buddy_allocator_test_data", std::ios::in); + + std::vector vec_ptr; + std::vector vec_size; + std::vector vec_pos; + std::vector vec_free_flag; + + std::string line; + int size, id; + while (in_file >> size >> id) { + vec_size.push_back(size); + vec_pos.push_back(id); + } + + vec_ptr.reserve(vec_size.size()); + + auto start = std::chrono::steady_clock::now(); + +#ifdef WITH_GPERFTOOLS + ProfilerStart("test.prof"); +#endif + for (size_t loop = 0; loop < 5000; ++loop) { + vec_ptr.clear(); + for (size_t i = 0; i < vec_size.size(); ++i) { + if (vec_pos[i] == -1) { + auto res = buddy_allocator.Alloc(vec_size[i]); + + vec_ptr.push_back(res); + } else { + vec_ptr.push_back(nullptr); + + auto free_ptr = vec_ptr[vec_pos[i]]; + EXPECT_NE(free_ptr, nullptr); + + vec_ptr[vec_pos[i]] = nullptr; + + buddy_allocator.Free(free_ptr); + } + } + + for (size_t i = 0; i < vec_size.size(); ++i) { + if (vec_ptr[i] != nullptr) { + buddy_allocator.Free(vec_ptr[i]); + } + } + } + +#ifdef WITH_GPERFTOOLS + ProfilerStop(); +#endif + auto end = std::chrono::steady_clock::now(); + std::chrono::duration diff = end - start; + std::cerr << "time cost " << diff.count() << std::endl; +} + #endif } // namespace detail diff --git a/paddle/fluid/memory/detail/memory_block.cc b/paddle/fluid/memory/detail/memory_block.cc index 15e2e85638..2476326039 100644 --- a/paddle/fluid/memory/detail/memory_block.cc +++ b/paddle/fluid/memory/detail/memory_block.cc @@ -19,134 +19,104 @@ namespace paddle { namespace memory { namespace detail { -void MemoryBlock::init(MetadataCache* cache, Type t, size_t index, size_t size, +void MemoryBlock::Init(MetadataCache* cache, Type t, size_t index, size_t size, void* left_buddy, void* right_buddy) { - cache->save( + cache->Save( this, MemoryBlock::Desc(t, index, size - sizeof(MemoryBlock::Desc), size, static_cast(left_buddy), static_cast(right_buddy))); } -MemoryBlock::Type MemoryBlock::type(const MetadataCache& cache) const { - return cache.load(this).type; +MemoryBlock* MemoryBlock::GetLeftBuddy(MetadataCache* cache) { + return cache->LoadDesc(this)->left_buddy; } -size_t MemoryBlock::size(const MetadataCache& cache) const { - return cache.load(this).size; +MemoryBlock* MemoryBlock::GetRightBuddy(MetadataCache* cache) { + return cache->LoadDesc(this)->right_buddy; } -size_t MemoryBlock::index(const MetadataCache& cache) const { - return cache.load(this).index; -} - -size_t MemoryBlock::total_size(const MetadataCache& cache) const { - return cache.load(this).total_size; -} - -bool MemoryBlock::has_left_buddy(const MetadataCache& cache) const { - return left_buddy(cache) != nullptr; -} - -bool MemoryBlock::has_right_buddy(const MetadataCache& cache) const { - return right_buddy(cache) != nullptr; -} - -MemoryBlock* MemoryBlock::left_buddy(const MetadataCache& cache) const { - return cache.load(this).left_buddy; -} - -MemoryBlock* MemoryBlock::right_buddy(const MetadataCache& cache) const { - return cache.load(this).right_buddy; -} - -void MemoryBlock::split(MetadataCache* cache, size_t size) { +void MemoryBlock::Split(MetadataCache* cache, size_t size) { + auto desc = cache->LoadDesc(this); // make sure the split fits - PADDLE_ENFORCE_GE(total_size(*cache), size); + PADDLE_ENFORCE_GE(desc->total_size, size); // bail out if there is no room for another partition - if (total_size(*cache) - size <= sizeof(MemoryBlock::Desc)) { + if (desc->total_size - size <= sizeof(MemoryBlock::Desc)) { return; } // find the position of the split void* right_partition = reinterpret_cast(this) + size; - size_t remaining_size = total_size(*cache) - size; + size_t remaining_size = desc->total_size - size; // Add the new block as a buddy - auto metadata = cache->load(this); - // Write the metadata for the new block - auto new_block_right_buddy = metadata.right_buddy; + auto new_block_right_buddy = desc->right_buddy; - cache->save(static_cast(right_partition), - MemoryBlock::Desc(FREE_CHUNK, index(*cache), + cache->Save(static_cast(right_partition), + MemoryBlock::Desc(FREE_CHUNK, desc->index, remaining_size - sizeof(MemoryBlock::Desc), remaining_size, this, new_block_right_buddy)); - metadata.right_buddy = static_cast(right_partition); - metadata.size = size - sizeof(MemoryBlock::Desc); - metadata.total_size = size; + desc->right_buddy = static_cast(right_partition); + desc->size = size - sizeof(MemoryBlock::Desc); + desc->total_size = size; - cache->save(this, metadata); + desc->UpdateGuards(); // Write metadata for the new block's right buddy if (new_block_right_buddy != nullptr) { - auto buddy_metadata = cache->load(new_block_right_buddy); + auto buddy_desc = cache->LoadDesc(new_block_right_buddy); - buddy_metadata.left_buddy = static_cast(right_partition); - - cache->save(new_block_right_buddy, buddy_metadata); + buddy_desc->left_buddy = static_cast(right_partition); + buddy_desc->UpdateGuards(); } } -void MemoryBlock::merge(MetadataCache* cache, MemoryBlock* right_buddy) { +void MemoryBlock::Merge(MetadataCache* cache, MemoryBlock* right_buddy) { // only free blocks can be merged - PADDLE_ENFORCE_EQ(type(*cache), FREE_CHUNK); - PADDLE_ENFORCE_EQ(right_buddy->type(*cache), FREE_CHUNK); - - auto metadata = cache->load(this); + auto desc = cache->LoadDesc(this); + auto rb_desc = cache->LoadDesc(right_buddy); + PADDLE_ENFORCE_EQ(desc->type, FREE_CHUNK); + PADDLE_ENFORCE_EQ(rb_desc->type, FREE_CHUNK); // link this->buddy's buddy - metadata.right_buddy = right_buddy->right_buddy(*cache); + desc->right_buddy = rb_desc->right_buddy; // link buddy's buddy -> this - if (metadata.right_buddy != nullptr) { - auto buddy_metadata = cache->load(metadata.right_buddy); + if (desc->right_buddy != nullptr) { + auto buddy_metadata = cache->LoadDesc(desc->right_buddy); - buddy_metadata.left_buddy = this; - - cache->save(metadata.right_buddy, buddy_metadata); + buddy_metadata->left_buddy = this; + buddy_metadata->UpdateGuards(); } - metadata.size += right_buddy->total_size(*cache); - metadata.total_size += right_buddy->total_size(*cache); + desc->size += rb_desc->total_size; + desc->total_size += rb_desc->total_size; + + desc->UpdateGuards(); - cache->save(this, metadata); - cache->save(right_buddy, + cache->Save(right_buddy, MemoryBlock::Desc(INVALID_CHUNK, 0, 0, 0, nullptr, nullptr)); } -void MemoryBlock::mark_as_free(MetadataCache* cache) { +void MemoryBlock::MarkAsFree(MetadataCache* cache) { // check for double free or corruption - PADDLE_ENFORCE_NE(type(*cache), FREE_CHUNK); - PADDLE_ENFORCE_NE(type(*cache), INVALID_CHUNK); - set_type(cache, FREE_CHUNK); -} - -void MemoryBlock::set_type(MetadataCache* cache, Type t) { - auto metadata = cache->load(this); - metadata.type = t; - cache->save(this, metadata); + auto desc = cache->LoadDesc(this); + PADDLE_ENFORCE_NE(desc->type, FREE_CHUNK); + PADDLE_ENFORCE_NE(desc->type, INVALID_CHUNK); + desc->type = FREE_CHUNK; + desc->UpdateGuards(); } -void* MemoryBlock::data() const { +void* MemoryBlock::Data() const { return const_cast( reinterpret_cast(this)) + 1; } -MemoryBlock* MemoryBlock::metadata() const { +MemoryBlock* MemoryBlock::Metadata() const { return const_cast(reinterpret_cast( reinterpret_cast(this) - 1)); } diff --git a/paddle/fluid/memory/detail/memory_block.h b/paddle/fluid/memory/detail/memory_block.h index 5cceba659b..1d7de1c688 100644 --- a/paddle/fluid/memory/detail/memory_block.h +++ b/paddle/fluid/memory/detail/memory_block.h @@ -38,35 +38,23 @@ struct MemoryBlock { // MemoryBlock::Desc to the beginning of the block; or, if it is a GPU memory // block, the MetadataCache writes the Meatadata to a std::map in // the CPU. - void init(MetadataCache* cache, Type t, size_t index, size_t size, + void Init(MetadataCache* cache, Type t, size_t index, size_t size, void* left_buddy, void* right_buddy); - // All these accessors returns fields in the MemoryBlock::Desc of the memory - // block. They all need a MetadataCache instance as their first - // parameter because they read the MemoryBlock::Desc from the cache. - Type type(const MetadataCache& cache) const; - size_t size(const MetadataCache& cache) const; - size_t index(const MetadataCache& cache) const; - size_t total_size(const MetadataCache& cache) const; - bool has_left_buddy(const MetadataCache& cache) const; - bool has_right_buddy(const MetadataCache& cache) const; - MemoryBlock* left_buddy(const MetadataCache& cache) const; - MemoryBlock* right_buddy(const MetadataCache& cache) const; + MemoryBlock* GetLeftBuddy(MetadataCache* cache); + MemoryBlock* GetRightBuddy(MetadataCache* cache); // Split the allocation into left/right blocks. - void split(MetadataCache* cache, size_t size); + void Split(MetadataCache* cache, size_t size); // Merge left and right blocks together. - void merge(MetadataCache* cache, MemoryBlock* right_buddy); + void Merge(MetadataCache* cache, MemoryBlock* right_buddy); // Mark the allocation as free. - void mark_as_free(MetadataCache* cache); + void MarkAsFree(MetadataCache* cache); - // Change the type of the allocation. - void set_type(MetadataCache* cache, Type t); - - void* data() const; - MemoryBlock* metadata() const; + void* Data() const; + MemoryBlock* Metadata() const; // MemoryBlock::Desc describes a MemoryBlock. struct Desc { @@ -74,11 +62,29 @@ struct MemoryBlock { MemoryBlock* r); Desc(); + // mutator for type + inline void set_type(const MemoryBlock::Type& type) { + this->type = type; + this->UpdateGuards(); + } + + // accessor for type + inline const MemoryBlock::Type& get_type() const { return this->type; } + + // accessor for index + inline const size_t& get_index() const { return this->index; } + + // accessor for size + inline const size_t& get_size() const { return this->size; } + + // accessor for total_size + inline const size_t& get_total_size() const { return this->total_size; } + // Updates guard_begin and guard_end by hashes of the Metadata object. - void update_guards(); + void UpdateGuards(); // Checks that guard_begin and guard_end are hashes of the Metadata object. - bool check_guards() const; + bool CheckGuards() const; // TODO(gangliao): compress this size_t guard_begin = 0; @@ -109,15 +115,15 @@ class MetadataCache { // used to manage CPU memory, the MemoryBlock::Desc resides at the beginning // of the memory block; when used to manage GPU memory, the // Meatadata resides in CPU memory indexed by cache_. - MemoryBlock::Desc load(const MemoryBlock* memory_block) const; + MemoryBlock::Desc* LoadDesc(MemoryBlock* memory_block); // Saves the MemoryBlock::Desc of a memory block into the cache. For CPU // memory block, writes the MemoryBlock::Desc to the beginning of the memory // block; whereas for GPU memory, writes it to cache_. - void save(MemoryBlock* memory_block, const MemoryBlock::Desc& meta_data); + void Save(MemoryBlock* memory_block, const MemoryBlock::Desc& meta_data); // For GPU memory block, erases its MemoryBlock::Desc from cache_. - void invalidate(MemoryBlock* memory_block); + void Invalidate(MemoryBlock* memory_block); private: typedef std::unordered_map MetadataMap; diff --git a/paddle/fluid/memory/detail/memory_block_desc.cc b/paddle/fluid/memory/detail/memory_block_desc.cc index 393dd9209c..dd49855f05 100644 --- a/paddle/fluid/memory/detail/memory_block_desc.cc +++ b/paddle/fluid/memory/detail/memory_block_desc.cc @@ -60,13 +60,19 @@ inline size_t hash(const MemoryBlock::Desc& metadata, size_t initial_seed) { } // namespace -void MemoryBlock::Desc::update_guards() { +void MemoryBlock::Desc::UpdateGuards() { +#ifdef PADDLE_WITH_TESTING guard_begin = hash(*this, 1); guard_end = hash(*this, 2); +#endif } -bool MemoryBlock::Desc::check_guards() const { +bool MemoryBlock::Desc::CheckGuards() const { +#ifdef PADDLE_WITH_TESTING return guard_begin == hash(*this, 1) && guard_end == hash(*this, 2); +#else + return true; +#endif } } // namespace detail diff --git a/paddle/fluid/memory/detail/meta_cache.cc b/paddle/fluid/memory/detail/meta_cache.cc index f04b0c800e..8fb2e333ba 100644 --- a/paddle/fluid/memory/detail/meta_cache.cc +++ b/paddle/fluid/memory/detail/meta_cache.cc @@ -22,23 +22,23 @@ namespace detail { MetadataCache::MetadataCache(bool uses_gpu) : uses_gpu_(uses_gpu) {} -MemoryBlock::Desc MetadataCache::load(const MemoryBlock* block) const { +MemoryBlock::Desc* MetadataCache::LoadDesc(MemoryBlock* block) { if (uses_gpu_) { auto existing_desc = cache_.find(block); - PADDLE_ENFORCE_EQ(existing_desc->second.check_guards(), true); - return existing_desc->second; + PADDLE_ENFORCE_EQ(existing_desc->second.CheckGuards(), true); + return &(existing_desc->second); } else { - auto* desc = reinterpret_cast(block); + auto* desc = reinterpret_cast(block); VLOG(10) << "Load MemoryBlock::Desc type=" << desc->type; - PADDLE_ENFORCE_EQ(desc->check_guards(), true); - return *reinterpret_cast(block); + PADDLE_ENFORCE_EQ(desc->CheckGuards(), true); + return reinterpret_cast(block); } } -void MetadataCache::save(MemoryBlock* block, +void MetadataCache::Save(MemoryBlock* block, const MemoryBlock::Desc& original_desc) { auto desc = original_desc; - desc.update_guards(); + desc.UpdateGuards(); if (uses_gpu_) { cache_[block] = desc; @@ -47,7 +47,7 @@ void MetadataCache::save(MemoryBlock* block, } } -void MetadataCache::invalidate(MemoryBlock* block) { +void MetadataCache::Invalidate(MemoryBlock* block) { if (uses_gpu_) { cache_.erase(block); } diff --git a/paddle/fluid/testdata/buddy_allocator_test_data b/paddle/fluid/testdata/buddy_allocator_test_data new file mode 100644 index 0000000000..37a85c4d7e --- /dev/null +++ b/paddle/fluid/testdata/buddy_allocator_test_data @@ -0,0 +1 @@ +1280256 -1 3328 -1 1280256 -1 3328 -1 8000256 -1 8000256 -1 40192 -1 256 -1 3328 -1 3328 -1 32256 -1 32256 -1 32256 -1 32256 -1 320256 -1 320256 -1 320256 15 16128 -1 16128 -1 16128 -1 16128 19 16128 -1 16128 21 16128 -1 16128 -1 16128 -1 16128 25 16128 -1 16128 27 16128 -1 16128 -1 16128 30 32256 -1 64256 -1 64256 -1 64256 34 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 45 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 51 64256 -1 64256 53 16128 -1 16128 -1 16128 -1 16128 -1 16128 58 16128 57 16128 56 16128 55 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 68 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 75 32256 -1 64256 -1 64256 78 64256 -1 64256 80 16128 -1 16128 -1 16128 -1 16128 -1 16128 85 16128 84 16128 83 16128 82 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 95 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 101 64256 -1 64256 103 16128 -1 16128 -1 16128 -1 16128 -1 16128 108 16128 107 16128 106 16128 105 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 118 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 125 32256 -1 64256 -1 64256 128 64256 -1 64256 130 16128 -1 16128 -1 16128 -1 16128 -1 16128 135 16128 134 16128 133 16128 132 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 145 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 151 64256 -1 64256 153 16128 -1 16128 -1 16128 -1 16128 -1 16128 158 16128 157 16128 156 16128 155 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 168 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 175 32256 -1 64256 -1 64256 178 64256 -1 64256 180 16128 -1 16128 -1 16128 -1 16128 -1 16128 185 16128 184 16128 183 16128 182 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 195 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 201 64256 -1 64256 203 16128 -1 16128 -1 16128 -1 16128 -1 16128 208 16128 207 16128 206 16128 205 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 218 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 225 32256 -1 64256 -1 64256 228 64256 -1 64256 230 16128 -1 16128 -1 16128 -1 16128 -1 16128 235 16128 234 16128 233 16128 232 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 245 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 251 64256 -1 64256 253 16128 -1 16128 -1 16128 -1 16128 -1 16128 258 16128 257 16128 256 16128 255 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 268 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 275 32256 -1 64256 -1 64256 278 64256 -1 64256 280 16128 -1 16128 -1 16128 -1 16128 -1 16128 285 16128 284 16128 283 16128 282 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 295 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 301 64256 -1 64256 303 16128 -1 16128 -1 16128 -1 16128 -1 16128 308 16128 307 16128 306 16128 305 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 318 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 325 32256 -1 64256 -1 64256 328 64256 -1 64256 330 16128 -1 16128 -1 16128 -1 16128 -1 16128 335 16128 334 16128 333 16128 332 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 345 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 351 64256 -1 64256 353 16128 -1 16128 -1 16128 -1 16128 -1 16128 358 16128 357 16128 356 16128 355 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 368 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 375 32256 -1 64256 -1 64256 378 64256 -1 64256 380 16128 -1 16128 -1 16128 -1 16128 -1 16128 385 16128 384 16128 383 16128 382 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 395 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 401 64256 -1 64256 403 16128 -1 16128 -1 16128 -1 16128 -1 16128 408 16128 407 16128 406 16128 405 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 418 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 425 32256 -1 64256 -1 64256 428 64256 -1 64256 430 16128 -1 16128 -1 16128 -1 16128 -1 16128 435 16128 434 16128 433 16128 432 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 445 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 451 64256 -1 64256 453 16128 -1 16128 -1 16128 -1 16128 -1 16128 458 16128 457 16128 456 16128 455 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 468 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 475 32256 -1 64256 -1 64256 478 64256 -1 64256 480 16128 -1 16128 -1 16128 -1 16128 -1 16128 485 16128 484 16128 483 16128 482 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 495 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 501 64256 -1 64256 503 16128 -1 16128 -1 16128 -1 16128 -1 16128 508 16128 507 16128 506 16128 505 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 518 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 525 32256 -1 64256 -1 64256 528 64256 -1 64256 530 16128 -1 16128 -1 16128 -1 16128 -1 16128 535 16128 534 16128 533 16128 532 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 545 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 551 64256 -1 64256 553 16128 -1 16128 -1 16128 -1 16128 -1 16128 558 16128 557 16128 556 16128 555 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 568 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 575 32256 -1 64256 -1 64256 578 64256 -1 64256 580 16128 -1 16128 -1 16128 -1 16128 -1 16128 585 16128 584 16128 583 16128 582 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 595 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 601 64256 -1 64256 603 16128 -1 16128 -1 16128 -1 16128 -1 16128 608 16128 607 16128 606 16128 605 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 618 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 625 32256 -1 64256 -1 64256 628 64256 -1 64256 630 16128 -1 16128 -1 16128 -1 16128 -1 16128 635 16128 634 16128 633 16128 632 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 645 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 651 64256 -1 64256 653 16128 -1 16128 -1 16128 -1 16128 -1 16128 658 16128 657 16128 656 16128 655 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 668 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 675 32256 -1 64256 -1 64256 678 64256 -1 64256 680 16128 -1 16128 -1 16128 -1 16128 -1 16128 685 16128 684 16128 683 16128 682 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 695 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 701 64256 -1 64256 703 16128 -1 16128 -1 16128 -1 16128 -1 16128 708 16128 707 16128 706 16128 705 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 718 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 725 32256 -1 64256 -1 64256 728 64256 -1 64256 730 16128 -1 16128 -1 16128 -1 16128 -1 16128 735 16128 734 16128 733 16128 732 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 745 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 751 64256 -1 64256 753 16128 -1 16128 -1 16128 -1 16128 -1 16128 758 16128 757 16128 756 16128 755 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 768 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 775 32256 -1 64256 -1 64256 778 64256 -1 64256 780 16128 -1 16128 -1 16128 -1 16128 -1 16128 785 16128 784 16128 783 16128 782 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 795 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 801 64256 -1 64256 803 16128 -1 16128 -1 16128 -1 16128 -1 16128 808 16128 807 16128 806 16128 805 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 818 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 825 32256 -1 64256 -1 64256 828 64256 -1 64256 830 16128 -1 16128 -1 16128 -1 16128 -1 16128 835 16128 834 16128 833 16128 832 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 845 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 851 64256 -1 64256 853 16128 -1 16128 -1 16128 -1 16128 -1 16128 858 16128 857 16128 856 16128 855 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 868 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 875 32256 -1 64256 -1 64256 878 64256 -1 64256 880 16128 -1 16128 -1 16128 -1 16128 -1 16128 885 16128 884 16128 883 16128 882 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 895 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 901 64256 -1 64256 903 16128 -1 16128 -1 16128 -1 16128 -1 16128 908 16128 907 16128 906 16128 905 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 918 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 925 32256 -1 64256 -1 64256 928 64256 -1 64256 930 16128 -1 16128 -1 16128 -1 16128 -1 16128 935 16128 934 16128 933 16128 932 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 945 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 951 64256 -1 64256 953 16128 -1 16128 -1 16128 -1 16128 -1 16128 958 16128 957 16128 956 16128 955 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 968 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 975 32256 -1 64256 -1 64256 978 64256 -1 64256 980 16128 -1 16128 -1 16128 -1 16128 -1 16128 985 16128 984 16128 983 16128 982 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 995 16128 -1 16128 -1 16128 -1 32256 -1 64256 -1 64256 1001 64256 -1 64256 1003 16128 -1 16128 -1 16128 -1 16128 -1 16128 1008 16128 1007 16128 1006 16128 1005 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 1018 16128 -1 16128 -1 16128 -1 16128 -1 320256 -1 256 -1 320256 -1 320256 1026 32256 -1 32256 -1 32256 1029 32256 -1 32256 1031 32256 -1 32256 -1 32256 1034 32256 -1 32256 1036 16128 1023 64256 33 16128 1022 16128 1021 16128 1020 320256 -1 320256 1043 16000256 -1 16000256 -1 16000256 1046 16000256 -1 16000256 1048 16000256 -1 1792 -1 1792 -1 1792 1052 256 -1 256 -1 256 -1 256 1056 16000256 1050 4096 -1 256 1055 4096 1059 32768 -1 32768 1062 32768 -1 32768 1064 256 -1 256 -1 256 -1 256 1068 256 1067 1792 -1 1792 1071 256 1066 1792 -1 1792 1074 16000256 -1 16000256 1076 1792 1051 16000256 -1 16000256 1079 40192 -1 16000256 -1 16000256 1082 320256 -1 8000256 -1 320256 1084 16000256 1045 320256 -1 320256 1088 320256 -1 320256 1090 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 16128 -1 256 -1 16128 1111 16128 1110 16128 1109 16128 1108 16128 1107 16128 1106 16128 1105 16128 1104 16128 1103 16128 1102 16128 1101 16128 1100 16128 1099 16128 1098 16128 1097 16128 1096 16128 1095 16128 1094 16128 1093 16128 1092 320256 1024 16128 -1 16128 1134 16128 -1 16128 1136 16128 -1 16128 1138 16128 -1 16128 1140 16128 -1 16128 1142 16128 -1 16128 1144 16128 -1 16128 1146 16128 -1 16128 1148 16128 -1 16128 1150 16128 -1 16128 1152 16128 -1 16128 1154 16128 -1 16128 1156 16128 -1 16128 1158 16128 -1 16128 1160 16128 -1 16128 1162 16128 -1 16128 1164 16128 -1 16128 1166 16128 -1 16128 1168 16128 -1 16128 1170 16128 -1 16128 1172 16128 -1 16128 -1 16128 -1 16128 1176 16128 1175 16128 -1 16128 1179 16128 1174 16128 -1 16128 -1 16128 1183 16128 -1 16128 -1 16128 1186 16128 -1 16128 -1 16128 1189 16128 1188 16128 -1 16128 1192 16128 1185 16128 -1 16128 1195 16128 1182 16128 -1 16128 1198 16128 1017 64256 -1 16128 1016 16128 1015 16128 1014 16128 1013 3328 -1 64256 -1 64256 1207 32256 -1 1280256 -1 32256 1209 64256 1201 16128 -1 16128 -1 16128 1214 32256 1033 16128 1213 16128 -1 16128 -1 16128 -1 16128 -1 16128 1221 16128 -1 16128 1223 16128 1220 16128 -1 16128 1226 16128 1219 16128 -1 16128 1229 16128 1218 16128 -1 16128 1232 16128 999 16128 998 16128 -1 16128 -1 16128 1237 16128 -1 16128 -1 16128 1240 16128 1239 16128 -1 16128 -1 16128 1244 16128 -1 16128 -1 16128 1247 16128 1246 16128 -1 16128 -1 16128 1251 16128 -1 16128 -1 16128 1254 16128 1253 16128 -1 16128 1257 16128 1250 16128 -1 16128 1260 16128 1243 16128 -1 16128 1263 16128 1236 16128 -1 16128 1266 16128 997 16128 -1 16128 1269 16128 994 16128 -1 16128 1272 16128 993 64256 -1 16128 992 16128 991 16128 990 16128 974 64256 -1 16128 973 16128 972 16128 971 16128 970 3328 -1 64256 -1 64256 1286 3328 -1 64256 -1 64256 1289 3328 1288 32256 -1 1280256 -1 32256 1292 64256 1280 32256 -1 1280256 -1 32256 1296 64256 1275 1280256 1297 16128 -1 16128 -1 16128 1302 32256 1028 16128 -1 16128 -1 16128 1306 16128 1305 32256 1000 16128 1301 16128 967 16128 -1 16128 1312 16128 -1 16128 -1 16128 1315 16128 -1 16128 -1 16128 1318 320256 -1 16128 1317 16128 -1 16128 1322 16128 1314 16128 -1 16128 1325 16128 966 16128 965 16128 -1 16128 1329 16128 964 16128 -1 16128 1332 16128 963 16128 949 16128 -1 16128 -1 16128 1337 16128 1336 16128 -1 16128 -1 16128 1341 16128 1340 16128 -1 16128 -1 16128 1345 16128 -1 16128 -1 16128 1348 16128 1347 16128 -1 16128 -1 16128 1352 16128 -1 16128 -1 16128 1355 16128 1354 16128 -1 16128 1358 16128 1351 16128 -1 16128 1361 16128 1344 16128 -1 16128 1364 16128 948 16128 -1 16128 1367 16128 947 16128 -1 16128 1370 16128 944 16128 -1 16128 1373 16128 943 64256 -1 16128 942 16128 941 16128 940 16128 924 64256 -1 16128 923 16128 922 16128 921 16128 920 3328 -1 64256 -1 64256 1387 3328 1386 3328 -1 64256 -1 64256 1391 3328 1390 32256 -1 1280256 -1 32256 1394 64256 1381 1280256 1395 32256 -1 1280256 -1 32256 1399 64256 1376 1280256 1400 16128 -1 16128 -1 16128 1405 32256 977 16128 -1 16128 -1 16128 1409 16128 1408 32256 950 16128 1404 16128 917 16128 -1 16128 1415 16128 -1 16128 -1 16128 1418 16128 -1 16128 -1 16128 1421 320256 -1 16128 1420 320256 1423 16128 -1 16128 1426 16128 1417 16128 -1 16128 1429 16128 916 16128 915 16128 -1 16128 1433 16128 914 16128 -1 16128 1436 16128 913 16128 899 16128 -1 16128 -1 16128 1441 16128 1440 16128 -1 16128 -1 16128 1445 16128 1444 16128 -1 16128 -1 16128 1449 16128 -1 16128 -1 16128 1452 16128 1451 16128 -1 16128 -1 16128 1456 16128 -1 16128 -1 16128 1459 16128 1458 16128 -1 16128 1462 16128 1455 16128 -1 16128 1465 16128 1448 16128 -1 16128 1468 16128 898 16128 -1 16128 1471 16128 897 16128 -1 16128 1474 16128 894 16128 -1 16128 1477 16128 893 64256 -1 16128 892 16128 891 16128 890 16128 874 64256 -1 16128 873 16128 872 16128 871 16128 870 3328 -1 64256 -1 64256 1491 3328 1490 3328 -1 64256 -1 64256 1495 3328 1494 32256 -1 1280256 -1 32256 1498 64256 1485 1280256 1499 32256 -1 1280256 -1 32256 1503 64256 1480 1280256 1504 16128 -1 16128 -1 16128 1509 32256 927 16128 -1 16128 -1 16128 1513 16128 1512 32256 900 16128 1508 16128 867 16128 -1 16128 1519 16128 -1 16128 -1 16128 1522 16128 -1 16128 -1 16128 1525 320256 -1 16128 1524 320256 1527 16128 -1 16128 1530 16128 1521 16128 -1 16128 1533 16128 866 16128 865 16128 -1 16128 1537 16128 864 16128 -1 16128 1540 16128 863 16128 849 16128 -1 16128 -1 16128 1545 16128 1544 16128 -1 16128 -1 16128 1549 16128 1548 16128 -1 16128 -1 16128 1553 16128 -1 16128 -1 16128 1556 16128 1555 16128 -1 16128 -1 16128 1560 16128 -1 16128 -1 16128 1563 16128 1562 16128 -1 16128 1566 16128 1559 16128 -1 16128 1569 16128 1552 16128 -1 16128 1572 16128 848 16128 -1 16128 1575 16128 847 16128 -1 16128 1578 16128 844 16128 -1 16128 1581 16128 843 64256 -1 16128 842 16128 841 16128 840 16128 824 64256 -1 16128 823 16128 822 16128 821 16128 820 3328 -1 64256 -1 64256 1595 3328 1594 3328 -1 64256 -1 64256 1599 3328 1598 32256 -1 1280256 -1 32256 1602 64256 1589 1280256 1603 32256 -1 1280256 -1 32256 1607 64256 1584 1280256 1608 16128 -1 16128 -1 16128 1613 32256 877 16128 -1 16128 -1 16128 1617 16128 1616 32256 850 16128 1612 16128 817 16128 -1 16128 1623 16128 -1 16128 -1 16128 1626 16128 -1 16128 -1 16128 1629 320256 -1 16128 1628 320256 1631 16128 -1 16128 1634 16128 1625 16128 -1 16128 1637 16128 816 16128 815 16128 -1 16128 1641 16128 814 16128 -1 16128 1644 16128 813 16128 799 16128 -1 16128 -1 16128 1649 16128 1648 16128 -1 16128 -1 16128 1653 16128 1652 16128 -1 16128 -1 16128 1657 16128 -1 16128 -1 16128 1660 16128 1659 16128 -1 16128 -1 16128 1664 16128 -1 16128 -1 16128 1667 16128 1666 16128 -1 16128 1670 16128 1663 16128 -1 16128 1673 16128 1656 16128 -1 16128 1676 16128 798 16128 -1 16128 1679 16128 797 16128 -1 16128 1682 16128 794 16128 -1 16128 1685 16128 793 64256 -1 16128 792 16128 791 16128 790 16128 774 64256 -1 16128 773 16128 772 16128 771 16128 770 3328 -1 64256 -1 64256 1699 3328 1698 3328 -1 64256 -1 64256 1703 3328 1702 32256 -1 1280256 -1 32256 1706 64256 1693 1280256 1707 32256 -1 1280256 -1 32256 1711 64256 1688 1280256 1712 16128 -1 16128 -1 16128 1717 32256 827 16128 -1 16128 -1 16128 1721 16128 1720 32256 800 16128 1716 16128 767 16128 -1 16128 1727 16128 -1 16128 -1 16128 1730 16128 -1 16128 -1 16128 1733 320256 -1 16128 1732 320256 1735 16128 -1 16128 1738 16128 1729 16128 -1 16128 1741 16128 766 16128 765 16128 -1 16128 1745 16128 764 16128 -1 16128 1748 16128 763 16128 749 16128 -1 16128 -1 16128 1753 16128 1752 16128 -1 16128 -1 16128 1757 16128 1756 16128 -1 16128 -1 16128 1761 16128 -1 16128 -1 16128 1764 16128 1763 16128 -1 16128 -1 16128 1768 16128 -1 16128 -1 16128 1771 16128 1770 16128 -1 16128 1774 16128 1767 16128 -1 16128 1777 16128 1760 16128 -1 16128 1780 16128 748 16128 -1 16128 1783 16128 747 16128 -1 16128 1786 16128 744 16128 -1 16128 1789 16128 743 64256 -1 16128 742 16128 741 16128 740 16128 724 64256 -1 16128 723 16128 722 16128 721 16128 720 3328 -1 64256 -1 64256 1803 3328 1802 3328 -1 64256 -1 64256 1807 3328 1806 32256 -1 1280256 -1 32256 1810 64256 1797 1280256 1811 32256 -1 1280256 -1 32256 1815 64256 1792 1280256 1816 16128 -1 16128 -1 16128 1821 32256 777 16128 -1 16128 -1 16128 1825 16128 1824 32256 750 16128 1820 16128 717 16128 -1 16128 1831 16128 -1 16128 -1 16128 1834 16128 -1 16128 -1 16128 1837 320256 -1 16128 1836 320256 1839 16128 -1 16128 1842 16128 1833 16128 -1 16128 1845 16128 716 16128 715 16128 -1 16128 1849 16128 714 16128 -1 16128 1852 16128 713 16128 699 16128 -1 16128 -1 16128 1857 16128 1856 16128 -1 16128 -1 16128 1861 16128 1860 16128 -1 16128 -1 16128 1865 16128 -1 16128 -1 16128 1868 16128 1867 16128 -1 16128 -1 16128 1872 16128 -1 16128 -1 16128 1875 16128 1874 16128 -1 16128 1878 16128 1871 16128 -1 16128 1881 16128 1864 16128 -1 16128 1884 16128 698 16128 -1 16128 1887 16128 697 16128 -1 16128 1890 16128 694 16128 -1 16128 1893 16128 693 64256 -1 16128 692 16128 691 16128 690 16128 674 64256 -1 16128 673 16128 672 16128 671 16128 670 3328 -1 64256 -1 64256 1907 3328 1906 3328 -1 64256 -1 64256 1911 3328 1910 32256 -1 1280256 -1 32256 1914 64256 1901 1280256 1915 32256 -1 1280256 -1 32256 1919 64256 1896 1280256 1920 16128 -1 16128 -1 16128 1925 32256 727 16128 -1 16128 -1 16128 1929 16128 1928 32256 700 16128 1924 16128 667 16128 -1 16128 1935 16128 -1 16128 -1 16128 1938 16128 -1 16128 -1 16128 1941 320256 -1 16128 1940 320256 1943 16128 -1 16128 1946 16128 1937 16128 -1 16128 1949 16128 666 16128 665 16128 -1 16128 1953 16128 664 16128 -1 16128 1956 16128 663 16128 649 16128 -1 16128 -1 16128 1961 16128 1960 16128 -1 16128 -1 16128 1965 16128 1964 16128 -1 16128 -1 16128 1969 16128 -1 16128 -1 16128 1972 16128 1971 16128 -1 16128 -1 16128 1976 16128 -1 16128 -1 16128 1979 16128 1978 16128 -1 16128 1982 16128 1975 16128 -1 16128 1985 16128 1968 16128 -1 16128 1988 16128 648 16128 -1 16128 1991 16128 647 16128 -1 16128 1994 16128 644 16128 -1 16128 1997 16128 643 64256 -1 16128 642 16128 641 16128 640 16128 624 64256 -1 16128 623 16128 622 16128 621 16128 620 3328 -1 64256 -1 64256 2011 3328 2010 3328 -1 64256 -1 64256 2015 3328 2014 32256 -1 1280256 -1 32256 2018 64256 2005 1280256 2019 32256 -1 1280256 -1 32256 2023 64256 2000 1280256 2024 16128 -1 16128 -1 16128 2029 32256 677 16128 -1 16128 -1 16128 2033 16128 2032 32256 650 16128 2028 16128 617 16128 -1 16128 2039 16128 -1 16128 -1 16128 2042 16128 -1 16128 -1 16128 2045 320256 -1 16128 2044 320256 2047 16128 -1 16128 2050 16128 2041 16128 -1 16128 2053 16128 616 16128 615 16128 -1 16128 2057 16128 614 16128 -1 16128 2060 16128 613 16128 599 16128 -1 16128 -1 16128 2065 16128 2064 16128 -1 16128 -1 16128 2069 16128 2068 16128 -1 16128 -1 16128 2073 16128 -1 16128 -1 16128 2076 16128 2075 16128 -1 16128 -1 16128 2080 16128 -1 16128 -1 16128 2083 16128 2082 16128 -1 16128 2086 16128 2079 16128 -1 16128 2089 16128 2072 16128 -1 16128 2092 16128 598 16128 -1 16128 2095 16128 597 16128 -1 16128 2098 16128 594 16128 -1 16128 2101 16128 593 64256 -1 16128 592 16128 591 16128 590 16128 574 64256 -1 16128 573 16128 572 16128 571 16128 570 3328 -1 64256 -1 64256 2115 3328 2114 3328 -1 64256 -1 64256 2119 3328 2118 32256 -1 1280256 -1 32256 2122 64256 2109 1280256 2123 32256 -1 1280256 -1 32256 2127 64256 2104 1280256 2128 16128 -1 16128 -1 16128 2133 32256 627 16128 -1 16128 -1 16128 2137 16128 2136 32256 600 16128 2132 16128 567 16128 -1 16128 2143 16128 -1 16128 -1 16128 2146 16128 -1 16128 -1 16128 2149 320256 -1 16128 2148 320256 2151 16128 -1 16128 2154 16128 2145 16128 -1 16128 2157 16128 566 16128 565 16128 -1 16128 2161 16128 564 16128 -1 16128 2164 16128 563 16128 549 16128 -1 16128 -1 16128 2169 16128 2168 16128 -1 16128 -1 16128 2173 16128 2172 16128 -1 16128 -1 16128 2177 16128 -1 16128 -1 16128 2180 16128 2179 16128 -1 16128 -1 16128 2184 16128 -1 16128 -1 16128 2187 16128 2186 16128 -1 16128 2190 16128 2183 16128 -1 16128 2193 16128 2176 16128 -1 16128 2196 16128 548 16128 -1 16128 2199 16128 547 16128 -1 16128 2202 16128 544 16128 -1 16128 2205 16128 543 64256 -1 16128 542 16128 541 16128 540 16128 524 64256 -1 16128 523 16128 522 16128 521 16128 520 3328 -1 64256 -1 64256 2219 3328 2218 3328 -1 64256 -1 64256 2223 3328 2222 32256 -1 1280256 -1 32256 2226 64256 2213 1280256 2227 32256 -1 1280256 -1 32256 2231 64256 2208 1280256 2232 16128 -1 16128 -1 16128 2237 32256 577 16128 -1 16128 -1 16128 2241 16128 2240 32256 550 16128 2236 16128 517 16128 -1 16128 2247 16128 -1 16128 -1 16128 2250 16128 -1 16128 -1 16128 2253 320256 -1 16128 2252 320256 2255 16128 -1 16128 2258 16128 2249 16128 -1 16128 2261 16128 516 16128 515 16128 -1 16128 2265 16128 514 16128 -1 16128 2268 16128 513 16128 499 16128 -1 16128 -1 16128 2273 16128 2272 16128 -1 16128 -1 16128 2277 16128 2276 16128 -1 16128 -1 16128 2281 16128 -1 16128 -1 16128 2284 16128 2283 16128 -1 16128 -1 16128 2288 16128 -1 16128 -1 16128 2291 16128 2290 16128 -1 16128 2294 16128 2287 16128 -1 16128 2297 16128 2280 16128 -1 16128 2300 16128 498 16128 -1 16128 2303 16128 497 16128 -1 16128 2306 16128 494 16128 -1 16128 2309 16128 493 64256 -1 16128 492 16128 491 16128 490 16128 474 64256 -1 16128 473 16128 472 16128 471 16128 470 3328 -1 64256 -1 64256 2323 3328 2322 3328 -1 64256 -1 64256 2327 3328 2326 32256 -1 1280256 -1 32256 2330 64256 2317 1280256 2331 32256 -1 1280256 -1 32256 2335 64256 2312 1280256 2336 16128 -1 16128 -1 16128 2341 32256 527 16128 -1 16128 -1 16128 2345 16128 2344 32256 500 16128 2340 16128 467 16128 -1 16128 2351 16128 -1 16128 -1 16128 2354 16128 -1 16128 -1 16128 2357 320256 -1 16128 2356 320256 2359 16128 -1 16128 2362 16128 2353 16128 -1 16128 2365 16128 466 16128 465 16128 -1 16128 2369 16128 464 16128 -1 16128 2372 16128 463 16128 449 16128 -1 16128 -1 16128 2377 16128 2376 16128 -1 16128 -1 16128 2381 16128 2380 16128 -1 16128 -1 16128 2385 16128 -1 16128 -1 16128 2388 16128 2387 16128 -1 16128 -1 16128 2392 16128 -1 16128 -1 16128 2395 16128 2394 16128 -1 16128 2398 16128 2391 16128 -1 16128 2401 16128 2384 16128 -1 16128 2404 16128 448 16128 -1 16128 2407 16128 447 16128 -1 16128 2410 16128 444 16128 -1 16128 2413 16128 443 64256 -1 16128 442 16128 441 16128 440 16128 424 64256 -1 16128 423 16128 422 16128 421 16128 420 3328 -1 64256 -1 64256 2427 3328 2426 3328 -1 64256 -1 64256 2431 3328 2430 32256 -1 1280256 -1 32256 2434 64256 2421 1280256 2435 32256 -1 1280256 -1 32256 2439 64256 2416 1280256 2440 16128 -1 16128 -1 16128 2445 32256 477 16128 -1 16128 -1 16128 2449 16128 2448 32256 450 16128 2444 16128 417 16128 -1 16128 2455 16128 -1 16128 -1 16128 2458 16128 -1 16128 -1 16128 2461 320256 -1 16128 2460 320256 2463 16128 -1 16128 2466 16128 2457 16128 -1 16128 2469 16128 416 16128 415 16128 -1 16128 2473 16128 414 16128 -1 16128 2476 16128 413 16128 399 16128 -1 16128 -1 16128 2481 16128 2480 16128 -1 16128 -1 16128 2485 16128 2484 16128 -1 16128 -1 16128 2489 16128 -1 16128 -1 16128 2492 16128 2491 16128 -1 16128 -1 16128 2496 16128 -1 16128 -1 16128 2499 16128 2498 16128 -1 16128 2502 16128 2495 16128 -1 16128 2505 16128 2488 16128 -1 16128 2508 16128 398 16128 -1 16128 2511 16128 397 16128 -1 16128 2514 16128 394 16128 -1 16128 2517 16128 393 64256 -1 16128 392 16128 391 16128 390 16128 374 64256 -1 16128 373 16128 372 16128 371 16128 370 3328 -1 64256 -1 64256 2531 3328 2530 3328 -1 64256 -1 64256 2535 3328 2534 32256 -1 1280256 -1 32256 2538 64256 2525 1280256 2539 32256 -1 1280256 -1 32256 2543 64256 2520 1280256 2544 16128 -1 16128 -1 16128 2549 32256 427 16128 -1 16128 -1 16128 2553 16128 2552 32256 400 16128 2548 16128 367 16128 -1 16128 2559 16128 -1 16128 -1 16128 2562 16128 -1 16128 -1 16128 2565 320256 -1 16128 2564 320256 2567 16128 -1 16128 2570 16128 2561 16128 -1 16128 2573 16128 366 16128 365 16128 -1 16128 2577 16128 364 16128 -1 16128 2580 16128 363 16128 349 16128 -1 16128 -1 16128 2585 16128 2584 16128 -1 16128 -1 16128 2589 16128 2588 16128 -1 16128 -1 16128 2593 16128 -1 16128 -1 16128 2596 16128 2595 16128 -1 16128 -1 16128 2600 16128 -1 16128 -1 16128 2603 16128 2602 16128 -1 16128 2606 16128 2599 16128 -1 16128 2609 16128 2592 16128 -1 16128 2612 16128 348 16128 -1 16128 2615 16128 347 16128 -1 16128 2618 16128 344 16128 -1 16128 2621 16128 343 64256 -1 16128 342 16128 341 16128 340 16128 324 64256 -1 16128 323 16128 322 16128 321 16128 320 3328 -1 64256 -1 64256 2635 3328 2634 3328 -1 64256 -1 64256 2639 3328 2638 32256 -1 1280256 -1 32256 2642 64256 2629 1280256 2643 32256 -1 1280256 -1 32256 2647 64256 2624 1280256 2648 16128 -1 16128 -1 16128 2653 32256 377 16128 -1 16128 -1 16128 2657 16128 2656 32256 350 16128 2652 16128 317 16128 -1 16128 2663 16128 -1 16128 -1 16128 2666 16128 -1 16128 -1 16128 2669 320256 -1 16128 2668 320256 2671 16128 -1 16128 2674 16128 2665 16128 -1 16128 2677 16128 316 16128 315 16128 -1 16128 2681 16128 314 16128 -1 16128 2684 16128 313 16128 299 16128 -1 16128 -1 16128 2689 16128 2688 16128 -1 16128 -1 16128 2693 16128 2692 16128 -1 16128 -1 16128 2697 16128 -1 16128 -1 16128 2700 16128 2699 16128 -1 16128 -1 16128 2704 16128 -1 16128 -1 16128 2707 16128 2706 16128 -1 16128 2710 16128 2703 16128 -1 16128 2713 16128 2696 16128 -1 16128 2716 16128 298 16128 -1 16128 2719 16128 297 16128 -1 16128 2722 16128 294 16128 -1 16128 2725 16128 293 64256 -1 16128 292 16128 291 16128 290 16128 274 64256 -1 16128 273 16128 272 16128 271 16128 270 3328 -1 64256 -1 64256 2739 3328 2738 3328 -1 64256 -1 64256 2743 3328 2742 32256 -1 1280256 -1 32256 2746 64256 2733 1280256 2747 32256 -1 1280256 -1 32256 2751 64256 2728 1280256 2752 16128 -1 16128 -1 16128 2757 32256 327 16128 -1 16128 -1 16128 2761 16128 2760 32256 300 16128 2756 16128 267 16128 -1 16128 2767 16128 -1 16128 -1 16128 2770 16128 -1 16128 -1 16128 2773 320256 -1 16128 2772 320256 2775 16128 -1 16128 2778 16128 2769 16128 -1 16128 2781 16128 266 16128 265 16128 -1 16128 2785 16128 264 16128 -1 16128 2788 16128 263 16128 249 16128 -1 16128 -1 16128 2793 16128 2792 16128 -1 16128 -1 16128 2797 16128 2796 16128 -1 16128 -1 16128 2801 16128 -1 16128 -1 16128 2804 16128 2803 16128 -1 16128 -1 16128 2808 16128 -1 16128 -1 16128 2811 16128 2810 16128 -1 16128 2814 16128 2807 16128 -1 16128 2817 16128 2800 16128 -1 16128 2820 16128 248 16128 -1 16128 2823 16128 247 16128 -1 16128 2826 16128 244 16128 -1 16128 2829 16128 243 64256 -1 16128 242 16128 241 16128 240 16128 224 64256 -1 16128 223 16128 222 16128 221 16128 220 3328 -1 64256 -1 64256 2843 3328 2842 3328 -1 64256 -1 64256 2847 3328 2846 32256 -1 1280256 -1 32256 2850 64256 2837 1280256 2851 32256 -1 1280256 -1 32256 2855 64256 2832 1280256 2856 16128 -1 16128 -1 16128 2861 32256 277 16128 -1 16128 -1 16128 2865 16128 2864 32256 250 16128 2860 16128 217 16128 -1 16128 2871 16128 -1 16128 -1 16128 2874 16128 -1 16128 -1 16128 2877 320256 -1 16128 2876 320256 2879 16128 -1 16128 2882 16128 2873 16128 -1 16128 2885 16128 216 16128 215 16128 -1 16128 2889 16128 214 16128 -1 16128 2892 16128 213 16128 199 16128 -1 16128 -1 16128 2897 16128 2896 16128 -1 16128 -1 16128 2901 16128 2900 16128 -1 16128 -1 16128 2905 16128 -1 16128 -1 16128 2908 16128 2907 16128 -1 16128 -1 16128 2912 16128 -1 16128 -1 16128 2915 16128 2914 16128 -1 16128 2918 16128 2911 16128 -1 16128 2921 16128 2904 16128 -1 16128 2924 16128 198 16128 -1 16128 2927 16128 197 16128 -1 16128 2930 16128 194 16128 -1 16128 2933 16128 193 64256 -1 16128 192 16128 191 16128 190 16128 174 64256 -1 16128 173 16128 172 16128 171 16128 170 3328 -1 64256 -1 64256 2947 3328 2946 3328 -1 64256 -1 64256 2951 3328 2950 32256 -1 1280256 -1 32256 2954 64256 2941 1280256 2955 32256 -1 1280256 -1 32256 2959 64256 2936 1280256 2960 16128 -1 16128 -1 16128 2965 32256 227 16128 -1 16128 -1 16128 2969 16128 2968 32256 200 16128 2964 16128 167 16128 -1 16128 2975 16128 -1 16128 -1 16128 2978 16128 -1 16128 -1 16128 2981 320256 -1 16128 2980 320256 2983 16128 -1 16128 2986 16128 2977 16128 -1 16128 2989 16128 166 16128 165 16128 -1 16128 2993 16128 164 16128 -1 16128 2996 16128 163 16128 149 16128 -1 16128 -1 16128 3001 16128 3000 16128 -1 16128 -1 16128 3005 16128 3004 16128 -1 16128 -1 16128 3009 16128 -1 16128 -1 16128 3012 16128 3011 16128 -1 16128 -1 16128 3016 16128 -1 16128 -1 16128 3019 16128 3018 16128 -1 16128 3022 16128 3015 16128 -1 16128 3025 16128 3008 16128 -1 16128 3028 16128 148 16128 -1 16128 3031 16128 147 16128 -1 16128 3034 16128 144 16128 -1 16128 3037 16128 143 64256 -1 16128 142 16128 141 16128 140 16128 124 64256 -1 16128 123 16128 122 16128 121 16128 120 3328 -1 64256 -1 64256 3051 3328 3050 3328 -1 64256 -1 64256 3055 3328 3054 32256 -1 1280256 -1 32256 3058 64256 3045 1280256 3059 32256 -1 1280256 -1 32256 3063 64256 3040 1280256 3064 16128 -1 16128 -1 16128 3069 32256 177 16128 -1 16128 -1 16128 3073 16128 3072 32256 150 16128 3068 16128 117 16128 -1 16128 3079 16128 -1 16128 -1 16128 3082 16128 -1 16128 -1 16128 3085 320256 -1 16128 3084 320256 3087 16128 -1 16128 3090 16128 3081 16128 -1 16128 3093 16128 116 16128 115 16128 -1 16128 3097 16128 114 16128 -1 16128 3100 16128 113 16128 99 16128 -1 16128 -1 16128 3105 16128 3104 16128 -1 16128 -1 16128 3109 16128 3108 16128 -1 16128 -1 16128 3113 16128 -1 16128 -1 16128 3116 16128 3115 16128 -1 16128 -1 16128 3120 16128 -1 16128 -1 16128 3123 16128 3122 16128 -1 16128 3126 16128 3119 16128 -1 16128 3129 16128 3112 16128 -1 16128 3132 16128 98 16128 -1 16128 3135 16128 97 16128 -1 16128 3138 16128 94 16128 -1 16128 3141 16128 93 16128 -1 16128 3144 64256 -1 16128 92 16128 91 16128 90 16128 74 64256 -1 16128 73 16128 72 16128 71 16128 70 32256 -1 16128 67 3328 -1 64256 -1 64256 3159 3328 3158 3328 -1 64256 -1 64256 3163 3328 3162 32256 -1 1280256 -1 32256 3166 64256 3151 1280256 3167 32256 -1 1280256 -1 32256 3171 64256 3146 1280256 3172 16128 -1 16128 -1 16128 3177 32256 3156 16128 -1 16128 -1 16128 3181 16128 3180 32256 127 16128 3176 16128 -1 16128 3186 16128 -1 16128 -1 16128 3189 16128 -1 16128 3191 320256 -1 16128 3188 320256 3193 16128 -1 16128 3196 16128 66 16128 -1 16128 3199 16128 65 16128 64 32256 -1 16128 63 16128 -1 16128 -1 16128 3206 16128 3205 16128 -1 16128 -1 16128 3210 16128 -1 16128 -1 16128 3213 16128 3212 16128 -1 16128 3216 16128 3209 16128 -1 16128 3219 16128 49 16128 -1 16128 3222 16128 48 16128 -1 16128 3225 64256 -1 16128 47 16128 44 16128 43 16128 42 32256 -1 16128 41 32256 3232 32256 3203 3328 -1 64256 -1 64256 3237 3328 3236 32256 -1 32256 3240 32256 -1 1280256 -1 32256 3242 64256 3227 1280256 3243 16128 -1 16128 -1 16128 3248 16128 3247 32256 100 16128 -1 16128 3252 16128 -1 16128 3254 320256 -1 16128 40 320256 3256 320256 1320 32256 -1 16128 39 32256 3260 32256 77 320256 -1 320256 3264 32256 -1 32256 3266 8000256 -1 320256 14 3328 -1 256 -1 256 -1 256 3272 1280256 -1 3328 3270 256 -1 5376 -1 5376 3277 3328 -1 1280256 3274 256 -1 256 -1 256 3282 1280256 -1 3328 3279 256 -1 5376 -1 5376 3287 8000256 -1 1280256 3284 256 -1 5376 -1 5376 3292 40192 -1 8000256 3289 256 -1 5376 -1 5376 3297 8000256 -1 40192 3294 256 -1 5376 -1 5376 3302 256 -1 256 -1 256 -1 256 3306 256 3305 256 -1 256 3309 256 -1 256 -1 256 3312 3328 -1 1280256 -1 3328 -1 1280256 -1 8000256 -1 40192 -1 8000256 -1 256 3311 256 3304 256 3301 256 3296 256 3291 256 3286 8000256 3320 256 3281 256 3276 256 3271 256 -1 8000256 3318 40192 3319 8000256 3299 1280256 3317 3328 3316 1280256 3315 3328 3314 256 3331 256 1112 32256 50 32256 32 256 1054 256 1025 3328 1285 3328 1206 32256 13 32256 12 32256 11 32256 10 16128 38 16128 37 16128 36 16128 29 16128 24 16128 23 16128 18 16128 17 3328 9 3328 8 1280256 1293 1280256 1210 3328 3 3328 1 1280256 2 1280256 0 8000256 3268 8000256 1085 40192 1081 40192 6 8000256 5 8000256 4 -- GitLab