#include "vectorwrapper/vectorops.hpp" #include "vectorwrapper/vectorwrapper_simd.hpp" #include #include #include namespace vwr { typedef std::aligned_storage::type float3_storage; template <> struct VectorWrapperInfo { enum { dimensions = 3 }; typedef float scalar_type; enum { offset_x = 0, offset_y = offset_x + sizeof(scalar_type), offset_z = offset_y + sizeof(scalar_type) }; }; } //namespace vwr TEST(vwr_speed, speed) { std::minstd_rand randgen; typedef vwr::simd::Vec simd_vec3; static_assert(sizeof(simd_vec3) >= sizeof(float) * 3, "SIMD vector too small"); auto s1 = static_cast(randgen()) / static_cast(randgen.max()); auto s2 = static_cast(randgen()) / static_cast(randgen.max()); simd_vec3 v1(s1); simd_vec3 v2(s2); s1 += s2; v1 += v2; EXPECT_FLOAT_EQ(s1, v1.x()); EXPECT_FLOAT_EQ(s1, v1.y()); EXPECT_FLOAT_EQ(s1, v1.z()); auto s3 = s1 + s2; simd_vec3 v3 = v1 + v2; EXPECT_FLOAT_EQ(s3, v3.x()); EXPECT_FLOAT_EQ(s3, v3.y()); EXPECT_FLOAT_EQ(s3, v3.z()); auto s4 = (s3 - s2) * s1; simd_vec3 v4 = (v3 - v2) * v1; EXPECT_FLOAT_EQ(s4, v4.x()); EXPECT_FLOAT_EQ(s4, v4.y()); EXPECT_FLOAT_EQ(s4, v4.z()); simd_vec3::pack_type zeroeight(0.8f); auto s5 = s4 / s1 + 0.8f; simd_vec3 v5 = v4 / v1 + zeroeight; EXPECT_FLOAT_EQ(s5, v5.x()); EXPECT_FLOAT_EQ(s5, v5.y()); EXPECT_FLOAT_EQ(s5, v5.z()); }