The Raspberry Pi has a 700MHz ARM11-based CPU, 256Mb of RAM (of which at least
32Mb is used by the GPU), and uses an SD card for the filesystem. This is how
it's $35 (+ tax and shipping)

It will build Perl 5 in 2 hours, and takes a further 4 hours to run the tests.
(all pass)


So, I attempted to build Rakudo on my Raspberry Pi, expecting it to go wrong.
It didn't quite pan out the way I expected.


Parrot built just fine. Immediately things went wrong with NQP:

Finished install_dev_files.pl
Parrot installed.
Building NQP ...
/usr/bin/perl Configure.pl 
--with-parrot=/home/nick/Perl/rakudo/install/bin/parrot --make-install
Verifying installation ...
Using /home/nick/Perl/rakudo/install/bin/parrot (version RELEASE_4_5_0).
* configure package dyncall
guess operating system linux
guess arch
error: unsupported architecture armv6l
Command failed (status 256): cd 3rdparty/dyncall && sh configure
Command failed (status 256): /usr/bin/perl Configure.pl 
--with-parrot=/home/nick/Perl/rakudo/install/bin/parrot --make-install

real    75m55.607s
user    63m12.770s
sys     3m1.640s


It seems that dyncall doesn't recognise arm6el as a class of ARM architecture
which it supports. Given that it supports iOS, and has a configure option for
ARM, it seems pretty clear that it does, so I bodged it this this:

nick@raspberrypi ~/Perl/rakudo/nqp $ git diff
diff --git a/Configure.pl b/Configure.pl
index 5539471..f1a1c00 100644
--- a/Configure.pl
+++ b/Configure.pl
@@ -125,7 +125,7 @@ MAIN: {
             system_or_die('cd 3rdparty\dyncall && Configure.bat' . $configure_a
             $config{'dyncall_build'} = "cd 3rdparty/dyncall && $make BUILD_DIR=
         } else {
-            system_or_die('cd 3rdparty/dyncall && sh configure');
+            system_or_die('cd 3rdparty/dyncall && sh configure --target-arm-arm
             if ($^O eq 'netbsd') {
                 $config{'dyncall_build'} = "cd 3rdparty/dyncall && BUILD_DIR=. 
             } else {


With that, NQP has been builds and installs, given time:

real    90m49.874s
user    87m53.620s
sys     0m40.190s


However, the Rakudo build then fails with a SEGV on

/home/nick/Perl/rakudo/install/bin/nqp --vmlibs=perl6_group,perl6_ops  
--target=pir --output=src/gen/perl6-actions.pir --encoding=utf8 
src/Perl6/Actions.pm


So I tried it again under gdb it completes. Bah. No backtrace.

I then re-ran make and the very next command also SEGV'd:

nick@raspberrypi ~/Perl/rakudo $ time make
/home/nick/Perl/rakudo/install/bin/nqp --vmlibs=perl6_group,perl6_ops  
--target=pir --output=src/gen/perl6-actions.pir --encoding=utf8 \
            src/Perl6/Actions.pm
Segmentation fault
make: *** [blib/Perl6/Actions.pbc] Error 139

real    8m16.604s
user    8m13.570s
sys     0m1.050s


So I upped ulimit to get a core file, re-ran, and, bother, no error.

However, it does end up failing here:

The following step can take a long time, please be patient.
./perl6 --setting=NULL --optimize=3 --target=pir --stagestats 
--output=src/gen/CORE.setting.pir src/gen/CORE.setting
Killed
make: *** [CORE.setting.pbc] Error 137

real    107m48.770s
user    85m40.700s
sys     1m21.840s

(it ran out of RAM and swap. When I idle I see)

$ free
             total       used       free     shared    buffers     cached
Mem:        220616      24892     195724          0       5572       7080
-/+ buffers/cache:      12240     208376
Swap:       102396      11244      91152



So clearly 224Mb of RAM and 100Mb of swap aren't enough.


At this point I tested things that did build. Parrot passes all tests:

Test Summary Report
-------------------
t/dynpmc/select.t                         (Wstat: 0 Tests: 14 Failed: 0)
  TODO passed:   14
Files=395, Tests=13921, 3309 wallclock secs (63.36 usr  5.22 sys + 2580.54 cusr 
203.41 csys = 2852.53 CPU)
Result: PASS


NQP fails 1 test:

Test Summary Report
-------------------
t/nqp/60-bigint.t             (Wstat: 0 Tests: 34 Failed: 3)
  Failed tests:  28-29, 34
Files=64, Tests=584, 773 wallclock secs ( 5.03 usr  0.61 sys + 751.26 cusr 
11.36 csys = 768.26 CPU)
Result: FAIL
make: *** [core-test] Error 1

$ ./nqp t/nqp/60-bigint.t 
1..34
ok 1 - can round-trip negative number (string)
ok 2 - can round-trip negative number (string) by boxing
ok 3 - can round-trip negative number by unboxing
ok 4 - nqp::iseq_I can return false
ok 5 - nqp::iseq_I can return true
ok 6 - multiplication
ok 7 - addition
ok 8 - subtraction
ok 9 - division
ok 10 - bitshift left
ok 11 - original not modified by bitshift left
ok 12 - bitshift right
ok 13 - bit and
ok 14 - bit or
ok 15 - bit xor
ok 16 - bit negation
ok 17 - Bit ops (RT 109740)
ok 18 - can box to a complex type with a P6bigint target
ok 19 - can get a bigint from a string with boxing type
ok 20 - addition works on boxing type
ok 21 - pow (int, positive)
ok 22 - pow 0 ** large_number
ok 23 - pow 1 ** large_number
ok 24 - 2**100 to float
ok 25 - (-2)**101 to float
ok 26 - 123456789 * (-2)**101 to float
ok 27 - bigint -> float, 1e16
not ok 28 - to_num and from_num round-trip
not ok 29 - to_num and from_num round-trip (negative number)
ok 30 - base_I with base 10
ok 31 - base_I with base 16
ok 32 - nqp::expmod_I
ok 33 - div_In santiy
not ok 34 - div_In with big numbers



So, I commandeered a mobile phone charger to power an external USB hard drive,
and now with 512Mb of swap tried this:

$ /usr/bin/time -v ./perl6 --setting=NULL --optimize=3 --target=pir 
--stagestats --output=src/gen/CORE.setting.pir src/gen/CORE.setting; sleep 30; 
killall vmstat
Stage parse: 52535.669
Stage syntaxcheck: 0.387
Stage past: 0.221
Stage optimize: 9936.757

The machine crashed after about 22 hours at 100% CPU. Not sure if this is
because the outside temperature today is 28°C, and it felt unhappy.

This is rather annoying as I think we were about 50% through my estimate of
how long "Stage post" was going to take, with hopefully only 6 hours go go,
ie 28 hours of swap hell just for that command.


It would be wonderful if Rakudo's memory usage would drop. I think that that's
going to be easier than finding a faster swap device.

Nicholas Clark

Reply via email to