Re: [Gc] parallel speedup

Bruce Hoult <[email protected]> Thu, 3 Jul 2014 09:08:52 +1200
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <CAMU+EkyAyMenm8AAvFzubjKCnFsLCwSWLOTASEkLerCGdkk2TA@mail.gmail.com>
Aha! So the overall speed was self-inflicted! 12 is far down the "I want to
use the absolute minimum amount of RAM and don't care how slow the program
goes" settings curve.

I'm surprised 2 is slower than 3 though.

You've still not getting a lot of parallel speedup, though I note that the
absolute difference between sequential and parallel is approximately the
same in all cases, so the relative speedup is much higher now.

A profile will look much different now.

What is the overall heap size?



On Thu, Jul 3, 2014 at 5:47 AM, Daniel R. Grayson <
[email protected]> wrote:

> Oops, here's something I forgot to consider.  Years ago I inserted code
> for initializing the
> GC_free_space_divisor to 12, but the libgc default is 3.  That turns out
> to be a big problem all by
> itself.
>
> With 4 threads:
>
> divisor setting     sequential run time    parallel run time
>      1                                26
> 21
>      2                                33
> 29
>      3                                31
> 24
>    12                                78
> 71
>
>
>
>
> On Wed, Jul 2, 2014 at 1:13 PM, Daniel R. Grayson <
> [email protected]> wrote:
>
>> Hmm, no, the modern version of the file scale.html that you linked to,
>> which comes with
>> the gc source code, says that thread local allocation is automatically
>> enabled.  Indeed,
>> config.status shows the flag is defined:
>>
>> D["THREAD_LOCAL_ALLOC"]=" 1"
>>
>> The gprof output also shows that GC_generic_malloc_many is getting used.
>>  So I don't
>> know what to do differently.
>>
>>
>> On Wed, Jul 2, 2014 at 1:01 PM, Daniel R. Grayson <
>> [email protected]> wrote:
>> >
>> > Here is some more information, sorry for the delay.
>> >
>> > The test program allocates small chunks of memory, some of which contain
>> > pointers, and some of which do not (gmp integers).  The latter are
>> allocated
>> > with GC_MALLOC_ATOMIC.
>> >
>> > Here is how the program is spending its time, in a test with 4 client
>> threads,
>> > according to gprof:
>> >
>> >   %   cumulative   self              self     total
>> >  time   seconds   seconds    calls   s/call   s/call  name
>> >  19.95      2.19     2.19  1259020     0.00     0.00  GC_generic_lock
>> >  14.75      3.81     1.62  2772367     0.00     0.00  evaluate_eval
>> >  11.29      5.05     1.24    54417     0.00     0.00  GC_mark_from
>> >   7.56      5.88     0.83  8614697     0.00     0.00  GC_malloc
>> >   7.01      6.65     0.77  1658054     0.00     0.00  GC_allochblk
>> >   4.37      7.13     0.48  1371704     0.00     0.00
>>  GC_generic_malloc_many
>> >   3.55      7.52     0.39  3292481     0.00     0.00  GC_malloc_atomic
>> >   2.50      7.80     0.28  3299072     0.00     0.00  gmp_toInteger
>> >   2.37      8.06     0.26  2292490     0.00     0.00
>>  GC_header_cache_miss
>> >   2.37      8.32     0.26    58155     0.00     0.00  GC_reclaim_clear
>> >   2.37      8.58     0.26    49848     0.00     0.00  GC_build_fl
>> >   2.14      8.81     0.24 15034505     0.00     0.00  TS_Get_Local
>> >   1.64      8.99     0.18  3110502     0.00     0.00  GC_allochblk_nth
>> >   1.64      9.17     0.18    24769     0.00     0.00  getmem_atomic
>> >   1.46      9.33     0.16       80     0.00     0.01
>>  GC_apply_to_all_blocks
>> >   1.18      9.46     0.13  1717544     0.00     0.00
>>  GC_generic_malloc_inner
>> >
>> > Here is config.log's idea of how gc was configured:
>> >
>> > ./configure
>> --prefix=/home/dan/src/M2/trunk-git/M2/BUILD/dan/builds.tmp/ubuntu64.profile/libraries/final
>> --enable-cplusplus --enable-threads=posix --enable-parallel-mark
>> --enable-large-config --disable-gcj-support --disable-java-finalization
>> --build=x86_64-unknown-linux-gnu --cache-file=/dev/null
>> >
>> > I was unaware of thread local allocation, as described in the link you
>> provide!  In particular, I was
>> > unaware I had to do anything to get it to be activated.  Perhaps that
>> is the next thing to try.
>> >
>> > On Tue, Jun 24, 2014 at 8:48 PM, Bruce Hoult <[email protected]> wrote:
>> > >
>> > > Hi Daniel,
>> > >
>> > > Unfortunately you haven't given us much to go on. We don't know how
>> you've built the GC, and we don't know how you are using it.
>> > >
>> > > Are you spending your time in allocation, or in marking?
>> > >
>> > > Have you read http://www.hboehm.info/gc/scale.html ? What from there
>> have you done?
>> > >
>> > > As you can see, the information there is not very recent. I'm not
>> aware of any serious work carried out with regard to scalability on modern
>> 6 or 8 or 12 core CPUs.
>> > >
>> > > The thread local allocation stuff *should* take care of lock
>> contention, even with quite a few CPU cores.
>> > >
>> > > Marking is a more difficult problem. If the structures allocated by
>> different cores have pointers into structures allocated by other cores  (or
>> it's just generally one big ball of mud) then marking will inevitably cause
>> a lot of cross-CPU cache traffic. If the different threads' data structures
>> are mostly disjoint then parallel marking *could* work very well. *Could*.
>> I really don't know in practice as I've never tried it.
>> > >
>> > > On another track .. are your objects mostly pointers or mostly data?
>> If you have, for example, big arrays filled with numbers, are you using
>> GC_malloc_atomic() so that the GC knows they don't need to be scanned?
>> > >
>> > >
>> > >
>> > > On Wed, Jun 25, 2014 at 11:46 AM, Daniel R. Grayson <
>> [email protected]> wrote:
>> > >>
>> > >> In our application that uses libgc (see http://macaulay2.com/) I
>> observe no
>> > >> speedup when running tasks in parallel, if the tasks allocate memory
>> using
>> > >> libgc.  Perhaps I'm doing something wrong.  Are there any commonly
>> observed
>> > >> situations where no speedup occurs?
>> > >>
>> > >> A glance at the source code shows that mutex locks lock down the
>> world on
>> > >> almost every occasion, so it's hard to see why there would ever be
>> any speedup
>> > >> when using threads.
>> > >>
>> > >>
>> > >>
>> > >> --
>> > >> This message has been scanned for viruses and
>> > >> dangerous content by MailScanner, and is
>> > >> believed to be clean.
>> > >> _______________________________________________
>> > >> bdwgc mailing list
>> > >> [email protected]
>> > >> https://lists.opendylan.org/mailman/listinfo/bdwgc
>> > >
>> > >
>>
>
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean.
>

_______________________________________________
bdwgc mailing list
[email protected]
https://lists.opendylan.org/mailman/listinfo/bdwgc