Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compilation errors on Raspberry Pi #287

Open
amahoneyLIT opened this issue Jun 7, 2019 · 8 comments
Open

compilation errors on Raspberry Pi #287

amahoneyLIT opened this issue Jun 7, 2019 · 8 comments

Comments

@amahoneyLIT
Copy link

I'm trying to use XTENSOR_USE_XSIMD in my project, which otherwise compiles and runs fine on a Raspberry Pi 3B+ with up to date Raspbian Stretch

Using

  • xtensor master
  • xtl 0.6.4
  • xsimd 7.2.3

The first error I get is

In file included from /usr/local/include/xsimd/types/xsimd_traits.hpp:15:0,
                 from /usr/local/include/xsimd/xsimd.hpp:14,
                 from /usr/local/include/xtensor/xtensor_config.hpp:64,
                 from /usr/local/include/xtensor/xlayout.hpp:15,
                 from /usr/local/include/xtensor/xshape.hpp:21,
                 from /usr/local/include/xtensor/xstrides.hpp:20,
                 from /usr/local/include/xtensor/xaccessible.hpp:13,
                 from /usr/local/include/xtensor/xview.hpp:24,
                 from ../src_daq/fft_functions.cpp:4:
/usr/local/include/xsimd/types/xsimd_types_include.hpp:74:4: warning: #warning "Please compile with SIMD instructions enabled or activate the fallback mode. (e.g. for x86 -march=native or for ARM -mfpu=neon)" [-Wcpp]
   #warning "Please compile with SIMD instructions enabled or activate the fallback mode. (e.g. for x86 -march=native or for ARM -mfpu=neon)"
    ^~~~~~~

which is strange because I've tried both -mfpu=neon and -mfpu=neon-vfpv4

Any ideas?

@wolfv
Copy link
Member

wolfv commented Jun 8, 2019

are you cross-compiling? If not, -march=native should probably also work.

@amahoneyLIT
Copy link
Author

amahoneyLIT commented Jun 10, 2019

I am getting the same error trying -march=native with and without -mfpu=neon

I am not cross-compiling. Compiling directly on the RPi. Using this same project on an arm64 dev kit with 64bit OS and compiler works. The RPi's Raspbian is 32bit

@amahoneyLIT
Copy link
Author

getting closer by using flags from https://gist.github.com/fm4dd/c663217935dc17f0fc73c9c81b0aa845

-mcpu=cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8 -mneon-for-64bits

and I get only 3 errors now

/usr/local/include/xtensor/xassign.hpp:539: error: invalid use of incomplete type ‘xt::xcontainer<xt::xarray_container<xt::uvector<long unsigned int, xsimd::aligned_allocator<long unsigned int, 16u> >, (xt::layout_type)1, xt::svector<unsigned int, 4u, std::allocator<unsigned int>, true>, xt::xtensor_expression_tag> >::simd_return_type<long unsigned int> {aka class xsimd::batch<long unsigned int, 4u>}’
             e1.template store_simd<lhs_align_mode>(i, e2.template load_simd<rhs_align_mode, value_type>(i));
             ^~

/usr/local/include/xtensor/xcontainer.hpp:714: error: return type ‘xt::xcontainer<xt::xarray_container<xt::uvector<long unsigned int, xsimd::aligned_allocator<long unsigned int, 16u> >, (xt::layout_type)1, xt::svector<unsigned int, 4u, std::allocator<unsigned int>, true>, xt::xtensor_expression_tag> >::simd_return_type<long unsigned int> {aka class xsimd::batch<long unsigned int, 4u>}’ is incomplete
     inline auto xcontainer<D>::load_simd(size_type i) const
                 ^~~~~~~~~~~~~

/usr/local/include/xtensor/xcontainer.hpp:718: error: invalid use of incomplete type ‘xsimd::simd_return_type<long unsigned int, long unsigned int, 4u> {aka class xsimd::batch<long unsigned int, 4u>}’
         return xt_simd::load_simd<value_type, requested_type>(&(storage()[i]), align_mode());
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

will poke at these flags some more

@wolfv
Copy link
Member

wolfv commented Jun 11, 2019

This might now be a problem from our side, if the type or type conversion is not correctly implemented...

Can you try with only integer for example?

@amahoneyLIT
Copy link
Author

amahoneyLIT commented Jun 11, 2019

Based on those errors sounding integer-ish, maybe you meant the opposite - I tried removing all the integer arrays from my code, including

  • xarray<unsigned long>
  • xarray<unsigned long long>
  • xarray<size_t>

and now it compiles.

@wolfv
Copy link
Member

wolfv commented Jun 12, 2019

hey, cool, that's good to hear.

we should keep this issue open to investigate in the future. it might be related to 64-bit integers and the NEON version.

@JohanMabille
Copy link
Member

JohanMabille commented Jun 12, 2019

Out of curiosity, since you're compiling on a 32bit system, can you print the results of the following:

#include <type_traits>
#include <cstdint>
#include <iostream>

int main(int argc, char* argv[])
{
    using std::uint32_t;
    using std::uint64_t;

    std::cout << "unsigned long == uint32_t? ";
    std::cout << std::is_same<unsigned long, uint32_t>::value << std::endl;

    std::cout << "unsigned long long == uint32_t? ";
    std::cout << std::is_same<unsigned long long, uint32_t>::value << std::end;

    std::cout << "size_t == uint32_t? ";
    std::cout << std::is_same<size_t, uint32_t>::value << std::endl;

    std::cout << "unsigned long == uint64_t? ";
    std::cout << std::is_same<unsigned long, uint64_t>::value << std::endl;

    std::cout << "unsigned long long == uint64_t? ";
    std::cout << std::is_same<unsigned long long, uint64_t>::value << std::endl;

    std::cout << "size_t == uint64_t? ";
    std::cout << std::is_same<size_t, uint64_t>::value << std::endl;

    return 0;
}

@amahoneyLIT
Copy link
Author

@JohanMabille the second check does not compile

/home/pi/dev/cpp-scratch/main.cpp:14: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>::__ostream_type {aka std::basic_ostream<char>}’ and ‘<unresolved overloaded function type>’)
     std::cout << std::is_same<unsigned long long, uint32_t>::value << std::end;
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~

commenting that out, the rest of the output is

unsigned long == uint32_t? 0
size_t == uint32_t? 1
unsigned long == uint64_t? 0
unsigned long long == uint64_t? 1
size_t == uint64_t? 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants