From fec27a2db22d2aaabd867f1822a16e810c0dc5c4 Mon Sep 17 00:00:00 2001 From: qijun Date: Thu, 7 Dec 2017 14:53:46 +0800 Subject: [PATCH 1/4] fix gpu memory allocation policy --- paddle/memory/detail/system_allocator.cc | 2 +- paddle/memory/memory.cc | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/paddle/memory/detail/system_allocator.cc b/paddle/memory/detail/system_allocator.cc index 6b4e46f56a0c9c..b543b767e8015f 100644 --- a/paddle/memory/detail/system_allocator.cc +++ b/paddle/memory/detail/system_allocator.cc @@ -83,7 +83,7 @@ void* GPUAllocator::Alloc(size_t& index, size_t size) { paddle::platform::GpuMemoryUsage(available, capacity); // Reserve memory for page tables, etc. - size_t reserving = capacity - paddle::platform::GpuMaxAllocSize(); + size_t reserving = 0.05 * capacity + paddle::platform::GpuMinChunkSize(); size_t usable = available > reserving ? available - reserving : 0; // If remaining size no less than expected size, using general diff --git a/paddle/memory/memory.cc b/paddle/memory/memory.cc index 95cfe2525e3e7c..6b50d1908eac63 100644 --- a/paddle/memory/memory.cc +++ b/paddle/memory/memory.cc @@ -64,19 +64,23 @@ BuddyAllocator* GetGPUBuddyAllocator(int gpu_id) { int gpu_num = platform::GetCUDADeviceCount(); as = new BuddyAllocator*[gpu_num]; for (int gpu = 0; gpu < gpu_num; gpu++) { - platform::SetDeviceId(gpu); - as[gpu] = new BuddyAllocator(new detail::GPUAllocator, - platform::GpuMinChunkSize(), - platform::GpuMaxChunkSize()); + as[gpu] = nullptr; } + } + platform::SetDeviceId(gpu_id); + if (as[gpu_id]) { + return as[gpu_id]; + } else { + as[gpu_id] = new BuddyAllocator(new detail::GPUAllocator, + platform::GpuMinChunkSize(), + platform::GpuMaxChunkSize()); VLOG(10) << "\n\nNOTE: each GPU device use " << FLAGS_fraction_of_gpu_memory_to_use * 100 << "% of GPU memory.\n" - << "You can set environment variable '" - << platform::kEnvFractionGpuMemoryToUse + << "You can set GFlags environment variable '" + << "FLAGS_fraction_of_gpu_memory_to_use" << "' to change the fraction of GPU usage.\n\n"; } - platform::SetDeviceId(gpu_id); return as[gpu_id]; } From 0f24177e260b6c041361ac9beda2cfa9efc61a30 Mon Sep 17 00:00:00 2001 From: qijun Date: Thu, 7 Dec 2017 15:05:14 +0800 Subject: [PATCH 2/4] refine codes --- paddle/memory/memory.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paddle/memory/memory.cc b/paddle/memory/memory.cc index 6b50d1908eac63..fa68c9f349694c 100644 --- a/paddle/memory/memory.cc +++ b/paddle/memory/memory.cc @@ -80,8 +80,8 @@ BuddyAllocator* GetGPUBuddyAllocator(int gpu_id) { << "You can set GFlags environment variable '" << "FLAGS_fraction_of_gpu_memory_to_use" << "' to change the fraction of GPU usage.\n\n"; + return as[gpu_id]; } - return as[gpu_id]; } template <> From f914b33bbff849b91036cf13492d0adfe7fda7cd Mon Sep 17 00:00:00 2001 From: qijun Date: Thu, 7 Dec 2017 16:24:53 +0800 Subject: [PATCH 3/4] fix code style --- paddle/memory/memory.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paddle/memory/memory.cc b/paddle/memory/memory.cc index fa68c9f349694c..13553cc6a9b95f 100644 --- a/paddle/memory/memory.cc +++ b/paddle/memory/memory.cc @@ -72,8 +72,8 @@ BuddyAllocator* GetGPUBuddyAllocator(int gpu_id) { return as[gpu_id]; } else { as[gpu_id] = new BuddyAllocator(new detail::GPUAllocator, - platform::GpuMinChunkSize(), - platform::GpuMaxChunkSize()); + platform::GpuMinChunkSize(), + platform::GpuMaxChunkSize()); VLOG(10) << "\n\nNOTE: each GPU device use " << FLAGS_fraction_of_gpu_memory_to_use * 100 << "% of GPU memory.\n" From a106329c770dc0c9482c40300641dab58f293de0 Mon Sep 17 00:00:00 2001 From: qijun Date: Thu, 7 Dec 2017 18:27:17 +0800 Subject: [PATCH 4/4] follow comments --- paddle/memory/memory.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/paddle/memory/memory.cc b/paddle/memory/memory.cc index 13553cc6a9b95f..9cafdfda75d051 100644 --- a/paddle/memory/memory.cc +++ b/paddle/memory/memory.cc @@ -68,9 +68,7 @@ BuddyAllocator* GetGPUBuddyAllocator(int gpu_id) { } } platform::SetDeviceId(gpu_id); - if (as[gpu_id]) { - return as[gpu_id]; - } else { + if (!as[gpu_id]) { as[gpu_id] = new BuddyAllocator(new detail::GPUAllocator, platform::GpuMinChunkSize(), platform::GpuMaxChunkSize()); @@ -80,8 +78,8 @@ BuddyAllocator* GetGPUBuddyAllocator(int gpu_id) { << "You can set GFlags environment variable '" << "FLAGS_fraction_of_gpu_memory_to_use" << "' to change the fraction of GPU usage.\n\n"; - return as[gpu_id]; } + return as[gpu_id]; } template <>