[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51886] trunk/blender: Cycles: memory usage report

Sergey Sharybin sergey.vfx at gmail.com
Mon Nov 5 09:04:57 CET 2012


Revision: 51886
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51886
Author:   nazgul
Date:     2012-11-05 08:04:57 +0000 (Mon, 05 Nov 2012)
Log Message:
-----------
Cycles: memory usage report

This commit adds memory usage information while rendering.

It reports memory used by device, meaning:

- For CPU it'll report real memory consumption
- For GPU rendering it'll report GPU memory consumption, but it'll
  also mean the same memory is used from host side.

This information displays information about memory requested by Cycles,
not memory really allocated on a device. Real memory usage might be
higher because of memory fragmentation or optimistic memory allocator.

There's really nothing we can do against this.

Also in contrast with blender internal's render cycles memory usage
does not include memory used by scene, only memory needed by cycles
itself will be displayed. So don't freak out if memory usage reported
by cycles would be much lower than blender internal's.

This commit also adds RenderEngine.update_memory_stats callback which
is used to tell memory consumption from external engine to blender.
This information is used to generate information line after rendering
is finished.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/device/device.cpp
    trunk/blender/intern/cycles/device/device.h
    trunk/blender/intern/cycles/device/device_cpu.cpp
    trunk/blender/intern/cycles/device/device_cuda.cpp
    trunk/blender/intern/cycles/device/device_intern.h
    trunk/blender/intern/cycles/device/device_multi.cpp
    trunk/blender/intern/cycles/device/device_network.cpp
    trunk/blender/intern/cycles/device/device_opencl.cpp
    trunk/blender/intern/cycles/render/buffers.cpp
    trunk/blender/intern/cycles/render/session.cpp
    trunk/blender/intern/cycles/render/session.h
    trunk/blender/intern/cycles/util/util_thread.h
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/makesrna/intern/rna_render.c
    trunk/blender/source/blender/render/extern/include/RE_engine.h
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/external_engine.c

Added Paths:
-----------
    trunk/blender/intern/cycles/util/util_stats.h

Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp	2012-11-05 08:04:57 UTC (rev 51886)
@@ -477,11 +477,15 @@
 	float progress;
 	double total_time;
 	char time_str[128];
+	float mem_used = (float)session->stats.mem_used / 1024.0f / 1024.0f;
+	float mem_peak = (float)session->stats.mem_peak / 1024.0f / 1024.0f;
 
 	get_status(status, substatus);
 	get_progress(progress, total_time);
 
-	timestatus = b_scene.name();
+	timestatus = string_printf("Mem: %.2fM, Peak: %.2fM | ", mem_used, mem_peak);
+
+	timestatus += b_scene.name();
 	if(b_rlay_name != "")
 		timestatus += ", "  + b_rlay_name;
 	timestatus += " | ";
@@ -494,6 +498,7 @@
 
 	if(status != last_status) {
 		b_engine.update_stats("", (timestatus + status).c_str());
+		b_engine.update_memory_stats(mem_used, mem_peak);
 		last_status = status;
 	}
 	if(progress != last_progress) {

Modified: trunk/blender/intern/cycles/device/device.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device.cpp	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device.cpp	2012-11-05 08:04:57 UTC (rev 51886)
@@ -78,36 +78,36 @@
 		glDisable(GL_BLEND);
 }
 
-Device *Device::create(DeviceInfo& info, bool background, int threads)
+Device *Device::create(DeviceInfo& info, Stats &stats, bool background, int threads)
 {
 	Device *device;
 
 	switch(info.type) {
 		case DEVICE_CPU:
-			device = device_cpu_create(info, threads);
+			device = device_cpu_create(info, stats, threads);
 			break;
 #ifdef WITH_CUDA
 		case DEVICE_CUDA:
 			if(cuLibraryInit())
-				device = device_cuda_create(info, background);
+				device = device_cuda_create(info, stats, background);
 			else
 				device = NULL;
 			break;
 #endif
 #ifdef WITH_MULTI
 		case DEVICE_MULTI:
-			device = device_multi_create(info, background);
+			device = device_multi_create(info, stats, background);
 			break;
 #endif
 #ifdef WITH_NETWORK
 		case DEVICE_NETWORK:
-			device = device_network_create(info, "127.0.0.1");
+			device = device_network_create(info, stats, "127.0.0.1");
 			break;
 #endif
 #ifdef WITH_OPENCL
 		case DEVICE_OPENCL:
 			if(clLibraryInit())
-				device = device_opencl_create(info, background);
+				device = device_opencl_create(info, stats, background);
 			else
 				device = NULL;
 			break;

Modified: trunk/blender/intern/cycles/device/device.h
===================================================================
--- trunk/blender/intern/cycles/device/device.h	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device.h	2012-11-05 08:04:57 UTC (rev 51886)
@@ -25,6 +25,7 @@
 #include "device_task.h"
 
 #include "util_list.h"
+#include "util_stats.h"
 #include "util_string.h"
 #include "util_thread.h"
 #include "util_types.h"
@@ -72,7 +73,7 @@
 
 class Device {
 protected:
-	Device() {}
+	Device(Stats &stats_) : stats(stats_) {}
 
 	bool background;
 	string error_msg;
@@ -84,6 +85,9 @@
 	DeviceInfo info;
 	virtual const string& error_message() { return error_msg; }
 
+	/* statistics */
+	Stats &stats;
+
 	/* regular memory */
 	virtual void mem_alloc(device_memory& mem, MemoryType type) = 0;
 	virtual void mem_copy_to(device_memory& mem) = 0;
@@ -130,7 +134,7 @@
 	virtual int device_number(Device *sub_device) { return 0; }
 
 	/* static */
-	static Device *create(DeviceInfo& info, bool background = true, int threads = 0);
+	static Device *create(DeviceInfo& info, Stats &stats, bool background = true, int threads = 0);
 
 	static DeviceType type_from_string(const char *name);
 	static string string_from_type(DeviceType type);

Modified: trunk/blender/intern/cycles/device/device_cpu.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cpu.cpp	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device_cpu.cpp	2012-11-05 08:04:57 UTC (rev 51886)
@@ -45,7 +45,7 @@
 	TaskPool task_pool;
 	KernelGlobals *kg;
 	
-	CPUDevice(int threads_num)
+	CPUDevice(Stats &stats, int threads_num) : Device(stats)
 	{
 		kg = kernel_globals_create();
 
@@ -67,6 +67,8 @@
 	void mem_alloc(device_memory& mem, MemoryType type)
 	{
 		mem.device_pointer = mem.data_pointer;
+
+		stats.mem_alloc(mem.memory_size());
 	}
 
 	void mem_copy_to(device_memory& mem)
@@ -87,6 +89,8 @@
 	void mem_free(device_memory& mem)
 	{
 		mem.device_pointer = 0;
+
+		stats.mem_free(mem.memory_size());
 	}
 
 	void const_copy_to(const char *name, void *host, size_t size)
@@ -98,11 +102,15 @@
 	{
 		kernel_tex_copy(kg, name, mem.data_pointer, mem.data_width, mem.data_height);
 		mem.device_pointer = mem.data_pointer;
+
+		stats.mem_alloc(mem.memory_size());
 	}
 
 	void tex_free(device_memory& mem)
 	{
 		mem.device_pointer = 0;
+
+		stats.mem_free(mem.memory_size());
 	}
 
 	void *osl_memory()
@@ -283,9 +291,9 @@
 	}
 };
 
-Device *device_cpu_create(DeviceInfo& info, int threads)
+Device *device_cpu_create(DeviceInfo& info, Stats &stats, int threads)
 {
-	return new CPUDevice(threads);
+	return new CPUDevice(stats, threads);
 }
 
 void device_cpu_info(vector<DeviceInfo>& devices)

Modified: trunk/blender/intern/cycles/device/device_cuda.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cuda.cpp	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device_cuda.cpp	2012-11-05 08:04:57 UTC (rev 51886)
@@ -157,7 +157,7 @@
 		cuda_assert(cuCtxSetCurrent(NULL));
 	}
 
-	CUDADevice(DeviceInfo& info, bool background_)
+	CUDADevice(DeviceInfo& info, Stats &stats, bool background_) : Device(stats)
 	{
 		background = background_;
 
@@ -316,8 +316,10 @@
 	{
 		cuda_push_context();
 		CUdeviceptr device_pointer;
-		cuda_assert(cuMemAlloc(&device_pointer, mem.memory_size()))
+		size_t size = mem.memory_size();
+		cuda_assert(cuMemAlloc(&device_pointer, size))
 		mem.device_pointer = (device_ptr)device_pointer;
+		stats.mem_alloc(size);
 		cuda_pop_context();
 	}
 
@@ -356,6 +358,8 @@
 			cuda_pop_context();
 
 			mem.device_pointer = 0;
+
+			stats.mem_free(mem.memory_size());
 		}
 	}
 
@@ -424,6 +428,8 @@
 			cuda_assert(cuTexRefSetFlags(texref, CU_TRSF_NORMALIZED_COORDINATES))
 
 			mem.device_pointer = (device_ptr)handle;
+
+			stats.mem_alloc(size);
 		}
 		else {
 			cuda_pop_context();
@@ -463,6 +469,8 @@
 
 				tex_interp_map.erase(tex_interp_map.find(mem.device_pointer));
 				mem.device_pointer = 0;
+
+				stats.mem_free(mem.memory_size());
 			}
 			else {
 				tex_interp_map.erase(tex_interp_map.find(mem.device_pointer));
@@ -707,6 +715,8 @@
 				mem.device_pointer = pmem.cuTexId;
 				pixel_mem_map[mem.device_pointer] = pmem;
 
+				stats.mem_alloc(mem.memory_size());
+
 				return;
 			}
 			else {
@@ -762,6 +772,8 @@
 				pixel_mem_map.erase(pixel_mem_map.find(mem.device_pointer));
 				mem.device_pointer = 0;
 
+				stats.mem_free(mem.memory_size());
+
 				return;
 			}
 
@@ -896,9 +908,9 @@
 	}
 };
 
-Device *device_cuda_create(DeviceInfo& info, bool background)
+Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background)
 {
-	return new CUDADevice(info, background);
+	return new CUDADevice(info, stats, background);
 }
 
 void device_cuda_info(vector<DeviceInfo>& devices)

Modified: trunk/blender/intern/cycles/device/device_intern.h
===================================================================
--- trunk/blender/intern/cycles/device/device_intern.h	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device_intern.h	2012-11-05 08:04:57 UTC (rev 51886)
@@ -23,11 +23,11 @@
 
 class Device;
 
-Device *device_cpu_create(DeviceInfo& info, int threads);
-Device *device_opencl_create(DeviceInfo& info, bool background);
-Device *device_cuda_create(DeviceInfo& info, bool background);
-Device *device_network_create(DeviceInfo& info, const char *address);
-Device *device_multi_create(DeviceInfo& info, bool background);
+Device *device_cpu_create(DeviceInfo& info, Stats &stats, int threads);
+Device *device_opencl_create(DeviceInfo& info, Stats &stats, bool background);
+Device *device_cuda_create(DeviceInfo& info, Stats &stats, bool background);
+Device *device_network_create(DeviceInfo& info, Stats &stats, const char *address);
+Device *device_multi_create(DeviceInfo& info, Stats &stats, bool background);
 
 void device_cpu_info(vector<DeviceInfo>& devices);
 void device_opencl_info(vector<DeviceInfo>& devices);

Modified: trunk/blender/intern/cycles/device/device_multi.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_multi.cpp	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device_multi.cpp	2012-11-05 08:04:57 UTC (rev 51886)
@@ -46,14 +46,14 @@
 	list<SubDevice> devices;
 	device_ptr unique_ptr;
 
-	MultiDevice(DeviceInfo& info, bool background_)
-	: unique_ptr(1)
+	MultiDevice(DeviceInfo& info, Stats &stats, bool background_)
+	: Device(stats), unique_ptr(1)
 	{
 		Device *device;
 		background = background_;
 
 		foreach(DeviceInfo& subinfo, info.multi_devices) {
-			device = Device::create(subinfo, background);
+			device = Device::create(subinfo, stats, background);
 			devices.push_back(SubDevice(device));
 		}
 
@@ -314,9 +314,9 @@
 	}
 };
 
-Device *device_multi_create(DeviceInfo& info, bool background)
+Device *device_multi_create(DeviceInfo& info, Stats &stats, bool background)
 {
-	return new MultiDevice(info, background);
+	return new MultiDevice(info, stats, background);
 }
 
 static bool device_multi_add(vector<DeviceInfo>& devices, DeviceType type, bool with_display, bool with_advanced_shading, const char *id_fmt, int num)

Modified: trunk/blender/intern/cycles/device/device_network.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_network.cpp	2012-11-05 08:04:41 UTC (rev 51885)
+++ trunk/blender/intern/cycles/device/device_network.cpp	2012-11-05 08:04:57 UTC (rev 51886)
@@ -32,8 +32,8 @@
 	boost::asio::io_service io_service;
 	tcp::socket socket;
 
-	NetworkDevice(const char *address)
-	: socket(io_service)
+	NetworkDevice(Stats &stats, const char *address)
+	: Device(stats), socket(io_service)
 	{
 		stringstream portstr;
 		portstr << SERVER_PORT;
@@ -202,9 +202,9 @@
 	}
 };
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list