[distcc] Re: separating compiler and assembler: benchmarks

Stuart D. Gathman stuart at bmsi.com
Mon Mar 3 23:18:03 GMT 2003

Martin Pool wrote:

>>With -pipe, sending preprocessed source to the volunteer 
>>and receiving assembler output occur nearly simultaneously.  
>Is it really true that it's simultaneous, or does it only appear so
>because the remote machine is faster?  My impression was that gcc had
>to read and digest the whole source before it could start producing
>output, but perhaps not.
Gcc writes assembler output after each toplevel item.  Assembler output 
is produces after each static of global variable (initialized or not), 
after each implemented class for C++ (writes vtbl and auto methods), and 
after each function definition.  Unless your C source consists of one 
gigantic function, there is plenty of pipelining of input / output.

Your iompression might hold true for other compilers - especially those 
that try to do more global optimization.

>In any case, realistic .i files will be mostly headers, which won't
>produce any assembly.  So even at best there won't be any output until
>it gets down to the tail of the input file.
Which is why I tested it.  There is still plenty of "meat" in non 
trivial C source.   There is a 2x speedup to be gained (without using 
-j2), and that is with the local assembler on a machine that is 10x slower.

>>However, when the compiler runs on a volunteer, and the assembler
>>runs locally, -pipe provides a factor of 2 speedup.
>... if you ignore parallelism, which is the main point of distcc!
>Yes, you're stripping out time waiting for network transfers, and
>that's a good thing, but it's not so important if there are other
>tasks that can run while the transfer is in progress.
Call me picky, but I expect distcc to perform at its best even without 
parallel make.  Some makefiles are broken and do not work with -j2.  It 
is complicated and slow to debug them.

BTW, I discovered a drawback to using -B to hook the compiler passes. 
 On AIX, gcc adds the directory it find cc1 in to LIBPATH for the 
executable when used on a link step.  Annoying, but not fatal.  The 
distcc -B directory will be secure (i.e. writable only by root) when 
installed.  Presumably, distcc will be smart enough not to pass -B when 
there is no source input, which will eliminate the extra LIBPATH entry 
in most cases (where linking is a separate invocation).

More information about the distcc mailing list