Blender  V2.93
util_avxf_test.h
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2016 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "testing/testing.h"
18 #include "util/util_system.h"
19 #include "util/util_types.h"
20 
22 
24 {
25 
26 #ifdef __KERNEL_AVX2__
27  return system_cpu_support_avx2();
28 #else
29 # ifdef __KERNEL_AVX__
30  return system_cpu_support_avx();
31 # endif
32 #endif
33 }
34 
35 #define INIT_AVX_TEST \
36  if (!validate_cpu_capabilities()) \
37  return; \
38 \
39  const avxf avxf_a(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f); \
40  const avxf avxf_b(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f); \
41  const avxf avxf_c(1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f);
42 
43 #define compare_vector_scalar(a, b) \
44  for (size_t index = 0; index < a.size; index++) \
45  EXPECT_FLOAT_EQ(a[index], b);
46 
47 #define compare_vector_vector(a, b) \
48  for (size_t index = 0; index < a.size; index++) \
49  EXPECT_FLOAT_EQ(a[index], b[index]);
50 
51 #define compare_vector_vector_near(a, b, abserror) \
52  for (size_t index = 0; index < a.size; index++) \
53  EXPECT_NEAR(a[index], b[index], abserror);
54 
55 #define basic_test_vv(a, b, op) \
56  INIT_AVX_TEST \
57  avxf c = a op b; \
58  for (size_t i = 0; i < a.size; i++) \
59  EXPECT_FLOAT_EQ(c[i], a[i] op b[i]);
60 
61 /* vector op float tests */
62 #define basic_test_vf(a, b, op) \
63  INIT_AVX_TEST \
64  avxf c = a op b; \
65  for (size_t i = 0; i < a.size; i++) \
66  EXPECT_FLOAT_EQ(c[i], a[i] op b);
67 
68 static const float float_b = 1.5f;
69 
70 TEST(TEST_CATEGORY_NAME, avxf_add_vv){basic_test_vv(avxf_a, avxf_b, +)} TEST(TEST_CATEGORY_NAME,
71  avxf_sub_vv){
72  basic_test_vv(avxf_a, avxf_b, -)} TEST(TEST_CATEGORY_NAME, avxf_mul_vv){
73  basic_test_vv(avxf_a, avxf_b, *)} TEST(TEST_CATEGORY_NAME, avxf_div_vv){
74  basic_test_vv(avxf_a, avxf_b, /)} TEST(TEST_CATEGORY_NAME, avxf_add_vf){
75  basic_test_vf(avxf_a, float_b, +)} TEST(TEST_CATEGORY_NAME, avxf_sub_vf){
76  basic_test_vf(avxf_a, float_b, -)} TEST(TEST_CATEGORY_NAME, avxf_mul_vf){
78  avxf_div_vf){basic_test_vf(avxf_a, float_b, /)}
79 
81 {
83  compare_vector_scalar(avxf(7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f),
84  static_cast<float>(index));
85  compare_vector_scalar(avxf(1.0f), 1.0f);
86  compare_vector_vector(avxf(1.0f, 2.0f), avxf(1.0f, 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 2.0f));
87  compare_vector_vector(avxf(1.0f, 2.0f, 3.0f, 4.0f),
88  avxf(1.0f, 2.0f, 3.0f, 4.0f, 1.0f, 2.0f, 3.0f, 4.0f));
89  compare_vector_vector(avxf(make_float3(1.0f, 2.0f, 3.0f)),
90  avxf(0.0f, 3.0f, 2.0f, 1.0f, 0.0f, 3.0f, 2.0f, 1.0f));
91 }
92 
94 {
96  compare_vector_vector(mm256_sqrt(avxf(1.0f, 4.0f, 9.0f, 16.0f, 25.0f, 36.0f, 49.0f, 64.0f)),
97  avxf(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f));
98 }
99 
100 TEST(TEST_CATEGORY_NAME, avxf_min_max)
101 {
103  compare_vector_vector(min(avxf_a, avxf_b), avxf_a);
104  compare_vector_vector(max(avxf_a, avxf_b), avxf_b);
105 }
106 
107 TEST(TEST_CATEGORY_NAME, avxf_set_sign)
108 {
110  avxf res = set_sign_bit<1, 0, 0, 0, 0, 0, 0, 0>(avxf_a);
111  compare_vector_vector(res, avxf(0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, -0.8f));
112 }
113 
115 {
117  avxf res = msub(avxf_a, avxf_b, avxf_c);
118  avxf exp = avxf((avxf_a[7] * avxf_b[7]) - avxf_c[7],
119  (avxf_a[6] * avxf_b[6]) - avxf_c[6],
120  (avxf_a[5] * avxf_b[5]) - avxf_c[5],
121  (avxf_a[4] * avxf_b[4]) - avxf_c[4],
122  (avxf_a[3] * avxf_b[3]) - avxf_c[3],
123  (avxf_a[2] * avxf_b[2]) - avxf_c[2],
124  (avxf_a[1] * avxf_b[1]) - avxf_c[1],
125  (avxf_a[0] * avxf_b[0]) - avxf_c[0]);
127 }
128 
130 {
132  avxf res = madd(avxf_a, avxf_b, avxf_c);
133  avxf exp = avxf((avxf_a[7] * avxf_b[7]) + avxf_c[7],
134  (avxf_a[6] * avxf_b[6]) + avxf_c[6],
135  (avxf_a[5] * avxf_b[5]) + avxf_c[5],
136  (avxf_a[4] * avxf_b[4]) + avxf_c[4],
137  (avxf_a[3] * avxf_b[3]) + avxf_c[3],
138  (avxf_a[2] * avxf_b[2]) + avxf_c[2],
139  (avxf_a[1] * avxf_b[1]) + avxf_c[1],
140  (avxf_a[0] * avxf_b[0]) + avxf_c[0]);
142 }
143 
145 {
147  avxf res = nmadd(avxf_a, avxf_b, avxf_c);
148  avxf exp = avxf(avxf_c[7] - (avxf_a[7] * avxf_b[7]),
149  avxf_c[6] - (avxf_a[6] * avxf_b[6]),
150  avxf_c[5] - (avxf_a[5] * avxf_b[5]),
151  avxf_c[4] - (avxf_a[4] * avxf_b[4]),
152  avxf_c[3] - (avxf_a[3] * avxf_b[3]),
153  avxf_c[2] - (avxf_a[2] * avxf_b[2]),
154  avxf_c[1] - (avxf_a[1] * avxf_b[1]),
155  avxf_c[0] - (avxf_a[0] * avxf_b[0]));
157 }
158 
159 TEST(TEST_CATEGORY_NAME, avxf_compare)
160 {
162  avxf a(0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f);
163  avxf b(7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f);
164  avxb res = a <= b;
165  int exp[8] = {
166  a[0] <= b[0] ? -1 : 0,
167  a[1] <= b[1] ? -1 : 0,
168  a[2] <= b[2] ? -1 : 0,
169  a[3] <= b[3] ? -1 : 0,
170  a[4] <= b[4] ? -1 : 0,
171  a[5] <= b[5] ? -1 : 0,
172  a[6] <= b[6] ? -1 : 0,
173  a[7] <= b[7] ? -1 : 0,
174  };
176 }
177 
178 TEST(TEST_CATEGORY_NAME, avxf_permute)
179 {
181  avxf res = permute<3, 0, 1, 7, 6, 5, 2, 4>(avxf_b);
182  compare_vector_vector(res, avxf(4.0f, 6.0f, 3.0f, 2.0f, 1.0f, 7.0f, 8.0f, 5.0f));
183 }
184 
186 {
188  avxf res = blend<0, 0, 1, 0, 1, 0, 1, 0>(avxf_a, avxf_b);
189  compare_vector_vector(res, avxf(0.1f, 0.2f, 3.0f, 0.4f, 5.0f, 0.6f, 7.0f, 0.8f));
190 }
191 
192 TEST(TEST_CATEGORY_NAME, avxf_shuffle)
193 {
195  avxf res = shuffle<0, 1, 2, 3, 1, 3, 2, 0>(avxf_a);
196  compare_vector_vector(res, avxf(0.4f, 0.2f, 0.1f, 0.3f, 0.5f, 0.6f, 0.7f, 0.8f));
197 }
198 
200 {
202  avxf res = cross(avxf_b, avxf_c);
204  avxf(0.0f,
205  -9.5367432e-07f,
206  0.0f,
207  4.7683716e-07f,
208  0.0f,
209  -3.8146973e-06f,
210  3.8146973e-06f,
211  3.8146973e-06f),
212  0.000002000f);
213 }
214 
216 {
218  float den, den2;
219  dot3(avxf_a, avxf_b, den, den2);
220  EXPECT_FLOAT_EQ(den, 14.9f);
221  EXPECT_FLOAT_EQ(den2, 2.9f);
222 }
223 
#define CCL_NAMESPACE_END
#define make_float3(x, y, z)
static unsigned a[3]
Definition: RandGen.cpp:92
INLINE Rall1d< T, V, S > exp(const Rall1d< T, V, S > &arg)
Definition: rall1d.h:295
#define min(a, b)
Definition: sort.c:51
Definition: util_avxb.h:26
Definition: util_avxf.h:24
float max
__forceinline avxf cross(const avxf &a, const avxf &b)
Definition: util_avxf.h:119
__forceinline const avxf madd(const avxf &a, const avxf &b, const avxf &c)
Ternary Operators.
Definition: util_avxf.h:334
__forceinline const avxf msub(const avxf &a, const avxf &b, const avxf &c)
Definition: util_avxf.h:351
__forceinline const avxf nmadd(const avxf &a, const avxf &b, const avxf &c)
Definition: util_avxf.h:343
__forceinline const avxf mm256_sqrt(const avxf &a)
Definition: util_avxf.h:148
#define TEST_CATEGORY_NAME
#define basic_test_vv(a, b, op)
static CCL_NAMESPACE_BEGIN bool validate_cpu_capabilities()
#define INIT_AVX_TEST
#define compare_vector_vector(a, b)
static const float float_b
TEST(TEST_CATEGORY_NAME, avxf_add_vv)
#define basic_test_vf(a, b, op)
#define compare_vector_vector_near(a, b, abserror)
#define compare_vector_scalar(a, b)
#define dot3(a, b)
bool system_cpu_support_avx2()
bool system_cpu_support_avx()