With QAST and PIRT merged, I can build Rakudo on a Raspberry Pi in about 12 hours, albeit with a lot of swapping (to a real disk) This was NQP at 6bd8bc5eb0f7cd29, Rakudo at c1bfbbb233c86036.
On Thu, Jun 28, 2012 at 09:49:32PM +0100, Nicholas Clark wrote: Still need this: > 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 { Still see this, and I really don't have time to dig into it: > 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) Still need this: > 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 So those were the times a month ago. Following Jonathan's excellent work on QAST and PIRT, the numbers now are: The following step can take a long time, please be patient. ./perl6 --setting=NULL --optimize=3 --target=pir --stagestats --output=src/gen/C ORE.setting.pir src/gen/CORE.setting Stage start : 0.000 Stage parse : 5220.855 Stage syntaxcheck: 0.048 Stage past : 0.015 Stage optimize : 14076.714 Stage post : 11584.416 Stage pir : 1077.496 The relative time breakdown is interesting. Here's the output on an 8Gb FreeBSD machine, which (probably) isn't swapping: Stage start : 0.000 Stage parse : 258.672 Stage syntaxcheck: 0.000 Stage past : 0.000 Stage optimize : 10.648 Stage post : 88.219 Stage pir : 20.760 Note how "parse" is roughly twice the time of everything else. Whereas on the Raspberry Pi, "otimize" is almost 3 times as bad as "parse", "post" twice as bad, and even "pir" is 20% of it. I observed that vmstat was showing only about 80% of time consumed by swapping at the end of "parse", whereas as soon as "optimize" started it was 99% swap hell. Jonathan commented on IRC that this will be because the optimiser is running all over the parse tree in memory. I didn't log enough to get the stat reliably, but maximum swap usage I could spot in screen's scrollback of vmstat was 314792K, which seems plausible. [Oh, "bug" report - the formatting assumes that no stage takes more than 999 seconds. That's two orders of magnitude optimistic :-)] make test looks like this: /usr/bin/perl t/harness t/00-parrot t/01-sanity t/00-parrot/02-op-math.t ........... ok t/00-parrot/03-op-logic.t .......... ok t/00-parrot/01-literals.t .......... ok t/00-parrot/04-op-cmp.t ............ ok t/00-parrot/05-var.t ............... ok t/00-parrot/06-op-inplace.t ........ No subtests run t/00-parrot/08-var-array.t ......... ok t/00-parrot/07-op-string.t ......... ok t/00-parrot/09-pir.t ............... ok t/01-sanity/01-tap.t ............... ok t/01-sanity/02-counter.t ........... ok t/00-parrot/10-regex.t ............. ok t/01-sanity/03-equal.t ............. ok t/01-sanity/05-sub.t ............... ok t/01-sanity/04-if.t ................ ok t/01-sanity/06-eqv.t ............... ok t/01-sanity/08-simple-multisubs.t .. ok t/01-sanity/07-isa.t ............... ok t/01-sanity/09-end-blocks.t ........ ok t/01-sanity/11-defined.t ........... ok t/01-sanity/10-say.t ............... ok t/01-sanity/12-try.t ............... ok t/01-sanity/99-test-basic.t ........ ok Test Summary Report ------------------- t/00-parrot/06-op-inplace.t (Wstat: 11 Tests: 0 Failed: 0) Non-zero wait status: 11 Parse errors: No plan found in TAP output Files=23, Tests=241, 745 wallclock secs ( 2.37 usr 0.13 sys + 728.93 cusr 10.85 csys = 742.28 CPU) Result: FAIL I re-ran ./perl6 t/00-parrot/06-op-inplace.t and it passed. I ran it a few more times and it passed. Then it SEGVd. I captured coredumps. backtraces attached. The problem is always here: Program terminated with signal 11, Segmentation fault. #0 0x419f1150 in Rakudo_md_ct_dispatch (interp=0x67a, dispatcher=<optimized out>, capture=<optimized out>, result=0x2c57d88) at multidispatch.c:1007 1007 !STABLE(param)->type_check(interp, param, type_obj)) { (gdb) p param $1 = (PMC * const) 0x2c200a8 (gdb) p *param $2 = {flags = 43879896, vtable = 0x0, data = 0x4, _metadata = 0x0} (gdb) p param $1 = (PMC * const) 0x23340a8 (gdb) p *param $2 = {flags = 34524632, vtable = 0x0, data = 0x4, _metadata = 0x0} (gdb) p param $1 = (PMC * const) 0x1acd0a8 (gdb) p *param $2 = {flags = 25714136, vtable = 0x0, data = 0x4, _metadata = 0x0} (gdb) printf "%x\n", param->flags 1885dd8 but as you can see, the addresses vary. I assume that there's Address Space Layout Randomization here, and that it's tickling a GC bug. This also might explain why earlier some things SEGVd but then didn't when re-run. (This stuff is hard - Perl 5 has had assertion failures during destruction exposed due to subtle changes in "random" ordering) /usr/bin/time --verbose on Linux seems to give some plausible numbers. In case they are useful, here they are: Command being timed: "perl Configure.pl --gen-parrot=RELEASE_4_6_0 --gen-nqp" User time (seconds): 9509.43 System time (seconds): 157.23 Percent of CPU this job got: 94% Elapsed (wall clock) time (h:mm:ss or m:ss): 2:50:37 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 123484 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 259 Minor (reclaiming a frame) page faults: 4339170 Voluntary context switches: 22500 Involuntary context switches: 250309 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 Command being timed: "make all" User time (seconds): 9876.71 System time (seconds): 3285.74 Percent of CPU this job got: 36% Elapsed (wall clock) time (h:mm:ss or m:ss): 10:04:34 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 200408 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 1415979 Minor (reclaiming a frame) page faults: 34761380 Voluntary context switches: 1443684 Involuntary context switches: 5413424 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 Command being timed: "make test" User time (seconds): 736.84 System time (seconds): 11.34 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 12:30.80 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 58036 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 48 Minor (reclaiming a frame) page faults: 390696 Voluntary context switches: 1392 Involuntary context switches: 78429 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 Oooh, bug? make test exits with zero even when tests fail. So, be careful what you wish for: > 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. Thanks Jonathan and everyone else. QAST and PIRT make a massive difference. And I think that this demonstrates that it's just about possible to build Rakudo on pretty much anything, if you're got some swap and you lack the virtue of impatience. :-) Nicholas Clark
(gdb) p param $1 = (PMC * const) 0x2c200a8 (gdb) p *param $2 = {flags = 43879896, vtable = 0x0, data = 0x4, _metadata = 0x0} (gdb) where #0 0x419f1150 in Rakudo_md_ct_dispatch (interp=0x67a, dispatcher=<optimized out>, capture=<optimized out>, result=0x2c57d88) at multidispatch.c:1007 #1 0x419e49e0 in Parrot_perl6_multi_dispatch_ct_p_p_p_p ( cur_opcode=0x217ea64, interp=0x18ea028) at perl6_ops.c:5915 #2 0x40323f64 in runops_fast_core (interp=0x18ea028, runcore_unused=<optimized out>, pc=<optimized out>) at src/runcore/cores.c:499 #3 0x40323bf8 in runops_int (interp=0x18ea028, offset=<optimized out>) at src/runcore/main.c:220 #4 0x4030af30 in runops (interp=0x18ea028, offs=1) at src/call/ops.c:126 #5 0x4030680c in Parrot_pcc_invoke_from_sig_object (interp=0x18ea028, sub_obj=<optimized out>, call_object=<optimized out>) at src/call/pcc.c:338 #6 0x402fa3ac in Parrot_ext_call (interp=0x18ea028, sub_pmc=0x1cf374c, signature=0x404061a4 "P->") at src/extend.c:158 #7 0x403d7e50 in Parrot_Task_invoke (interp=0x18ea028, _self=0x18ea028, next=0x404239f4) at src/pmc/task.c:166 #8 0x403067cc in Parrot_pcc_invoke_from_sig_object (interp=0x18ea028, sub_obj=0x1cf3940, call_object=0x1cf3738) at src/call/pcc.c:330 #9 0x402fa3ac in Parrot_ext_call (interp=0x18ea028, sub_pmc=0x1cf3940, signature=0x4040bcf0 "->") at src/extend.c:158 #10 0x40327e54 in Parrot_cx_next_task (interp=0x18ea028, scheduler=<optimized out>) at src/scheduler.c:218 #11 0x40328568 in Parrot_cx_outer_runloop (interp=0x18ea028) at src/scheduler.c:147 #12 0x403285e8 in Parrot_cx_begin_execution (interp=0x18ea028, main=0x198cf30, argv=0x197ecfc) at src/scheduler.c:111 #13 0x40330264 in Parrot_pf_execute_bytecode_program (interp=0x18ea028, pbc=<optimized out>, args=0x197ecfc) at src/packfile/api.c:2713 #14 0x402f6754 in Parrot_api_run_bytecode (interp_pmc=0x1978120, pbc=0x404239f4, args=0x1978120) at src/embed/bytecode.c:161 #15 0x00008fa0 in main (argc=2, argv=0xbef22214) at perl6.c:614
(gdb) p param $1 = (PMC * const) 0x23340a8 (gdb) p *param $2 = {flags = 34524632, vtable = 0x0, data = 0x4, _metadata = 0x0} (gdb) where #0 0x419d4150 in Rakudo_md_ct_dispatch (interp=0x67a, dispatcher=<optimized out>, capture=<optimized out>, result=0x236bd88) at multidispatch.c:1007 #1 0x419c79e0 in Parrot_perl6_multi_dispatch_ct_p_p_p_p ( cur_opcode=0x1892a64, interp=0xffe028) at perl6_ops.c:5915 #2 0x401fef64 in runops_fast_core (interp=0xffe028, runcore_unused=<optimized out>, pc=<optimized out>) at src/runcore/cores.c:499 #3 0x401febf8 in runops_int (interp=0xffe028, offset=<optimized out>) at src/runcore/main.c:220 #4 0x401e5f30 in runops (interp=0xffe028, offs=1) at src/call/ops.c:126 #5 0x401e180c in Parrot_pcc_invoke_from_sig_object (interp=0xffe028, sub_obj=<optimized out>, call_object=<optimized out>) at src/call/pcc.c:338 #6 0x401d53ac in Parrot_ext_call (interp=0xffe028, sub_pmc=0x140774c, signature=0x402e11a4 "P->") at src/extend.c:158 #7 0x402b2e50 in Parrot_Task_invoke (interp=0xffe028, _self=0xffe028, next=0x402fe9f4) at src/pmc/task.c:166 #8 0x401e17cc in Parrot_pcc_invoke_from_sig_object (interp=0xffe028, sub_obj=0x1407940, call_object=0x1407738) at src/call/pcc.c:330 #9 0x401d53ac in Parrot_ext_call (interp=0xffe028, sub_pmc=0x1407940, signature=0x402e6cf0 "->") at src/extend.c:158 #10 0x40202e54 in Parrot_cx_next_task (interp=0xffe028, scheduler=<optimized out>) at src/scheduler.c:218 #11 0x40203568 in Parrot_cx_outer_runloop (interp=0xffe028) at src/scheduler.c:147 #12 0x402035e8 in Parrot_cx_begin_execution (interp=0xffe028, main=0x10a0f30, argv=0x1092cfc) at src/scheduler.c:111 #13 0x4020b264 in Parrot_pf_execute_bytecode_program (interp=0xffe028, pbc=<optimized out>, args=0x1092cfc) at src/packfile/api.c:2713 #14 0x401d1754 in Parrot_api_run_bytecode (interp_pmc=0x108c120, pbc=0x402fe9f4, args=0x108c120) at src/embed/bytecode.c:161 #15 0x00008fa0 in main (argc=2, argv=0xbef86214) at perl6.c:614
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 2 259976 11852 44 2540 1671 31 2048 31 9114 1854 3 18 0 79 1 0 260128 13052 44 1512 998 102 1339 102 8795 1242 35 13 0 53 1 1 260744 11372 44 868 457 139 1989 139 9016 916 60 12 0 28 1 1 262184 11792 44 876 435 546 4989 546 10440 1799 44 17 0 39 0 3 262184 11612 44 948 408 477 4412 477 10380 1623 42 18 0 41 0 1 262176 17792 44 1472 435 472 3669 472 9940 1591 40 18 0 41 1 0 262068 13112 44 2576 540 0 638 0 8461 641 65 8 0 27 1 0 262184 12032 44 1088 970 97 1396 97 8802 1228 41 13 0 46 1 0 262180 14852 44 2724 1015 340 1906 340 9221 1825 10 16 0 75 0 1 262092 12152 44 1288 670 0 762 0 8488 793 57 9 0 33 1 1 262180 11612 44 868 458 173 2557 173 9221 1015 50 11 0 39 1 0 262172 30572 44 1476 502 608 2108 608 9348 1727 45 17 0 37 1 1 262104 24872 44 2652 747 0 856 0 8537 799 58 7 0 35 1 0 261896 20672 44 2652 693 0 693 0 8452 790 56 10 0 33 1 1 261564 15572 44 2652 906 0 906 0 8535 997 47 9 0 44 1 0 261092 14312 44 2652 926 0 926 0 8558 1066 36 13 0 51 0 1 261044 10472 44 2652 601 0 601 0 8397 669 66 6 0 28 0 1 262180 28352 44 1712 398 362 958 362 8792 1182 43 13 0 44 0 1 262160 23072 44 2528 741 0 810 0 8508 844 55 8 0 37 1 0 262064 19172 44 2528 566 0 566 0 8389 656 63 9 0 28 1 0 262184 11296 44 1024 1988 148 2536 148 9200 2211 20 16 0 64 2 2 262184 9228 44 1832 674 718 1756 718 9463 1838 21 24 0 55 2 1 262176 8332 44 3012 462 1577 584 1577 9906 3083 4 31 0 65 0 2 262220 8152 44 1744 1277 898 1780 898 10238 2321 3 28 0 70 3 1 262184 9180 44 1848 882 746 1282 746 9292 2110 2 24 0 74 1 2 263272 9268 44 1532 929 1437 1304 1437 10086 2494 1 28 0 72 0 2 266124 9636 44 1472 1524 1845 2070 1845 10411 3020 1 33 0 65 3 0 267232 8256 44 1496 1380 604 1750 604 9309 1874 0 24 0 76 0 1 269428 13836 44 1408 946 566 1299 566 9086 1914 3 20 0 77 0 1 282516 11948 44 684 1210 3069 2023 3069 10138 2561 6 34 0 60 1 1 314792 23380 60 13092 818 6723 2264 9002 14870 3280 5 42 0 54 1 0 9164 186716 152 19796 979 0 2260 0 9014 1117 31 18 0 50 1 0 9164 186732 152 19796 0 0 0 0 8132 31 100 0 0 0 1 0 9164 185660 152 19796 0 0 0 0 8132 31 100 0 0 0 1 0 9164 177080 152 20060 0 0 53 0 8147 34 99 1 0 0 2 0 9136 170240 152 20156 9 0 28 0 8143 54 99 1 0 0 1 0 9136 165140 152 20156 0 0 0 0 8132 31 99 1 0 0 1 0 9136 160760 152 20156 0 0 0 6 8076 33 99 1 0 0 1 0 9136 156800 152 20156 0 0 0 0 8099 32 99 1 0 0 1 0 9136 152780 152 20156 0 0 0 0 8132 30 100 0 0 0 1 0 9136 149060 152 20156 0 0 0 0 8132 31 99 1 0 0 1 0 9136 145760 152 20156 0 0 0 0 8132 30 100 0 0 0 1 0 9136 142640 152 20156 0 0 0 0 8132 30 99 1 0 0 1 0 9136 139640 152 20156 0 0 0 0 8131 31 99 1 0 0 1 0 9136 137120 152 20156 0 0 0 0 8132 30 100 0 0 0 1 0 9136 134120 152 20156 0 0 0 0 8132 31 100 0 0 0 1 0 9136 131540 152 20156 0 0 0 0 8132 31 99 1 0 0 1 0 9136 127460 152 20156 0 0 0 0 8132 30 99 1 0 0 1 0 9136 122480 152 20156 0 0 0 0 8132 30 99 1 0 0 1 0 9136 122120 152 20156 0 0 0 0 8131 30 100 0 0 0 1 0 9136 121820 152 20156 0 0 0 0 8132 30 100 0 0 0 1 0 9136 121580 152 20156 0 0 0 0 8132 31 99 1 0 0 1 0 9136 121400 152 20156 0 0 0 0 8132 31 100 0 0 0 1 0 9136 121220 152 20156 0 0 0 0 8132 30 100 0 0 0 1 0 9104 117920 292 22980 30 0 622 0 8254 143 98 2 0 0 1 0 9104 117860 300 22980 0 0 0 3 8093 35 100 0 0 0 1 0 9104 117740 300 22980 0 0 0 0 8132 31 100 0 0 0 1 0 9104 117620 300 22980 0 0 0 0 8132 30 100 0 0 0 1 0 9104 117500 300 22980 0 0 0 0 8132 31 100 0 0 0