[fpc-pascal] FPCUnit - parallel test suite execution
Jonas Maebe
jonas.maebe at elis.ugent.be
Thu Mar 19 11:56:31 CET 2015
Graeme Geldenhuys wrote on Thu, 19 Mar 2015:
> On 2015-03-19 08:10, Mark Morgan Lloyd wrote:
>> In any event the output would need to be presented in a reproducible
>> sequence.
>
> A good point, but thinking about it I don't think it would be that hard.
> The text output might be a bit more tricky, but not impossible.
The easiest, most maintainable, least invasive (and in case you don't
need/want the threads to interact, often also the best performing) way
to introduce parallelism is to do it as coarse-grained as possible.
I.e., simply run multiple self-contained unit-test programs in
parallel, rather than trying to parallelise the execution of unit
tests within a single program. Since the tests by definition are
supposed to be independent, introducing dependencies by adding
threading is a step backwards in several ways (performance,
maintainability, debugability, ..).
This, of course, requires the availability of as sufficient number of
test programs to actually execute in parallel (which definitely can be
a problem if you're used to putting all unit tests into a single
program). But if you do have that amount of independent work
available, you'll generally get much better performance because you
won't need any locking anywhere (even the overhead of the OS starting
a program can easily be lower than the one caused by work queue
maintenance and contention over a bunch of locks in a program,
especially if you have very fine-grained work units such as a single
function call to evaluate and test). You'll also have much better
productivity because you'll have to spend much less time on writing,
optimising and debugging the actual testing framework (and on taking
into account all possible threading hazards when extending it).
An extreme example of this is the FPC testsuite: on an IBM Power8
system with 10 cores that each can run 16 threads, the entire
testsuite of 4000-5000 test programs finishes in about 30 seconds
(including running fpmake install on the rtl and packages
directories). The parallelism, in this case, is handled via make -j
160, but it could just as well be a Pascal program that fires up
threads and launches programs from within those threads. Every
parallel invocation of the test runner (dotest) executes 10 to 20
tests sequentially and the results are all written to separate files.
At the very end, all of those text files are concatenated in the right
order, so the output is deterministic.
Most OS kernels have a lot of smp optimisations, probably way better
than any of us could every write (or even would want to bother to
write and maintain for something like a testing harness). I very much
doubt a multi-threaded implementation of the dotest program, apart
from the work this would entail, could outperform the current approach
without several weeks or even months of work.
Jonas
More information about the fpc-pascal
mailing list