[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57652] trunk/blender/intern/cycles/util: Cycles: ensure any SSE data is allocated 16 byte aligned, happens automatically

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Jun 22 16:35:10 CEST 2013


Revision: 57652
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57652
Author:   blendix
Date:     2013-06-22 14:35:09 +0000 (Sat, 22 Jun 2013)
Log Message:
-----------
Cycles: ensure any SSE data is allocated 16 byte aligned, happens automatically
on many platforms but is not assured everywhere.

Modified Paths:
--------------
    trunk/blender/intern/cycles/util/util_types.h
    trunk/blender/intern/cycles/util/util_vector.h

Modified: trunk/blender/intern/cycles/util/util_types.h
===================================================================
--- trunk/blender/intern/cycles/util/util_types.h	2013-06-22 12:52:15 UTC (rev 57651)
+++ trunk/blender/intern/cycles/util/util_types.h	2013-06-22 14:35:09 UTC (rev 57652)
@@ -552,6 +552,30 @@
 }
 #endif
 
+#ifndef __KERNEL_GPU__
+
+static inline void *malloc_aligned(size_t size, size_t alignment)
+{
+	void *data = (void*)malloc(size + sizeof(void*) + alignment - 1);
+
+	union { void *ptr; size_t offset; } u;
+	u.ptr = (char*)data + sizeof(void*);
+	u.offset = (u.offset + alignment - 1) & ~(alignment - 1);
+	*(((void**)u.ptr) - 1) = data;
+
+	return u.ptr;
+}
+
+static inline void free_aligned(void *ptr)
+{
+	if(ptr) {
+		void *data = *(((void**)ptr) - 1);
+		free(data);
+	}
+}
+
+#endif
+
 CCL_NAMESPACE_END
 
 #endif /* __UTIL_TYPES_H__ */

Modified: trunk/blender/intern/cycles/util/util_vector.h
===================================================================
--- trunk/blender/intern/cycles/util/util_vector.h	2013-06-22 12:52:15 UTC (rev 57651)
+++ trunk/blender/intern/cycles/util/util_vector.h	2013-06-22 14:35:09 UTC (rev 57652)
@@ -24,18 +24,22 @@
 #include <string.h>
 #include <vector>
 
+#include "util_types.h"
+
 CCL_NAMESPACE_BEGIN
 
 using std::vector;
 
 /* Array
  *
- * Simplified version of vector, serving two purposes:
+ * Simplified version of vector, serving multiple purposes:
  * - somewhat faster in that it does not clear memory on resize/alloc,
- *   this was actually showing up in profiles quite significantly
- * - if this is used, we are not tempted to use inefficient operations */
+ *   this was actually showing up in profiles quite significantly. it
+ *   also does not run any constructors/destructors
+ * - if this is used, we are not tempted to use inefficient operations
+ * - aligned allocation for SSE data types */
 
-template<typename T>
+template<typename T, size_t alignment = 16>
 class array
 {
 public:
@@ -52,7 +56,7 @@
 			datasize = 0;
 		}
 		else {
-			data = new T[newsize];
+			data = (T*)malloc_aligned(sizeof(T)*newsize, alignment);
 			datasize = newsize;
 		}
 	}
@@ -69,7 +73,7 @@
 			datasize = 0;
 		}
 		else {
-			data = new T[from.datasize];
+			data = (T*)malloc_aligned(sizeof(T)*from.datasize, alignment);
 			memcpy(data, from.data, from.datasize*sizeof(T));
 			datasize = from.datasize;
 		}
@@ -83,8 +87,11 @@
 		data = NULL;
 
 		if(datasize > 0) {
-			data = new T[datasize];
+			data = (T*)malloc_aligned(sizeof(T)*datasize, alignment);
 			memcpy(data, &from[0], datasize*sizeof(T));
+			free_aligned(data);
+			data = (T*)malloc_aligned(sizeof(T)*datasize, alignment);
+			memcpy(data, &from[0], datasize*sizeof(T));
 		}
 
 		return *this;
@@ -92,7 +99,7 @@
 
 	~array()
 	{
-		delete [] data;
+		free_aligned(data);
 	}
 
 	void resize(size_t newsize)
@@ -100,10 +107,10 @@
 		if(newsize == 0) {
 			clear();
 		}
-		else {
-			T *newdata = new T[newsize];
+		else if(newsize != datasize) {
+			T *newdata = (T*)malloc_aligned(sizeof(T)*newsize, alignment);
 			memcpy(newdata, data, ((datasize < newsize)? datasize: newsize)*sizeof(T));
-			delete [] data;
+			free_aligned(data);
 
 			data = newdata;
 			datasize = newsize;
@@ -112,7 +119,7 @@
 
 	void clear()
 	{
-		delete [] data;
+		free_aligned(data);
 		data = NULL;
 		datasize = 0;
 	}




More information about the Bf-blender-cvs mailing list