xtensor-stack / Xtensor.jl

Julia package for xtensor-julia
http://quantstack.net/xtensor
BSD 3-Clause "New" or "Revised" License
41 stars 6 forks source link

logsumexp test segfaults #51

Closed nbecker closed 6 years ago

nbecker commented 7 years ago

Trying conversion of logsumexp test from python to julia I did try changing the pass by const&'s to pass by value

https://gist.github.com/nbecker/af2011043a29e1635adfaad73c0e4e9e

signal (11): Segmentation fault
while loading /home/nbecker/xtensor-julia-test/test_logsumexp.jl, in expression starting on line 21
_ZN2xt6detail14excluding_copyIPKmS3_N9__gnu_cxx17__normal_iteratorIPmSt6vectorImSaImEEEEEEvT_SB_T0_SC_T1_SD_ at ./liblogsumexp.so (unknown line)
_ZN2xt8xreducerINS_6detail7maximumIdEERKNS_7jlarrayIdEERKNS_8jltensorImLm1EEEEC2IS3_RS5_RS9_EEOT_OT0_OT1_ at ./liblogsumexp.so (unknown line)
_ZN2xt6reduceINS_6detail7maximumIdEERNS_7jlarrayIdEERNS_8jltensorImLm1EEEEEDaOT_OT0_OT1_ at ./liblogsumexp.so (unknown line)
_ZN2xt4amaxIRNS_7jlarrayIdEERNS_8jltensorImLm1EEEEEDaOT_OT0_ at ./liblogsumexp.so (unknown line)
_Z10logsumexp2IN2xt7jlarrayIdEENS0_8jltensorImLm1EEEEDaT_T0_ at ./liblogsumexp.so (unknown line)
unknown function (ip: 0x7fefeadd9b2f)
unknown function (ip: 0x7fefeadda303)
_ZNKSt8functionIFN2xt7jlarrayIdEES2_NS0_8jltensorImLm1EEEEEclES2_S4_ at ./liblogsumexp.so (unknown line)
_ZN5jlcxx6detail17ReturnTypeAdapterIN2xt7jlarrayIdEEJS4_NS2_8jltensorImLm1EEEEEclEPKvP10jl_array_tSB_ at ./liblogsumexp.so (unknown line)
_ZN5jlcxx6detail11CallFunctorIN2xt7jlarrayIdEEJS4_NS2_8jltensorImLm1EEEEE5applyEPKvP10jl_array_tSB_ at ./liblogsumexp.so (unknown line)
logsumexp at ./<missing>:0
unknown function (ip: 0x7fefedb3fb06)
jl_apply_generic at /usr/bin/../lib64/libjulia.so.0.6 (unknown line)
...
nbecker commented 7 years ago

Here's what valgrind says:

==11586== Invalid write of size 8
==11586==    at 0x2BF64EA7: void xt::detail::excluding_copy<unsigned long const*, unsigned long const*, __gnu_cxx::__normal_iterator<unsigned long*, std::vector<unsigned long, std::allocator<unsigned long> > > >(unsigned long const*, unsigned long const*, unsigned long const*, unsigned long const*, __gnu_cxx::__normal_iterator<unsigned long*, std::vector<unsigned long, std::allocator<unsigned long> > >, __gnu_cxx::__normal_iterator<unsigned long*, std::vector<unsigned long, std::allocator<unsigned long> > >) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF6170A: xt::xreducer<xt::detail::maximum<double>, xt::jlarray<double> const&, xt::jltensor<unsigned long, 1ul> const&>::xreducer<xt::detail::maximum<double>, xt::jlarray<double>&, xt::jltensor<unsigned long, 1ul>&>(xt::detail::maximum<double>&&, xt::jlarray<double>&, xt::jltensor<unsigned long, 1ul>&) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF5E95C: auto xt::reduce<xt::detail::maximum<double>, xt::jlarray<double>&, xt::jltensor<unsigned long, 1ul>&>(xt::detail::maximum<double>&&, xt::jlarray<double>&, xt::jltensor<unsigned long, 1ul>&) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF5E9AF: auto xt::amax<xt::jlarray<double>&, xt::jltensor<unsigned long, 1ul>&>(xt::jlarray<double>&, xt::jltensor<unsigned long, 1ul>&) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF5F569: auto logsumexp2<xt::jlarray<double>, xt::jltensor<unsigned long, 1ul> >(xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF5CB5F: register_julia_modules::{lambda(xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>)#2}::operator()(xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>) const (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF5D333: std::_Function_handler<xt::jlarray<double> (xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>), register_julia_modules::{lambda(xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>)#2}>::_M_invoke(std::_Any_data const&, xt::jlarray<double>&&, xt::jltensor<unsigned long, 1ul>&&) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF7E963: std::function<xt::jlarray<double> (xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>)>::operator()(xt::jlarray<double>, xt::jltensor<unsigned long, 1ul>) const (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF7E60F: jlcxx::detail::ReturnTypeAdapter<xt::jlarray<double>, xt::jlarray<double>, xt::jltensor<unsigned long, 1ul> >::operator()(void const*, jl_array_t*, jl_array_t*) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x2BF7E249: jlcxx::detail::CallFunctor<xt::jlarray<double>, xt::jlarray<double>, xt::jltensor<unsigned long, 1ul> >::apply(void const*, jl_array_t*, jl_array_t*) (in /home/nbecker/xtensor-julia-test/liblogsumexp.so)
==11586==    by 0x1609A2CD: ???
==11586==    by 0x1609A326: ???
==11586==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==11586== 

signal (11): Segmentation fault
wolfv commented 6 years ago

@nbecker, I just run your original code.

In the test_logsumexp.jl you call the function y = logsumexpnb.logsumexp(u,Array{UInt64}([1])) with u instead of x. I.e. there is one dimension less than expected by the algorithm.

When calling with x it works for me.

We should probably throw an appropriate runtime error or a warning, though.

However, we also fixed some memory issues in the reducers with the latest release.

Cheers,

Wolf

Closing this issue, and opening the following: https://github.com/QuantStack/xtensor/issues/629