Skip to content

Segmentation fault in least_squares_solver from arraymancer #683

@dslate1

Description

@dslate1

Segmentation fault in least_squares_solver from arraymancer

Hi,

I'm running into a segmentation fault in least_squares_solver from arraymancer. I've created a small test program that demonstrates it:

import arraymancer, arraymancer/linear_algebra/least_squares, arraymancer/tensor/init_cpu, math,
  times, random, osproc
discard execCmd( "uname -a; echo; nim --version")
type F32 = float32
36290471.randomize
let nr = 1000
let nf = 170
var a = randomNormalTensor[ F32]( [nr, nf], 3.0, 2.0)
var b = randomNormalTensor[ F32]( nr, 3.0, 2.0)
echo "Before least_squares_solver ", getTime().utc
var x = least_squares_solver( a, b)
echo "After least_squares_solver ", getTime().utc

And here is the log from running it on my own computer:

Hint: used config file '/home/dave/lang/nim/nim-2.2.6/config/nim.cfg' [Conf]
Hint: used config file '/home/dave/lang/nim/nim-2.2.6/config/config.nims' [Conf]
..........................................................................
/home/dave/.nimble/pkgs2/nimblas-0.3.1-e1ecdea4bb8176f12d66efd4aa0c7b3bea970027/nimblas/private/common.nim(52, 7) Hint: Using BLAS library matching pattern: lib(blas|cblas|openblas).so(|.3|.2|.1|.0) [User]
...............................................................................................................................................................................................
/home/dave/.nimble/pkgs2/nimlapack-0.3.1-fcb25795c6fb43f9251b7f34c3ad84c39e645afd/nimlapack.nim(20, 7) Hint: Using LAPACK library matching pattern: liblapack.so(|.3|.2|.1|.0) [User]
.....................................................................
/home/dave/lang/nim/linbug.nim(11, 5) Hint: 'x' is declared but not used [XDeclaredButNotUsed]
Hint:  [Link]
Hint: mm: orc; threads: on; opt: speed; options: -d:release
116401 lines; 2.940s; 273.348MiB peakmem; proj: /home/dave/lang/nim/linbug.nim; out: /home/dave/lang/nim/linbug [SuccessX]
Linux hpz2ext 5.15.0-139-generic #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

Nim Compiler Version 2.2.6 [Linux: amd64]
Compiled at 2025-10-31
Copyright (c) 2006-2025 by Andreas Rumpf

git hash: ab00c56904e3126ad826bb520d243513a139436a
active boot switches: -d:release
Before least_squares_solver 2025-11-02T22:03:32Z
SIGSEGV: Illegal storage access. (Attempt to read from nil?)
Segmentation fault (core dumped)

Valgrind reports illegal memory accesses:

Hint: used config file '/home/dave/lang/nim/nim-2.2.6/config/nim.cfg' [Conf]
Hint: used config file '/home/dave/lang/nim/nim-2.2.6/config/config.nims' [Conf]
.........................................................................
/home/dave/.nimble/pkgs2/nimblas-0.3.1-e1ecdea4bb8176f12d66efd4aa0c7b3bea970027/nimblas/private/common.nim(52, 7) Hint: Using BLAS library matching pattern: lib(blas|cblas|openblas).so(|.3|.2|.1|.0) [User]
...............................................................................................................................................................................................
/home/dave/.nimble/pkgs2/nimlapack-0.3.1-fcb25795c6fb43f9251b7f34c3ad84c39e645afd/nimlapack.nim(20, 7) Hint: Using LAPACK library matching pattern: liblapack.so(|.3|.2|.1|.0) [User]
.....................................................................
/home/dave/lang/nim/linbug.nim(11, 5) Hint: 'x' is declared but not used [XDeclaredButNotUsed]
Hint:  [Link]
Hint: mm: orc; threads: on; opt: none (DEBUG BUILD, `-d:release` generates faster code)
114965 lines; 2.797s; 273.223MiB peakmem; proj: /home/dave/lang/nim/linbug.nim; out: /home/dave/lang/nim/linbug [SuccessX]
==8014== Memcheck, a memory error detector
==8014== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==8014== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==8014== Command: ./linbug blah gorp zoom
==8014== 
Linux hpz2ext 5.15.0-139-generic #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

Nim Compiler Version 2.2.6 [Linux: amd64]
Compiled at 2025-10-31
Copyright (c) 2006-2025 by Andreas Rumpf

git hash: ab00c56904e3126ad826bb520d243513a139436a
active boot switches: -d:release
Before least_squares_solver 2025-11-02T22:10:26Z
==8014== Invalid write of size 4
==8014==    at 0x53762E4: slamrg_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A3DE3: slasd7_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A385C: slasd6_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A59A9: slasda_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53755CD: slalsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x5314A83: sgelsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x19169A: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014==  Address 0x4d4c344 is 4 bytes after a block of size 11,568 alloc'd
==8014==    at 0x483B7F3: malloc (vg_replace_malloc.c:309)
==8014==    by 0x134B15: allocImpl__system_u1757 (in /home/dave/lang/nim/linbug)
==8014==    by 0x134B3B: allocSharedImpl (in /home/dave/lang/nim/linbug)
==8014==    by 0x13763A: alignedAlloc__system_u1914 (in /home/dave/lang/nim/linbug)
==8014==    by 0x13783A: newSeqPayloadUninit (in /home/dave/lang/nim/linbug)
==8014==    by 0x13DE31: newSeqUninit__linbug_u17579 (in /home/dave/lang/nim/linbug)
==8014==    by 0x191280: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014== 
==8014== Invalid write of size 4
==8014==    at 0x5376310: slamrg_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A3DE3: slasd7_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A385C: slasd6_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A59A9: slasda_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53755CD: slalsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x5314A83: sgelsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x19169A: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014==  Address 0x4d4c348 is 8 bytes after a block of size 11,568 alloc'd
==8014==    at 0x483B7F3: malloc (vg_replace_malloc.c:309)
==8014==    by 0x134B15: allocImpl__system_u1757 (in /home/dave/lang/nim/linbug)
==8014==    by 0x134B3B: allocSharedImpl (in /home/dave/lang/nim/linbug)
==8014==    by 0x13763A: alignedAlloc__system_u1914 (in /home/dave/lang/nim/linbug)
==8014==    by 0x13783A: newSeqPayloadUninit (in /home/dave/lang/nim/linbug)
==8014==    by 0x13DE31: newSeqUninit__linbug_u17579 (in /home/dave/lang/nim/linbug)
==8014==    by 0x191280: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014== 
==8014== Invalid read of size 4
==8014==    at 0x53A3E10: slasd7_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A385C: slasd6_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A59A9: slasda_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53755CD: slalsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x5314A83: sgelsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x19169A: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014==  Address 0x4d4c344 is 4 bytes after a block of size 11,568 alloc'd
==8014==    at 0x483B7F3: malloc (vg_replace_malloc.c:309)
==8014==    by 0x134B15: allocImpl__system_u1757 (in /home/dave/lang/nim/linbug)
==8014==    by 0x134B3B: allocSharedImpl (in /home/dave/lang/nim/linbug)
==8014==    by 0x13763A: alignedAlloc__system_u1914 (in /home/dave/lang/nim/linbug)
==8014==    by 0x13783A: newSeqPayloadUninit (in /home/dave/lang/nim/linbug)
==8014==    by 0x13DE31: newSeqUninit__linbug_u17579 (in /home/dave/lang/nim/linbug)
==8014==    by 0x191280: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014== 
==8014== Invalid read of size 4
==8014==    at 0x53A4575: slasd7_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A385C: slasd6_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53A59A9: slasda_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x53755CD: slalsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x5314A83: sgelsd_ (in /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0)
==8014==    by 0x19169A: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014==  Address 0x4d4c344 is 4 bytes after a block of size 11,568 alloc'd
==8014==    at 0x483B7F3: malloc (vg_replace_malloc.c:309)
==8014==    by 0x134B15: allocImpl__system_u1757 (in /home/dave/lang/nim/linbug)
==8014==    by 0x134B3B: allocSharedImpl (in /home/dave/lang/nim/linbug)
==8014==    by 0x13763A: alignedAlloc__system_u1914 (in /home/dave/lang/nim/linbug)
==8014==    by 0x13783A: newSeqPayloadUninit (in /home/dave/lang/nim/linbug)
==8014==    by 0x13DE31: newSeqUninit__linbug_u17579 (in /home/dave/lang/nim/linbug)
==8014==    by 0x191280: gelsd__linbug_u164 (in /home/dave/lang/nim/linbug)
==8014==    by 0x193384: least_squares_solver__linbug_u144 (in /home/dave/lang/nim/linbug)
==8014==    by 0x1972D8: NimMainModule (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F6D: NimMainInner (in /home/dave/lang/nim/linbug)
==8014==    by 0x196F82: NimMain (in /home/dave/lang/nim/linbug)
==8014==    by 0x196FC0: main (in /home/dave/lang/nim/linbug)
==8014== 
After least_squares_solver 2025-11-02T22:10:31Z
==8014== 
==8014== HEAP SUMMARY:
==8014==     in use at exit: 24,794 bytes in 23 blocks
==8014==   total heap usage: 1,753 allocs, 1,730 frees, 1,625,006 bytes allocated
==8014== 
==8014== LEAK SUMMARY:
==8014==    definitely lost: 0 bytes in 0 blocks
==8014==    indirectly lost: 0 bytes in 0 blocks
==8014==      possibly lost: 0 bytes in 0 blocks
==8014==    still reachable: 24,794 bytes in 23 blocks
==8014==         suppressed: 0 bytes in 0 blocks
==8014== Rerun with --leak-check=full to see details of leaked memory
==8014== 
==8014== For lists of detected and suppressed errors, rerun with: -s
==8014== ERROR SUMMARY: 315 errors from 4 contexts (suppressed: 0 from 0)

On my own computer, the failure happens either in least_squares_solver or in the code that examines its output. Exactly where it occurs seems to depend on the random number seed. The errors also don't show up with values of nf (number of columns) less than around 104. The larger program in which least_squares_solver is called has run many times without segmentation faults, which only showed up when I added least_squares_solver.

Any ideas on what is going wrong or how to fix it?

Thanks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions