#include "../lmath/lmath.h" #include "../lmath/lm_vector_sse.h" #include "../lmath/lm_vector_avx.h" #include #include #include using namespace concurrency; using namespace lm; void TestCPU() restrict(cpu) { double4_avx d0(1.0, 0, 1, 4); auto dm0 = d0.get<0>(); auto dm1 = d0.get<1>(); auto dm2 = d0.get<2>(); auto dm3 = d0.get<3>(); double dt = lm::dot(d0, d0); auto pp = lm::min(double4_avx(1, 2, 3, 4), double4_avx(4, 3, 2, 1)); auto ppp0 = pp.get<0>(); auto ppp1 = pp.get<1>(); auto ppp2 = pp.get<2>(); auto ppp3 = pp.get<3>(); auto pplen = pp.length(); auto f_sse3 = float4_sse(3) * float4_sse(4); auto l = float4_sse(0, 1, 2, 3); auto ls = lm::sum(l); auto lx = l.get<0>(); Vector p00(0U); Vector p0; Vector p1((uint16_t)0U, (uint16_t)1U, (uint16_t)2U, (uint16_t)3U, (uint16_t)4U); Vector p3((uint16_t)0U, (uint16_t)1U); Vector p4((uint16_t)0U, (uint16_t)1U, (uint16_t)2U); Vector p5((uint16_t)0U, (uint16_t)1U, (uint16_t)2U, (uint16_t)3U); Vector::unitX(); Vector::unitX(); Vector::unitX(); auto p3x = p3.y(); p0.lengthSquared(); // p0.length(); auto pp0 = p0 / 2.0f; auto pp1 = p0 * 2.0f; auto pp2 = p0 + 2.0f; auto pp3 = p0 - 2.0f; p0 /= 2; p0 *= 2; p0 += 2; p0 -= 2; //p0.normalized(); auto& v = p0.slice<1, 2>(); Vector v0(1.0f, 2.0f, 3.0f); v0 = -v0; v0 == v0; v0 != v0; auto v1 = cross(v0, v0 + 1.0f); auto v2 = dot(v0, v0 + 1.0f); auto v3 = normalize(v0); } void TestAMP() restrict(amp) { Vector p00(0U); Vector p0; Vector p1(0U, 1U, 2U, 3U, 4U); Vector p3(0U, 1U); Vector p4(0U, 1U, 2U); Vector p5(0U, 1U, 2U, 3U); Vector::unitX(); Vector::unitX(); Vector::unitX(); auto& v = p0.slice<1, 2>(); auto pp0 = p0 / 2.0f; auto pp1 = p0 * 2.0f; auto pp2 = p0 + 2.0f; auto pp3 = p0 - 2.0f; p0 /= 2; p0 *= 2; p0 += 2; p0 -= 2; Vector v0(1.0f, 2.0f, 3.0f); v0 = -v0; v0 == v0; v0 != v0; auto v1 = cross(v0, v0 + 1.0f); auto v2 = dot(v0, v0 + 1.0f); auto v3 = normalize(v0); } int main() { TestCPU(); Vector p0; std::vector amp_vector; std::vector amp_result_vector(amp_vector.size()); array_view arr(amp_vector); array_view arr_result(amp_result_vector); arr_result.discard_data(); parallel_for_each(arr.extent, [=](index<1> idx) restrict(amp) { TestAMP(); }); /*float4x4 ta; float4x4 tb; ta = tb; float4 pp(1.0f, 2.0f, 3.0f, 4.0f); float4 pn = -pp; auto& xyzw = pp.xyzw(); auto& xyz = pp.xyz(); auto& xy = pp.xy(); auto& yzw = pp.yzw(); auto& yz = pp.yz(); auto& zw = pp.zw(); auto& xx = pn.x(); auto& yy = pn.y(); auto& zz = pn.z(); float2 fff; auto& xf = fff.x(); auto& yf = fff.y(); //auto& zf = fff.z(); float* pf = (float*)pn; pp.slice<1, 2>() = float2(7.0f, 8.0f); Matrix vvvv( Vector(1.0f, 0.0f, 0.0f, 0.0f), Vector(0.0f, 1.0f, 0.0f, 0.0f), Vector(0.0f, 0.0f, 1.0f, 0.0f), Vector(0.0f, 0.0f, 0.0f, 1.0f)); auto deg1 = lm::degrees(lm::pi_d); auto deg2 = lm::degrees(lm::pi_d / 2.0); auto deg3 = lm::degrees(double2(pi_d / 2.0, pi_d / 3.0)); float expf = lm::exp(1.0f); auto expv = lm::exp(float2(2.0f, 3.0f)); float logf = lm::log(1.0f); auto logv = lm::log(float2(2.0f, 3.0f)); float minf1 = lm::min(1.0f, 2.0f); float minf2 = lm::min(2.0f, 1.0f); float maxf1 = lm::max(1.0f, 2.0f); float maxf2 = lm::max(2.0f, 1.0f); auto clampt = lm::clamp(float2(1.0f, 2.0f), float2(1.5f), float2(3.0f)); auto minv1 = lm::min(float2(1.0f, 2.0f), float2(5.0f, 1.0f)); auto minv2 = lm::min(float2(2.0f, 1.0f), float2(1.0f, 0.0f)); auto maxv1 = lm::max(float2(1.0f, 2.0f), float2(0.0f, 0.0f)); auto maxv2 = lm::max(float2(2.0f, 1.0f), float2(3.0f, 7.0f)); auto ux = float3::unitX(); auto pow_11 = lm::pow(float4(1.0f, 2.0f, 3.0f, 4.0f), 2.0f); Vector, 2> vv; vv[0] = float2(1.0f, 2.0f); vv[1] = float2(3.0f, 4.0f); auto pow_22 = lm::pow(vv, 2.0f); test_float2(); float3 mul_self_0(1.0f, 2.0f, 3.0f); mul_self_0 *= 2; mul_self_0 *= float3(2.0f, 3.0f, 4.0f); mul_self_0 /= 2; mul_self_0 /= float3(4.0f, 4.0f, 4.0f); mul_self_0 += 1; mul_self_0 += float3(4.0f, 4.0f, 4.0f); mul_self_0 -= 2; mul_self_0 -= float3(2.0f, 2.0f, 2.0f); //AMP test parallel_for_each(arr.extent, [=](index<1> idx) restrict(amp) { // Half h1; float3x3 m1; auto col1 = m1.getColumn(0); auto m2 = float3x3::identity(); auto m3 = float4x4::identity(); auto b2 = float3x3::identity(); auto m4 = lm::mul(m1, m2); float2x2 m22; auto det1 = determinant(m22); auto det2 = determinantAffine(m1); auto det3 = determinantAffine(m3); auto mi = inverse(m3, true); mi[0] = float4{ 0.0f,1.0f,2.0f,3.0f }; mi[1] = float4{ 4.0f,5.0f,6.0f,7.0f }; mi[2] = float4{ 8.0f,9.0f,10.0f,11.0f }; mi[3] = float4{ 12.0f,13.0f,14.0f,15.0f }; auto mm1 = (float2x2)mi; auto mm2 = (float3x3)mi; auto mm3 = (double4x4)mi; float3 t3(1.0f); auto len_1 = t3.lengthSquared(); auto len_2 = t3.length(); auto norm_1 = t3.normalized(); auto dot_1 = dot(t3, t3); auto cross_1 = cross(float3::unitY(), float3::unitX()); auto pow_1 = lm::pow(float4(1.0f, 2.0f, 3.0f, 4.0f), 2.0f); auto abs_1 = lm::abs(float4(1.0f, -2.0f, 3.0f, -4.0f)); auto acos_1 = lm::acos(float4(1.0f, 0.0f, -1.0f, -0.75f)); auto asin_1 = lm::asin(float4(1.0f, 0.0f, -1.0f, -0.75f)); auto atan_1 = lm::atan(float4(1.0f, 0.0f, -1.0f, -0.75f)); auto all_1 = lm::all(float4(0.0f, 0.0f, 0.0f, 0.0f)); auto all_2 = lm::all(float4(0.0f, 0.0f, 0.0f, 1.0f)); auto all_3 = lm::all(float4(0.0f, 0.0f, 1.0f, 1.0f)); auto all_4 = lm::all(float4(0.0f, 1.0f, 1.0f, 1.0f)); auto all_5 = lm::all(float4(1.0f, 1.0f, 1.0f, 1.0f)); auto any_1 = lm::any(float4(0.0f, 0.0f, 0.0f, 0.0f)); auto any_2 = lm::any(float4(0.0f, 0.0f, 0.0f, 1.0f)); auto any_3 = lm::any(float4(0.0f, 0.0f, 1.0f, 1.0f)); auto any_4 = lm::any(float4(0.0f, 1.0f, 1.0f, 1.0f)); auto any_5 = lm::any(float4(1.0f, 1.0f, 1.0f, 1.0f));*/ /* arr_result[idx] = lm::normalize(t3) + 2; float4x4 mat; mat.rows[0] = float4(1, 0, 0, 1); mat.rows[3] = float4(3); auto col0 = mat.get_column(0); auto floor_1 = lm::floor(float4(3.3f, 4.4f, 5.5f, 6.6f)); auto mat33 = (float3x3)mat; auto mat44 = (float4x4)mat; auto mat33_2 = (float3x3)mat; auto is_mat1 = lm::matrix_traits::is_matrix::value; auto is_mat2 = lm::matrix_traits::is_matrix::value; auto mmul1 = lm::matrix_traits::can_multiply::value; auto mmul2 = lm::matrix_traits::can_multiply::value; auto mmul3 = lm::matrix_traits::can_multiply::value; auto mul_r1 = lm::mul(mat33, mat33_2); auto is_identity_constexpr_4x4 = noexcept(float4x4::identity()); auto is_identity_constexpr_3x3 = noexcept(float3x3::identity()); auto id0 = float4x4::identity(); auto id1 = float3x3::identity(); auto id2 = float2x2::identity(); typedef Matrix double5x5; auto is_identity_constexpr_5x5 = noexcept(double5x5::identity()); auto id3 = double5x5::identity(); auto rc = double5x5::rows_count; auto mul_r = lm::mul(float3x4(1), float4x3(1)); auto mul_r2 = lm::mul(float3x3::identity(), float3x3::identity()); auto mul_r3 = lm::mul( float2x3(float3(1, 3, 2), float3(0, 4, -1)), float3x4(float4(2, 0, -1, 1), float4(3, -2, 1, 2), float4(0, 1, 2, 3))); auto clamp_1 = lm::clamp(test_vector, 1.0f, 2.0f); auto clamp_2 = lm::clamp(test_matrix, 0.0f, 7.0f); auto cosh_1 = lm::cosh(test_vector); auto cosh_2 = lm::cosh(test_matrix); auto cross_2 = lm::cross(float3(0, 1, 0), float3(0, 0, 1)); auto cross_3 = lm::cross(float3(0, 0, 1), float3(0, 1, 0)); auto degrees_0 = lm::degrees(float3((float)LM_PI / 2.0f, (float)LM_PI / 1.0f, (float)LM_PI / 4.0f)); auto det_1 = lm::determinant(float2x2(float2(1, 2), float2(-1, 3))); auto det_2 = lm::determinant(float3x3::identity()); auto norm_2 = lm::normalize(float3(1, 2, 4)); });*/ /*arr_result.synchronize(access_type_auto); auto val = std::is_same::value; static_assert(sizeof(float2) == sizeof(float) * 2, "Float2 size incorrect"); static_assert(sizeof(double2) == sizeof(double) * 2, "double2 size incorrect"); static_assert(sizeof(float3) == sizeof(float) * 3, "Float2 size incorrect"); static_assert(sizeof(double3) == sizeof(double) * 3, "double3 size incorrect"); static_assert(sizeof(float4) == sizeof(float) * 4, "Float4 size incorrect"); static_assert(sizeof(double4) == sizeof(double) * 4, "double4 size incorrect"); //CPU test test_float2(); test_float3(); test_float4(); auto asdouble_0 = lm::asdouble(123, 456); auto asdouble_1 = lm::asdouble(Vector(2, 2), Vector(300, 400)); float3x3 m1; auto col1 = m1.get_column(0); auto m2 = float3x3::identity(); auto m3 = float4x4::identity(); auto m4 = lm::mul(m1, m2); auto det1 = lm::determinant(m4); float3 t3(1); auto len_1 = lm::lengthSquared(t3); auto len_2 = lm::length(t3); auto norm_1 = lm::normalize(t3); auto dist_1 = lm::distance(t3, norm_1); auto dot_1 = lm::dot(lm::normalize(t3), lm::normalize(t3)); std::cin.get(); //static_assert(noexcept(Test_amp()), "Not constexpr ("); static constexpr float3 f3 = float3::up(); static constexpr float4 f4 = float4(1, 0, 0, 1); static constexpr float4 f4_value = float4(1); static constexpr float4 f4_init = { 1.0f,2.0f,3.0f,4.0f }; double3 d_add(4); float3 f_add(1); f_add = f_add + 2; auto b0 = f_add + d_add; auto b1 = f_add - d_add; auto b2 = f_add * d_add; auto b3 = f_add / d_add; auto b4 = f_add + 2; auto b5 = f_add - 2; auto b6 = f_add * 2; auto b7 = f_add / 2; float3 fup = float3::up() * 2; double3 dup = double3::up() * 2; auto flen_s = lm::lengthSquared(fup); auto flen = lm::length(fup); auto dlen_s = lm::lengthSquared(dup); auto dlen = lm::length(dup); auto pow_1 = lm::pow(float4(1, 2, 3, 4), 2.0f); auto abs_1 = lm::abs(float4(1, -2, 3, -4)); auto acos_1 = lm::acos(float4(1, 0, -1, -0.75f)); float4x4 mat; mat.rows[0] = float4(1, 0, 0, 1); mat.rows[3] = float4(3); auto col0 = mat.get_column(0); float4x4 mWorld; mWorld = float4x4::identity(); auto mat33 = (float3x3)mat; auto mat44 = (float4x4)mat; auto mat33_2 = (float3x3)mat; auto is_mat1 = lm::matrix_traits::is_matrix::value; auto is_mat2 = lm::matrix_traits::is_matrix::value; auto mmul1 = lm::matrix_traits::can_multiply::value; auto mmul2 = lm::matrix_traits::can_multiply::value; auto mmul3 = lm::matrix_traits::can_multiply::value; auto mul_r1 = lm::mul(mat33, mat33_2); auto is_identity_constexpr_4x4 = noexcept(float4x4::identity()); auto is_identity_constexpr_3x3 = noexcept(float3x3::identity()); auto id0 = float4x4::identity(); auto id1 = float3x3::identity(); auto id2 = float2x2::identity(); typedef Matrix double5x5; auto is_identity_constexpr_5x5 = noexcept(double5x5::identity()); auto id3 = double5x5::identity(); auto rc = double5x5::rows_count; auto mul_r = lm::mul(float3x4(1), float4x3(1)); auto mul_r2 = lm::mul(float3x3::identity(), float3x3::identity()); auto mul_r3 = lm::mul( float2x3(float3(1, 3, 2), float3(0, 4, -1)), float3x4(float4(2, 0, -1, 1), float4(3, -2, 1, 2), float4(0, 1, 2, 3))); auto is_square1 = lm::matrix_traits::is_square::value; auto asin_1 = lm::asin(float4(1, 0, -1, -0.75f)); auto atan_1 = lm::atan(float4(1, 0, -1, -0.75f)); auto all_1 = lm::all(float4(0, 0, 0, 0)); auto all_2 = lm::all(float4(0, 0, 0, 1)); auto all_3 = lm::all(float4(0, 0, 1, 1)); auto all_4 = lm::all(float4(0, 1, 1, 1)); auto all_5 = lm::all(float4(1, 1, 1, 1)); auto any_1 = lm::any(float4(0, 0, 0, 0)); auto any_2 = lm::any(float4(0, 0, 0, 1)); auto any_3 = lm::any(float4(0, 0, 1, 1)); auto any_4 = lm::any(float4(0, 1, 1, 1)); auto any_5 = lm::any(float4(1, 1, 1, 1)); float4 test_vector = float4(3.3f, 4.4f, 5.5f, 6.6f); float3x3 test_matrix = float3x3(float3(1.1f, 2.2f, 3.3f), float3(4.4f, 5.5f, 6.6f), float3(7.7f, 8.8f, 9.9f)); auto ceil_1 = lm::ceil(test_vector); auto ceil_2 = lm::ceil(test_matrix); auto clamp_1 = lm::clamp(test_vector, 1.0f, 2.0f); auto clamp_2 = lm::clamp(test_matrix, 0.0f, 7.0f); auto cos_1 = lm::cos(test_vector); auto cos_2 = lm::cos(test_matrix); auto cosh_1 = lm::cosh(test_vector); auto cosh_2 = lm::cosh(test_matrix); auto cross_1 = lm::cross(float3(0, 0, 1), float3(1, 0, 0)); auto cross_2 = lm::cross(float3(0, 1, 0), float3(0, 0, 1)); auto cross_3 = lm::cross(float3(0, 0, 1), float3(0, 1, 0)); auto degrees_0 = lm::degrees(float3((float)LM_PI / 2.0f, (float)LM_PI / 1.0f, (float)LM_PI / 4.0f)); auto det_1 = lm::determinant(float2x2(float2(1, 2), float2(-1, 3))); auto det_2 = lm::determinant(float3x3::identity()); auto norm_2 = lm::normalize(float3(1, 2, 4)); auto p1 = float3::up() / lm::length(float3::up()); auto dot_2 = lm::dot(float3::up(), float3::up()); auto dot_3 = lm::dot(float3::up(), lm::normalize(float3::up() + float3::right())); auto deg_1 = lm::degrees(std::acos(dot_1)); auto deg_2 = lm::degrees(std::acos(dot_2)); auto deg_3 = lm::degrees(std::acos(dot_3)); */ return 0; }