- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 95
 
Description
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.