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
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
28 glutils.ml -> glutils.cmo
29 lablGL/glMat.ml -> lablGL/glMat.cmo
30 listview.ml -> listview.cmo
33 lablGL/glClear.ml -> lablGL/glClear.cmo
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
43 IOW - whole build (including lablGL, but excluding mupdf/ocaml and its
44 dependencies) takes less than 10 seconds even on this circa 2014
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 -
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
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() (
85 + echo "$outd/${s1%.ml}.cmo: $o" >>Makefile
86 bocaml1 $n "$s" "$outd/${s1%.ml}.cmo" "${o#$outd/}"
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 ========================================
120 - rm build/*.cm* build/lablGL/*.cm* build/wsi/x11/*.cm* build/*.o build/lablGL/*.o build/wsi/x11/*.o
122 - \time -pv bash build.bash build
123 utils.ml -> utils.cmo
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
141 glutils.ml -> glutils.cmo
142 lablGL/glMat.ml -> lablGL/glMat.cmo
143 listview.ml -> listview.cmo
146 lablGL/glClear.ml -> lablGL/glClear.cmo
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
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
173 File system inputs: 0
174 File system outputs: 10272
175 Socket messages sent: 0
176 Socket messages received: 0
178 Page size (bytes): 4096
181 - rm build/*.cm* build/lablGL/*.cm* build/wsi/x11/*.cm* build/*.o build/lablGL/*.o build/wsi/x11/*.o
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
200 File system inputs: 0
201 File system outputs: 89008
202 Socket messages sent: 0
203 Socket messages received: 0
205 Page size (bytes): 4096
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
225 File system inputs: 0
226 File system outputs: 89008
227 Socket messages sent: 0
228 Socket messages received: 0
230 Page size (bytes): 4096