This patch changes the default TM method that is used if more than one
thread is registered to ml_wt (from serialirr_onwrite previously).  For
one registered thread, it's still serialirr.

Right now, this will not be a performance advantage for every workload
and number of threads.  However, of the TM methods we have implemented
so far, ml_wt is the only one that allows concurrent update
transactions.  gl_wt update txns essentially abort all other txns that
have read something.  serialirr_onwrite serializes all update txns.
ml_wt can execute disjoint-access-parallel txns in parallel, unless we
get false sharing via the address-to-orec mapping.  Therefore, even
though ml_wt performance isn't great currently, it's the only option
that doesn't suffer from a principal scalability bottleneck.

In the long-term, this should get improved by a less trivial choice
regarding which TM method to use (e.g., based on actual abort rate and
other factors). Likewise, the ml_wt lock-mapping can hopefully be
improved, so that we can at least get better scalability even if the
single-thread overheads are higher.  We might also want to add other TM
methods.  But all of that will require some time to get done, so until
then, I think the better choice right now is still to go with ml_wt
as-is in the meantime.

OK?

PS: I also noticed that libitm/testsuite/libitm.c/memcpy-1.c takes
surprisingly long when using ml_wt compared to serialirr.  I will
investigate this later. 
commit ce7f7cd1797cb3c4136c53ff038d2f8f7f0bfad7
Author: Torvald Riegel <trie...@redhat.com>
Date:   Thu Feb 23 14:16:14 2012 +0100

    libitm: Use ml_wt as default TM methods for >1 thread.
    
        libitm/
        * retry.cc (GTM::gtm_thread::number_of_threads_changed): Change
        default dispatch for more than 1 thread to ml_wt.

diff --git a/libitm/retry.cc b/libitm/retry.cc
index 2c1483e..660bf52 100644
--- a/libitm/retry.cc
+++ b/libitm/retry.cc
@@ -314,7 +314,7 @@ GTM::gtm_thread::number_of_threads_changed(unsigned 
previous, unsigned now)
        set_default_dispatch(default_dispatch_user);
       else
        {
-         abi_dispatch* a = dispatch_serialirr_onwrite();
+         abi_dispatch* a = dispatch_ml_wt();
          if (a->supports(now))
            set_default_dispatch(a);
          else

Reply via email to