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 */