#include #include namespace torch { namespace aot_inductor { template void ExpectVecEqual( const at::vec::Vectorized& expected, const at::vec::Vectorized& actual) { using Vec = at::vec::Vectorized; // Have to use std::vector for comparison because at::vec::Vectorized doesn't // support operator[] on aarch64 std::vector expected_data(Vec::size()); std::vector actual_data(Vec::size()); expected.store(expected_data.data()); actual.store(actual_data.data()); for (int i = 0; i < Vec::size(); i++) { EXPECT_EQ(expected_data[i], actual_data[i]); } } TEST(TestVec, TestAdd) { using Vec = at::vec::Vectorized; std::vector a(1024, 1); std::vector b(1024, 2); Vec a_vec = Vec::loadu(a.data()); Vec b_vec = Vec::loadu(b.data()); Vec actual_vec = a_vec + b_vec; std::vector expected(1024, 3); Vec expected_vec = Vec::loadu(expected.data()); ExpectVecEqual(expected_vec, actual_vec); } TEST(TestVec, TestMax) { using Vec = at::vec::Vectorized; std::vector a(1024, -1); std::vector b(1024, 2); Vec a_vec = Vec::loadu(a.data()); Vec b_vec = Vec::loadu(b.data()); Vec actual_vec = at::vec::maximum(a_vec, b_vec); Vec expected_vec = b_vec; ExpectVecEqual(expected_vec, actual_vec); } TEST(TestVec, TestMin) { using Vec = at::vec::Vectorized; std::vector a(1024, -1); std::vector b(1024, 2); Vec a_vec = Vec::loadu(a.data()); Vec b_vec = Vec::loadu(b.data()); Vec actual_vec = at::vec::minimum(a_vec, b_vec); Vec expected_vec = a_vec; ExpectVecEqual(expected_vec, actual_vec); } TEST(TestVec, TestConvert) { std::vector a(1024, -1); std::vector b(1024, -1.0); at::vec::Vectorized a_vec = at::vec::Vectorized::loadu(a.data()); at::vec::Vectorized b_vec = at::vec::Vectorized::loadu(b.data()); auto actual_vec = at::vec::convert(a_vec); auto expected_vec = b_vec; ExpectVecEqual(expected_vec, actual_vec); } TEST(TestVec, TestClampMin) { using Vec = at::vec::Vectorized; std::vector a(1024, -2.0); std::vector min(1024, -1.0); Vec a_vec = Vec::loadu(a.data()); Vec min_vec = Vec::loadu(min.data()); Vec actual_vec = at::vec::clamp_min(a_vec, min_vec); Vec expected_vec = min_vec; ExpectVecEqual(expected_vec, actual_vec); } } // namespace aot_inductor } // namespace torch