Expand
[llpp.git] / misc / notes / pbuild.txt
blobeee97e475cfb7e19508b165909569793a44905f3
1 There is some unclaimed parallelism inside the build process:
3  a) all C compilation can be done in parallel
5  b) ditto all _independent_ OCaml compilation (i.e. things having the
6     same indentation (and growing from the same "root") in the
7     following build.bash output)
9 The "neat" solution of how to get there is elusive though. Currently:
11   - bash build.bash build
12     utils.ml -> utils.cmo
13     keys.ml -> keys.cmo
14    wsi.mli -> wsi.cmi
15    utf8syms.ml -> utf8syms.cmo
16    lablGL/raw.ml -> lablGL/raw.cmo
17        lablGL/gl.ml -> lablGL/gl.cmo
18       lablGL/glPix.ml -> lablGL/glPix.cmo
19       lablGL/glMisc.ml -> lablGL/glMisc.cmo
20      lablGL/glTex.ml -> lablGL/glTex.cmo
21      lablGL/glFunc.ml -> lablGL/glFunc.cmo
22       lablGL/glDraw.ml -> lablGL/glDraw.cmo
23      lablGL/glArray.ml -> lablGL/glArray.cmo
24        parser.ml -> parser.cmo
25        build/confstruct.ml -> confstruct.cmo
26       config.ml -> config.cmo
27      ffi.ml -> ffi.cmo
28     glutils.ml -> glutils.cmo
29     lablGL/glMat.ml -> lablGL/glMat.cmo
30    listview.ml -> listview.cmo
31    help.mli -> help.cmi
32    help.ml -> help.cmo
33    lablGL/glClear.ml -> lablGL/glClear.cmo
34   main.ml -> main.cmo
35   link.c -> link.o
36   cutils.c -> cutils.o
37   version.c -> version.o
38   lablGL/ml_gl.c -> lablGL/ml_gl.o
39   lablGL/ml_glarray.c -> lablGL/ml_glarray.o
40   lablGL/ml_raw.c -> lablGL/ml_raw.o
41   9 sec
43 IOW - whole build (including lablGL, but excluding mupdf/ocaml and its
44 dependencies) takes less than 10 seconds even on this circa 2014
45 MacMini.
47 Making things parallel ought to bring some benefits to the build on
48 the Raspberry Pi3 and it might even benefit single core PPC MacMini
49 due to interleaving IO/CPU bound parts (but this is just that -
50 baseless speculation)
52 =============================================================
54 With following applied, build.bash will produce a Makefile that builds
55 llpp. Building things via this Makefile (i.e. `\time -pv make -jN')
56 seems to suggest that there is some (a lot) parallelism that can be
57 harvested even for OCaml code (parallelism for interface deprived
58 OCaml code (as is the case with llpp) is limited)
60 diff --git a/build.bash b/build.bash
61 index e9a2919..37382df 100755
62 --- a/build.bash
63 +++ b/build.bash
64 @@ -1,6 +1,8 @@
65  #!/bin/bash
66  set -eu
68 +:>Makefile
70  now() { date +%s; }
71  S=$(now)
72  vecho() { ${vecho-:} "$*"; }
73 @@ -159,6 +161,7 @@ bocaml2() {
75      cmd="ocamlc $(oflags $o) -c -o $o $s"
76      keycmd="digest $o $s $(< $o.depl)"
77 +    printf "$o: $s $(< $o.depl)\n\t$cmd\n" >>Makefile
78      isfresh "$o" "$overs$cmd$(eval $keycmd)" || {
79          printf "%*.s%s -> %s\n" $n '' "${s#$srcd/}" "${o#$outd/}"
80          eval "$cmd || die '$cmd failed'"
81 @@ -191,6 +194,7 @@ bocaml() (
82          *) false;;
83      esac && {
84          local s1=${s#$srcd/}
85 +        echo "$outd/${s1%.ml}.cmo: $o" >>Makefile
86          bocaml1 $n "$s" "$outd/${s1%.ml}.cmo" "${o#$outd/}"
87      } || true
88      cycle=$cycle1
89 @@ -203,6 +207,7 @@ bocamlc() {
90      local cmd="ocamlc $cc-ccopt \"$(cflags $o) -MMD -MF $o.dep -MT_ -o $o\" $s"
91      test -r $o.dep && read _ d <$o.dep || d=
92      local keycmd='digest $o $d'
93 +    printf "$o: $s $d\n\t$cmd\n" >>Makefile
94      isfresh "$o" "$cmd$(eval $keycmd)" || {
95          printf "%s -> %s\n" "${s#$srcd/}" "${o#$outd/}"
96          eval "$cmd || die '$cmd failed'"
97 @@ -229,6 +234,7 @@ ver=$(cd $srcd && git describe --tags --dirty) || ver=unknown
99  cmd="(. $srcd/genconfstr.sh >$outd/confstruct.ml)"
100  keycmd="digest $srcd/genconfstr.sh $outd/confstruct.ml"
101 +printf "$outd/confstruct.ml: $srcd/genconfstr.sh\n\t$cmd\n" >>Makefile
102  isfresh "$outd/confstruct.ml" "$cmd$(eval $keycmd)" || {
103      echo "generating $outd/confstruct.ml"
104      eval "$cmd || die genconfstr.sh failed"
105 @@ -295,6 +301,7 @@ fi
106  ord=$(grep -v \.cmi $outd/ordered)
107  cmd="ocamlc -custom $libs -o $outd/llpp $cobjs $(echo $ord) -cclib \"$clibs\""
108  keycmd="digest $outd/llpp $cobjs $ord $mulibs"
109 +printf "$outd/llpp: $cobjs $(echo $ord)\n\t$cmd\n" >>Makefile
110  isfresh "$outd/llpp" "$cmd$(eval $keycmd)" || {
111      echo linking $outd/llpp
112      eval "$cmd || die '$cmd failed'"
118 ========================================
119 ~/xsrc/llpp
120 - rm build/*.cm* build/lablGL/*.cm* build/wsi/x11/*.cm* build/*.o build/lablGL/*.o build/wsi/x11/*.o
121 ~/xsrc/llpp
122 - \time -pv bash build.bash build 
123   utils.ml -> utils.cmo
124   keys.ml -> keys.cmo
125  wsi.mli -> wsi.cmi
126   wsi/x11/wsi.mli -> wsi/x11/wsi.cmi
127  wsi/x11/wsi.ml -> wsi/x11/wsi.cmo
128  utf8syms.ml -> utf8syms.cmo
129  lablGL/raw.ml -> lablGL/raw.cmo
130      lablGL/gl.ml -> lablGL/gl.cmo
131     lablGL/glPix.ml -> lablGL/glPix.cmo
132     lablGL/glMisc.ml -> lablGL/glMisc.cmo
133    lablGL/glTex.ml -> lablGL/glTex.cmo
134    lablGL/glFunc.ml -> lablGL/glFunc.cmo
135     lablGL/glDraw.ml -> lablGL/glDraw.cmo
136    lablGL/glArray.ml -> lablGL/glArray.cmo
137      parser.ml -> parser.cmo
138      build/confstruct.ml -> confstruct.cmo
139     config.ml -> config.cmo
140    ffi.ml -> ffi.cmo
141   glutils.ml -> glutils.cmo
142   lablGL/glMat.ml -> lablGL/glMat.cmo
143  listview.ml -> listview.cmo
144  help.mli -> help.cmi
145  help.ml -> help.cmo
146  lablGL/glClear.ml -> lablGL/glClear.cmo
147 main.ml -> main.cmo
148 link.c -> link.o
149 cutils.c -> cutils.o
150 version.c -> version.o
151 lablGL/ml_gl.c -> lablGL/ml_gl.o
152 lablGL/ml_glarray.c -> lablGL/ml_glarray.o
153 lablGL/ml_raw.c -> lablGL/ml_raw.o
154 wsi/x11/keysym2ucs.c -> wsi/x11/keysym2ucs.o
155 wsi/x11/xlib.c -> wsi/x11/xlib.o
156 10 sec
157         Command being timed: "bash build.bash build"
158         User time (seconds): 8.75
159         System time (seconds): 0.93
160         Percent of CPU this job got: 101%
161         Elapsed (wall clock) time (h:mm:ss or m:ss): 0:09.55
162         Average shared text size (kbytes): 0
163         Average unshared data size (kbytes): 0
164         Average stack size (kbytes): 0
165         Average total size (kbytes): 0
166         Maximum resident set size (kbytes): 77656
167         Average resident set size (kbytes): 0
168         Major (requiring I/O) page faults: 0
169         Minor (reclaiming a frame) page faults: 348362
170         Voluntary context switches: 3401
171         Involuntary context switches: 706
172         Swaps: 0
173         File system inputs: 0
174         File system outputs: 10272
175         Socket messages sent: 0
176         Socket messages received: 0
177         Signals delivered: 0
178         Page size (bytes): 4096
179         Exit status: 0
180 ~/xsrc/llpp
181 - rm build/*.cm* build/lablGL/*.cm* build/wsi/x11/*.cm* build/*.o build/lablGL/*.o build/wsi/x11/*.o
182 ~/xsrc/llpp
183 - \time -pv make -j4 build/llpp -s
184         Command being timed: "make -j4 build/llpp -s"
185         User time (seconds): 5.11
186         System time (seconds): 0.64
187         Percent of CPU this job got: 220%
188         Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.60
189         Average shared text size (kbytes): 0
190         Average unshared data size (kbytes): 0
191         Average stack size (kbytes): 0
192         Average total size (kbytes): 0
193         Maximum resident set size (kbytes): 77648
194         Average resident set size (kbytes): 0
195         Major (requiring I/O) page faults: 0
196         Minor (reclaiming a frame) page faults: 166642
197         Voluntary context switches: 303
198         Involuntary context switches: 369
199         Swaps: 0
200         File system inputs: 0
201         File system outputs: 89008
202         Socket messages sent: 0
203         Socket messages received: 0
204         Signals delivered: 0
205         Page size (bytes): 4096
206         Exit status: 0
207 ~/xsrc/llpp
208 - \time -pv make -j1 build/llpp -s 
209         Command being timed: "make -j1 build/llpp -s"
210         User time (seconds): 3.62
211         System time (seconds): 0.43
212         Percent of CPU this job got: 99%
213         Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.07
214         Average shared text size (kbytes): 0
215         Average unshared data size (kbytes): 0
216         Average stack size (kbytes): 0
217         Average total size (kbytes): 0
218         Maximum resident set size (kbytes): 77592
219         Average resident set size (kbytes): 0
220         Major (requiring I/O) page faults: 0
221         Minor (reclaiming a frame) page faults: 166577
222         Voluntary context switches: 176
223         Involuntary context switches: 138
224         Swaps: 0
225         File system inputs: 0
226         File system outputs: 89008
227         Socket messages sent: 0
228         Socket messages received: 0
229         Signals delivered: 0
230         Page size (bytes): 4096
231         Exit status: 0