Re: coccinelle: improve array.cocci
From: SZEDER Gábor <hidden>
Date: 2019-11-22 15:29:58
On Thu, Nov 21, 2019 at 08:44:12PM +0100, Markus Elfring wrote:
The program “spatch” supports parallelisation also directly by the parameter “--jobs”. Did you try it out occasionally?
I did try --jobs on a couple of occasions, and the results always
varied between broken, not working, or downright making things even
slower.
$ spatch --version
spatch version 1.0.4 with Python support and with PCRE support
$ spatch --sp-file contrib/coccinelle/array.cocci --all-includes --patch . --jobs 2 alias.c alloc.c
init_defs_builtins: /usr/lib/coccinelle/standard.h
HANDLING: alias.c alloc.c
Fatal error: exception Sys_error("array: No such file or directory")
This issue seems to be fixed in later versions, but this is the
version what many distros still ship and what is used in our CI
builds, so we do care about 1.0.4.
$ spatch --version
spatch version 1.0.8 compiled with OCaml version 4.05.0
Flags passed to the configure script: [none]
OCaml scripting support: yes
Python scripting support: yes
Syntax of regular expressions: PCRE
$ /usr/bin/time --format='%e | %M' make contrib/coccinelle/array.cocci.patch
SPATCH contrib/coccinelle/array.cocci
102.06 | 129084
Our Makefile recipes run Coccinelle in a sequential loop, one 'spatch'
invocation for each source file by default. Therefore, merely passing
in '--jobs <N>' doesn't bring any runtime benefits:
$ /usr/bin/time --format='%e | %M' make SPATCH_FLAGS='--all-includes --patch . --jobs 8' contrib/coccinelle/array.cocci.patch
SPATCH contrib/coccinelle/array.cocci
105.31 | 118512
Some time ago we found that invoking 'spatch' with multiple files at
once does bring notable speedup (with 1.0.4), although at the cost of
drastically increased memory footprint, see commit 960154b9c1
(coccicheck: optionally batch spatch invocations, 2019-05-06). Alas,
trying to use that in the hope that 'spatch' can do more in parallel
if it has more files to process at once doesn't bring any runtime
benefits, either:
$ /usr/bin/time --format='%e | %M' make SPATCH_FLAGS='--all-includes --patch . --jobs 8' SPATCH_BATCH_SIZE=8 contrib/coccinelle/array.cocci.patch
SPATCH contrib/coccinelle/array.cocci
116.27 | 349964
And by further increasing the batch size it just gets notably slower;
also note the order of magnitude higher max memory usage:
$ /usr/bin/time --format='%e | %M' make SPATCH_FLAGS='--all-includes --patch . --jobs 8' SPATCH_BATCH_SIZE=32 contrib/coccinelle/array.cocci.patch
SPATCH contrib/coccinelle/array.cocci
197.70 | 1205784
It appears that batching 'spatch' invocations with 1.0.8 does not
bring the same benefits as with 1.0.4, but brings slowdowns instead...
Anyway, looking at 'ps u -L' output it appears that 'spatch' doesn't
really do any parallel work, and there are only two 'spatch' processes
and no threads despite '--jobs 8':
szeder 2561 0.4 0.5 36944 21520 pts/0 S+ 15:31 0:00 spatch
szeder 2567 97.1 30.5 1228372 1205332 pts/0 R+ 15:31 0:29 spatch
Note that 1.0.8 above was run in a Docker container, while 1.0.4 on
the host. This may or may not have influenced the runtimes reported
above. FWIW, 'make -j4 coccicheck' parallelizes just fine even in the
container and with 1.0.8.
A different approach relying on 'make -j' to parallelize 'spatch'
invocations was discussed here:
https://public-inbox.org/git/20180802115522.16107-1-szeder.dev@gmail.com/T/#u