Changes between Version 28 and Version 29 of ReplacingGMPNotes


Ignore:
Timestamp:
Sep 20, 2006 7:07:36 PM (9 years ago)
Author:
guest
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ReplacingGMPNotes

    v28 v29  
    8989==== Optimisation Opportunities ====
    9090
    91  (1) Initialisation of GMP on every call. 
    92 GMP is currently initialised every time it is called from the RTS.  For example, consider the macro in [http://darcs.haskell.org/ghc/rts/PrimOps.cmm rts/PrimOps.cmm]:
    93 {{{
    94 #define GMP_TAKE1_RET1(name,mp_fun)                                     \
    95 name                                                                    \
    96 {                                                                       \
    97   CInt s1;                                                              \
    98   W_ d1;                                                                \
    99   FETCH_MP_TEMP(mp_tmp1);                                               \
    100   FETCH_MP_TEMP(mp_result1)                                             \
    101                                                                         \
    102   /* call doYouWantToGC() */                                            \
    103   MAYBE_GC(R2_PTR, name);                                               \
    104                                                                         \
    105   d1 = R2;                                                              \
    106   s1 = W_TO_INT(R1);                                                    \
    107                                                                         \
    108   MP_INT__mp_alloc(mp_tmp1)     = W_TO_INT(StgArrWords_words(d1));      \
    109   MP_INT__mp_size(mp_tmp1)      = (s1);                                 \
    110   MP_INT__mp_d(mp_tmp1)         = BYTE_ARR_CTS(d1);                     \
    111                                                                         \
    112   foreign "C" __gmpz_init(mp_result1 "ptr") [];                         \ /* INITIALISATION HERE */
    113                                                                         \
    114   /* Perform the operation */                                           \
    115   foreign "C" mp_fun(mp_result1 "ptr",mp_tmp1 "ptr") [];                \
    116                                                                         \
    117   RET_NP(TO_W_(MP_INT__mp_size(mp_result1)),                            \
    118          MP_INT__mp_d(mp_result1) - SIZEOF_StgArrWords);                \
    119 }
    120 }}}
    121 Possible solutions:
    122    (a) wrap the MP library functions (in C, not C--) and test for initialisation there; wrapper should be multi-threaded or reentrant
    123 
    124    (b) maintain initialisation in GHC's RTS
    125 
    126 (2) The "shockingly inefficient" operation of this code:
     91(1) The "shockingly inefficient" operation of this code:
    12792{{{
    12893/* ToDo: this is shockingly inefficient */