122 using namespace details;
124 BOOST_CHECK_EQUAL(has_width<float>::value,
false);
125 BOOST_CHECK_EQUAL(has_width<vec_t>::value,
true);
127 BOOST_CHECK_EQUAL(has_alignment<float>::value,
false);
128 BOOST_CHECK_EQUAL(has_alignment<vec_t>::value,
true);
130 BOOST_CHECK_EQUAL(has_scalarType<float>::value,
false);
131 BOOST_CHECK_EQUAL(has_scalarType<vec_t>::value,
true);
133 BOOST_CHECK_EQUAL(is_vector_v<float>,
false);
134 BOOST_CHECK_EQUAL(is_vector_v<vec_t>,
true);
136 BOOST_CHECK_EQUAL(is_vector_floating_point_v<float>,
false);
138 BOOST_CHECK_EQUAL(is_vector_floating_point_v<vec_t>,
true);
216 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
220 for (
size_t i = 0; i < vec_t::width; ++i)
222 BOOST_CHECK_EQUAL(ascalararr[i], val);
230 std::array<float, vec_t::width> ascalararr{
234 for (
size_t i = 0; i < vec_t::width; ++i)
236 BOOST_CHECK_EQUAL(ascalararr[i], val);
244 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
248 for (
size_t i = 0; i < vec_t::width; ++i)
250 BOOST_CHECK_EQUAL(ascalararr[i], val);
266 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
269 for (
size_t i = 0; i < vec_t::width; ++i)
274 for (
size_t i = 0; i < vec_t::width; ++i)
276 avec[i] = ascalararr[i];
279 for (
size_t i = 0; i < vec_t::width; ++i)
281 BOOST_CHECK_EQUAL(ascalararr[i], avec[i]);
292 std::array<std::uint32_t, vec_t::width> aindex;
294 if (vec_t::width > 2)
300 if (vec_t::width > 4)
307 if (vec_t::width > 8)
323 constexpr size_t scalarArraySize = 64;
324 std::array<float, scalarArraySize> ascalararr;
325 for (
size_t i = 0; i < scalarArraySize; ++i)
330 avec.gather(ascalararr.data(), aindexvec);
333 for (
size_t i = 0; i < vec_t::width; ++i)
335 BOOST_CHECK_EQUAL(ascalararr[aindex[i]], avec[i]);
346 std::array<std::uint32_t, vec_t::width> aindex;
348 if (vec_t::width > 1)
352 if (vec_t::width > 2)
357 if (vec_t::width > 4)
364 if (vec_t::width > 8)
380 constexpr size_t scalarArraySize = 64;
381 std::array<float, scalarArraySize> ascalararr;
384 alignas(vec_t::alignment) std::array<float, vec_t::width> avecarr{{}};
386 if (vec_t::width > 1)
391 if (vec_t::width > 2)
396 if (vec_t::width > 4)
403 avec.load(avecarr.data());
405 avec.scatter(ascalararr.data(), aindexvec);
408 for (
size_t i = 0; i < vec_t::width; ++i)
410 BOOST_CHECK_EQUAL(avec[i], ascalararr[aindex[i]]);
488 vec_t res = avec1 + avec2;
489 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
491 res.store(ascalararr.data());
493 for (
size_t i = 0; i < vec_t::width; ++i)
495 BOOST_CHECK_EQUAL(ascalararr[i], val1 + val2);
505 vec_t res = avec1 - avec2;
506 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
508 res.store(ascalararr.data());
510 for (
size_t i = 0; i < vec_t::width; ++i)
512 BOOST_CHECK_EQUAL(ascalararr[i], val1 - val2);
522 vec_t res = avec1 * avec2;
523 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
525 res.store(ascalararr.data());
527 for (
size_t i = 0; i < vec_t::width; ++i)
529 BOOST_CHECK_EQUAL(ascalararr[i], val1 * val2);
539 vec_t res = avec1 / avec2;
540 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
542 res.store(ascalararr.data());
544 for (
size_t i = 0; i < vec_t::width; ++i)
546 BOOST_CHECK_EQUAL(ascalararr[i], val1 / val2);
558 vec_t res = avec1 + avec2 * avec3;
559 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
561 res.store(ascalararr.data());
563 for (
size_t i = 0; i < vec_t::width; ++i)
565 BOOST_CHECK_EQUAL(ascalararr[i], val1 + val2 + val3);
577 avec1.fma(avec2, avec3);
578 alignas(vec_t::alignment) std::array<float, vec_t::width> ascalararr{
580 avec1.store(ascalararr.data());
582 for (
size_t i = 0; i < vec_t::width; ++i)
584 BOOST_CHECK_EQUAL(ascalararr[i], val1 + val2 * val3);
642 alignas(vec_t::alignment) std::array<std::uint32_t, vec_t::width>
644 amask.store(ascalararr.data());
645 for (
size_t i = 0; i < vec_t::width; ++i)
648 BOOST_CHECK_EQUAL(ascalararr[i], (std::uint32_t)mask_t::false_v);
656 amask.store(ascalararr.data());
657 for (
size_t i = 0; i < vec_t::width; ++i)
660 BOOST_CHECK_EQUAL(ascalararr[i], (std::uint32_t)mask_t::true_v);
668 amask.store(ascalararr.data());
669 for (
size_t i = 0; i < vec_t::width; ++i)
672 BOOST_CHECK_EQUAL(ascalararr[i], (std::uint32_t)mask_t::false_v);
675 if (vec_t::width == 4)
677 alignas(vec_t::alignment) std::array<float, 4> ascalararr2{
678 {1.0, 2.0, 3.0, 4.0}};
682 evec.load(ascalararr2.data());
686 for (
size_t i = 0; i < vec_t::width; ++i)
688 BOOST_CHECK_EQUAL(
static_cast<bool>(amask[i]), dvec[i] > evec[i]);
692 if (vec_t::width == 8)
694 alignas(vec_t::alignment) std::array<float, 8> ascalararr2{
695 {1.0, 2.0, 3.0, 4.0, 3.0, 2.0,
700 evec.load(ascalararr2.data());
704 for (
size_t i = 0; i < vec_t::width; ++i)
706 BOOST_CHECK_EQUAL(
static_cast<bool>(amask[i]),
707 dval > ascalararr2[i]);
719 alignas(vec_t::alignment) std::array<std::uint32_t, vec_t::width>
721 for (
size_t i = 0; i < vec_t::width; ++i)
723 ascalararr[i] = mask_t::true_v;
725 amask.load(ascalararr.data());
728 BOOST_CHECK_EQUAL(amask &&
false,
false);
729 BOOST_CHECK_EQUAL(amask &&
true,
true);
731 for (
size_t i = 0; i < vec_t::width; ++i)
733 ascalararr[i] = mask_t::false_v;
735 amask.load(ascalararr.data());
738 BOOST_CHECK_EQUAL(amask &&
false,
false);
739 BOOST_CHECK_EQUAL(amask &&
true,
false);
741 if (vec_t::width > 1)
743 ascalararr[0] = mask_t::true_v;
745 BOOST_CHECK_EQUAL(amask &&
false,
false);
746 BOOST_CHECK_EQUAL(amask &&
true,
false);
752 constexpr size_t nDof{5};
754 constexpr size_t nEle{vec_t::width * 5};
755 constexpr size_t nDofBlock = nDof * vec_t::width;
757 constexpr size_t size{nDof * nEle};
758 std::array<float, size> dofScalarArr{{}};
759 for (
size_t i = 0; i < size; ++i)
765 size_t nBlock = nEle / vec_t::width;
768 std::vector<vec_t, allocator<vec_t>> dofVectorArr(nDof);
770 float *dataPtr = dofScalarArr.data();
772 for (
size_t b = 0; b < nBlock; ++b)
778 for (
size_t j = 0; j < nDof; ++j)
780 dofVectorArr[j] = dofVectorArr[j] + j;
785 dataPtr += nDofBlock;
789 for (
size_t b = 0, i = 0; b < nBlock; ++b)
791 for (
size_t j = 0; j < nDof; ++j, ++i)
793 BOOST_CHECK_EQUAL(dofScalarArr[i], i + j);