xtensor icon indicating copy to clipboard operation
xtensor copied to clipboard

arm64 (neon64) bool: usage of batch type with unsupported type

Open drew-parsons opened this issue 2 years ago • 2 comments

xsimd 10.0.0 exposed an error from xtensor (0.24.7) on arm64 architecture (neon64). The error was reported at https://github.com/xtensor-stack/xsimd/issues/945 :

127s [ 26%] Building CXX object CMakeFiles/test_xtensor_lib.dir/test_xoptional_assembly.cpp.o
127s /usr/bin/g++ -DXSIMD_ENABLE_XTL_COMPLEX -DXTENSOR_USE_XSIMD  -DXSIMD_ENABLE_XTL_COMPLEX=1 -march=native -std=c++14 -Wunused-parameter -Wextra -Wreorder -Wconversion -Wno-sign-conversion  -Wold-style-cast -Wunused-variable -ftemplate-backtrace-limit=0 -O3 -DNDEBUG -MD -MT CMakeFiles/test_xtensor_lib.dir/test_xoptional_assembly.cpp.o -MF CMakeFiles/test_xtensor_lib.dir/test_xoptional_assembly.cpp.o.d -o CMakeFiles/test_xtensor_lib.dir/test_xoptional_assembly.cpp.o -c /tmp/autopkgtest-lxc.1p570fd4/downtmp/autopkgtest_tmp/test_xoptional_assembly.cpp
131s In file included from /usr/include/xsimd/types/xsimd_batch.hpp:493,
131s                  from /usr/include/xsimd/xsimd.hpp:61,
131s                  from /usr/include/xtensor/xtensor_config.hpp:61,
131s                  from /usr/include/xtensor/xexception.hpp:24,
131s                  from /usr/include/xtensor/xstorage.hpp:21,
131s                  from /usr/include/xtensor/xbuffer_adaptor.hpp:21,
131s                  from /usr/include/xtensor/xarray.hpp:19,
131s                  from /tmp/autopkgtest-lxc.1p570fd4/downtmp/autopkgtest_tmp/test_xoperation.cpp:13:
131s /usr/include/xsimd/types/xsimd_traits.hpp: In instantiation of ‘struct xsimd::detail::static_check_supported_config_emitter<bool, xsimd::neon64>’:
131s /usr/include/xsimd/types/xsimd_traits.hpp:84:19:   required from ‘void xsimd::detail::static_check_supported_config() [with T = bool; A = xsimd::neon64]’
131s /usr/include/xsimd/types/xsimd_api.hpp:437:55:   required from ‘xsimd::simd_return_type<From, To, A> xsimd::broadcast_as(From) [with To = int; A = neon64; From = bool; simd_return_type<From, To, A> = batch_bool<int, neon64>]’
131s /usr/include/xtensor/xscalar.hpp:952:53:   required from ‘xt_simd::simd_return_type<typename xt::xcontainer_inner_types<xt::xscalar<CT> >::value_type, requested_type> xt::xscalar<CT>::load_simd(size_type) const [with align = xt::inner_aligned_mode; requested_type = int; long unsigned int N = 4; CT = bool; xt_simd::simd_return_type<typename xt::xcontainer_inner_types<xt::xscalar<CT> >::value_type, requested_type> = xsimd::batch_bool<int, xsimd::neon64>; typename xt::xcontainer_inner_types<xt::xscalar<CT> >::value_type = bool; size_type = long unsigned int]’
...
131s /usr/include/xtensor/xarray.hpp:510:30:   required from ‘xt::xarray_container<EC, L, SC, Tag>::xarray_container(const xt::xexpression<E>&) [with E = xt::xfunction<xt::detail::logical_and, const xt::xarray_container<xt::uvector<bool, xsimd::aligned_allocator<bool, 16> >, xt::layout_type::row_major, xt::svector<long unsigned int, 4, std::allocator<long unsigned int>, true>, xt::xtensor_expression_tag>&, xt::xscalar<bool> >; EC = xt::uvector<bool, xsimd::aligned_allocator<bool, 16> >; xt::layout_type L = xt::layout_type::row_major; SC = xt::svector<long unsigned int, 4, std::allocator<long unsigned int>, true>; Tag = xt::xtensor_expression_tag]’
131s /tmp/autopkgtest-lxc.1p570fd4/downtmp/autopkgtest_tmp/test_xoperation.cpp:378:28:   required from ‘void xt::DOCTEST_ANON_SUITE_131::DOCTEST_ANON_TMP_150() [with TypeParam = xt::xarray_container<xt::uvector<double, xsimd::aligned_allocator<double, 16> >, xt::layout_type::row_major, xt::svector<long unsigned int, 4, std::allocator<long unsigned int>, true>, xt::xtensor_expression_tag>]’
131s /tmp/autopkgtest-lxc.1p570fd4/downtmp/autopkgtest_tmp/test_xoperation.cpp:372:9:   required from ‘xt::DOCTEST_ANON_SUITE_131::{anonymous}::DOCTEST_ANON_TMP_150ITERATOR<std::tuple<_El0, _El ...> >::DOCTEST_ANON_TMP_150ITERATOR(const char*, unsigned int, int) [with Type = xt::xarray_container<xt::uvector<double, xsimd::aligned_allocator<double, 16> >, xt::layout_type::row_major, xt::svector<long unsigned int, 4, std::allocator<long unsigned int>, true>, xt::xtensor_expression_tag>; Rest = {xt::xtensor_container<xt::uvector<double, xsimd::aligned_allocator<double, 16> >, 2, xt::layout_type::row_major, xt::xtensor_expression_tag>}]’
131s /tmp/autopkgtest-lxc.1p570fd4/downtmp/autopkgtest_tmp/test_xoperation.cpp:372:9:   required from here
131s /usr/include/xsimd/types/xsimd_traits.hpp:64:43: error: static assertion failed: usage of batch type with unsupported type
131s    64 |             static_assert(!A::supported() || xsimd::has_simd_register<T, A>::value,
131s       |                           ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
131s /usr/include/xsimd/types/xsimd_traits.hpp:64:43: note: ‘((! xsimd::neon64::supported()) || ((bool)std::integral_constant<bool, false>::value))’ evaluates to false

Apparently neon64 does not support batch bool (https://github.com/xtensor-stack/xsimd/blob/10.0.0/include/xsimd/types/xsimd_neon64_register.hpp)

A minimal code reproducing the error with xtensor alone (on raspberry pi) was identified as

#include <xtensor/xtensor.hpp>

int main()
{
    {
        xt::xtensor<double, 1> a{0., 1.};
        xt::xtensor<double, 1> b = a && 0.;
    }

    {
        xt::xtensor<bool, 1> a{false, true};
        //xt::xtensor<bool, 1> b = a && false;
    }

    return 0;
}

drew-parsons avatar Oct 03 '23 17:10 drew-parsons

armhf is also affected, apparently the same problem from neon, https://ci.debian.net/data/autopkgtest/unstable/armhf/x/xtensor/38875115/log.gz

drew-parsons avatar Oct 11 '23 09:10 drew-parsons