You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							131 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							131 lines
						
					
					
						
							3.4 KiB
						
					
					
				| // This file is part of Eigen, a lightweight C++ template library | |
| // for linear algebra. Eigen itself is part of the KDE project. | |
| // | |
| // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> | |
| // | |
| // This Source Code Form is subject to the terms of the Mozilla | |
| // Public License v. 2.0. If a copy of the MPL was not distributed | |
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | |
|  | |
| #include "main.h" | |
|  | |
| #if EIGEN_ARCH_WANTS_ALIGNMENT | |
| #define ALIGNMENT 16 | |
| #else | |
| #define ALIGNMENT 1 | |
| #endif | |
|  | |
| void check_handmade_aligned_malloc() | |
| { | |
|   for(int i = 1; i < 1000; i++) | |
|   { | |
|     char *p = (char*)ei_handmade_aligned_malloc(i); | |
|     VERIFY(std::size_t(p)%ALIGNMENT==0); | |
|     // if the buffer is wrongly allocated this will give a bad write --> check with valgrind | |
|     for(int j = 0; j < i; j++) p[j]=0; | |
|     ei_handmade_aligned_free(p); | |
|   } | |
| } | |
| 
 | |
| void check_aligned_malloc() | |
| { | |
|   for(int i = 1; i < 1000; i++) | |
|   { | |
|     char *p = (char*)ei_aligned_malloc(i); | |
|     VERIFY(std::size_t(p)%ALIGNMENT==0); | |
|     // if the buffer is wrongly allocated this will give a bad write --> check with valgrind | |
|     for(int j = 0; j < i; j++) p[j]=0; | |
|     ei_aligned_free(p); | |
|   } | |
| } | |
| 
 | |
| void check_aligned_new() | |
| { | |
|   for(int i = 1; i < 1000; i++) | |
|   { | |
|     float *p = ei_aligned_new<float>(i); | |
|     VERIFY(std::size_t(p)%ALIGNMENT==0); | |
|     // if the buffer is wrongly allocated this will give a bad write --> check with valgrind | |
|     for(int j = 0; j < i; j++) p[j]=0; | |
|     ei_aligned_delete(p,i); | |
|   } | |
| } | |
| 
 | |
| void check_aligned_stack_alloc() | |
| { | |
|   for(int i = 1; i < 1000; i++) | |
|   { | |
|     ei_declare_aligned_stack_constructed_variable(float, p, i, 0); | |
|     VERIFY(std::size_t(p)%ALIGNMENT==0); | |
|     // if the buffer is wrongly allocated this will give a bad write --> check with valgrind | |
|     for(int j = 0; j < i; j++) p[j]=0; | |
|   } | |
| } | |
| 
 | |
| 
 | |
| // test compilation with both a struct and a class... | |
| struct MyStruct | |
| { | |
|   EIGEN_MAKE_ALIGNED_OPERATOR_NEW | |
|   char dummychar; | |
|   Vector4f avec; | |
| }; | |
| 
 | |
| class MyClassA | |
| { | |
|   public: | |
|     EIGEN_MAKE_ALIGNED_OPERATOR_NEW | |
|     char dummychar; | |
|     Vector4f avec; | |
| }; | |
| 
 | |
| template<typename T> void check_dynaligned() | |
| { | |
|   T* obj = new T; | |
|   VERIFY(std::size_t(obj)%ALIGNMENT==0); | |
|   delete obj; | |
| } | |
| 
 | |
| void test_eigen2_dynalloc() | |
| { | |
|   // low level dynamic memory allocation | |
|   CALL_SUBTEST(check_handmade_aligned_malloc()); | |
|   CALL_SUBTEST(check_aligned_malloc()); | |
|   CALL_SUBTEST(check_aligned_new()); | |
|   CALL_SUBTEST(check_aligned_stack_alloc()); | |
| 
 | |
|   for (int i=0; i<g_repeat*100; ++i) | |
|   { | |
|     CALL_SUBTEST( check_dynaligned<Vector4f>() ); | |
|     CALL_SUBTEST( check_dynaligned<Vector2d>() ); | |
|     CALL_SUBTEST( check_dynaligned<Matrix4f>() ); | |
|     CALL_SUBTEST( check_dynaligned<Vector4d>() ); | |
|     CALL_SUBTEST( check_dynaligned<Vector4i>() ); | |
|   } | |
|    | |
|   // check static allocation, who knows ? | |
|   { | |
|     MyStruct foo0;  VERIFY(std::size_t(foo0.avec.data())%ALIGNMENT==0); | |
|     MyClassA fooA;  VERIFY(std::size_t(fooA.avec.data())%ALIGNMENT==0); | |
|   } | |
| 
 | |
|   // dynamic allocation, single object | |
|   for (int i=0; i<g_repeat*100; ++i) | |
|   { | |
|     MyStruct *foo0 = new MyStruct();  VERIFY(std::size_t(foo0->avec.data())%ALIGNMENT==0); | |
|     MyClassA *fooA = new MyClassA();  VERIFY(std::size_t(fooA->avec.data())%ALIGNMENT==0); | |
|     delete foo0; | |
|     delete fooA; | |
|   } | |
| 
 | |
|   // dynamic allocation, array | |
|   const int N = 10; | |
|   for (int i=0; i<g_repeat*100; ++i) | |
|   { | |
|     MyStruct *foo0 = new MyStruct[N];  VERIFY(std::size_t(foo0->avec.data())%ALIGNMENT==0); | |
|     MyClassA *fooA = new MyClassA[N];  VERIFY(std::size_t(fooA->avec.data())%ALIGNMENT==0); | |
|     delete[] foo0; | |
|     delete[] fooA; | |
|   } | |
|    | |
| }
 |