NEURON
alignment.cpp
Go to the documentation of this file.
1 /*
2 # =============================================================================
3 # Copyright (c) 2016 - 2022 Blue Brain Project/EPFL
4 #
5 # See top-level LICENSE file for details.
6 # =============================================================================.
7 */
9 
10 #include <catch2/catch_test_macros.hpp>
11 #include <catch2/catch_template_test_macros.hpp>
12 
13 #include <cstdint>
14 #include <cstring>
15 #include <tuple>
16 
17 template <class T, int n = 1>
18 struct data {
19  typedef T value_type;
20  static const int chunk = n;
21 };
22 
23 typedef std::tuple<data<double>, data<long long int>> chunk_default_data_type;
24 
25 typedef std::tuple<data<double, 2>,
36 
37 TEST_CASE("padding_simd", "[PaddingCheck]") {
38  /** AOS test */
39  int pad = coreneuron::soa_padded_size<1>(11, 1);
40  REQUIRE(pad == 11);
41 
42  /** SOA tests with 11 */
43  pad = coreneuron::soa_padded_size<1>(11, 0);
44  REQUIRE(pad == 11);
45 
46  pad = coreneuron::soa_padded_size<2>(11, 0);
47  REQUIRE(pad == 12);
48 
49  pad = coreneuron::soa_padded_size<4>(11, 0);
50  REQUIRE(pad == 12);
51 
52  pad = coreneuron::soa_padded_size<8>(11, 0);
53  REQUIRE(pad == 16);
54 
55  pad = coreneuron::soa_padded_size<16>(11, 0);
56  REQUIRE(pad == 16);
57 
58  pad = coreneuron::soa_padded_size<32>(11, 0);
59  REQUIRE(pad == 32);
60 
61  /** SOA tests with 32 */
62  pad = coreneuron::soa_padded_size<1>(32, 0);
63  REQUIRE(pad == 32);
64 
65  pad = coreneuron::soa_padded_size<2>(32, 0);
66  REQUIRE(pad == 32);
67 
68  pad = coreneuron::soa_padded_size<4>(32, 0);
69  REQUIRE(pad == 32);
70 
71  pad = coreneuron::soa_padded_size<8>(32, 0);
72  REQUIRE(pad == 32);
73 
74  pad = coreneuron::soa_padded_size<16>(32, 0);
75  REQUIRE(pad == 32);
76 
77  pad = coreneuron::soa_padded_size<32>(32, 0);
78  REQUIRE(pad == 32);
79 
80  /** SOA tests with 33 */
81  pad = coreneuron::soa_padded_size<1>(33, 0);
82  REQUIRE(pad == 33);
83 
84  pad = coreneuron::soa_padded_size<2>(33, 0);
85  REQUIRE(pad == 34);
86 
87  pad = coreneuron::soa_padded_size<4>(33, 0);
88  REQUIRE(pad == 36);
89 
90  pad = coreneuron::soa_padded_size<8>(33, 0);
91  REQUIRE(pad == 40);
92 
93  pad = coreneuron::soa_padded_size<16>(33, 0);
94  REQUIRE(pad == 48);
95 
96  pad = coreneuron::soa_padded_size<32>(33, 0);
97  REQUIRE(pad == 64);
98 }
99 
100 /// Even number is randomly depends of the TYPE!!! and the number of elements.
101 /// This test work for 64 bits type not for 32 bits.
102 TEMPLATE_LIST_TEST_CASE("memory_alignment_simd_false",
103  "[memory_alignment_simd_false]",
105  const int c = TestType::chunk;
106  int total_size_chunk = coreneuron::soa_padded_size<c>(247, 0);
107  int ne = 6 * total_size_chunk;
108 
109  typename TestType::value_type* data = (typename TestType::value_type*)
110  coreneuron::ecalloc_align(ne, sizeof(typename TestType::value_type), 16);
111 
112  for (int i = 1; i < 6; i += 2) {
113  bool b = coreneuron::is_aligned((data + i * total_size_chunk), 16);
114  REQUIRE_FALSE(b);
115  }
116 
117  for (int i = 0; i < 6; i += 2) {
118  bool b = coreneuron::is_aligned((data + i * total_size_chunk), 16);
119  REQUIRE(b);
120  }
121 
122  free_memory(data);
123 }
124 
125 TEMPLATE_LIST_TEST_CASE("memory_alignment_simd_true",
126  "[memory_alignment_simd_true]",
127  chunk_data_type) {
128  const int c = TestType::chunk;
129  int total_size_chunk = coreneuron::soa_padded_size<c>(247, 0);
130  int ne = 6 * total_size_chunk;
131 
132  typename TestType::value_type* data = (typename TestType::value_type*)
133  coreneuron::ecalloc_align(ne, sizeof(typename TestType::value_type), 16);
134 
135  for (int i = 0; i < 6; ++i) {
136  bool b = coreneuron::is_aligned((data + i * total_size_chunk), 16);
137  REQUIRE(b);
138  }
139 
140  free_memory(data);
141 }
TEST_CASE("padding_simd", "[PaddingCheck]")
Definition: alignment.cpp:37
std::tuple< data< double, 2 >, data< double, 4 >, data< double, 8 >, data< double, 16 >, data< double, 32 >, data< int, 2 >, data< int, 4 >, data< int, 8 >, data< int, 16 >, data< int, 32 > > chunk_data_type
Definition: alignment.cpp:35
std::tuple< data< double >, data< long long int > > chunk_default_data_type
Definition: alignment.cpp:23
TEMPLATE_LIST_TEST_CASE("memory_alignment_simd_false", "[memory_alignment_simd_false]", chunk_default_data_type)
Even number is randomly depends of the TYPE!!! and the number of elements.
Definition: alignment.cpp:102
#define i
Definition: md1redef.h:19
static int c
Definition: hoc.cpp:169
void free_memory(void *pointer)
Definition: memory.h:213
void * ecalloc_align(size_t n, size_t size, size_t alignment)
int const size_t const size_t n
Definition: nrngsl.h:10
static const int chunk
Definition: alignment.cpp:20
T value_type
Definition: alignment.cpp:19