vectorwrapper/test/speed/speed.cpp

59 lines
1.4 KiB
C++

#include "vectorwrapper/vectorops.hpp"
#include "vectorwrapper/vectorwrapper_simd.hpp"
#include <gtest/gtest.h>
#include <memory>
#include <random>
namespace vwr {
typedef std::aligned_storage<sizeof(float) * 3, 16>::type float3_storage;
template <>
struct VectorWrapperInfo<float3_storage> {
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<vwr::float3_storage> simd_vec3;
static_assert(sizeof(simd_vec3) >= sizeof(float) * 3, "SIMD vector too small");
auto s1 = static_cast<float>(randgen()) / static_cast<float>(randgen.max());
auto s2 = static_cast<float>(randgen()) / static_cast<float>(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());
}