[BACK]Return to projects.html CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / doc

Annotation of OpenXM_contrib/gmp/doc/projects.html, Revision 1.1.1.1

1.1       maekawa     1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
                      2: <html>
                      3: <head>
                      4:   <title>
                      5:     GMP Development Projects
                      6:   </title>
                      7: </head>
                      8: <body bgcolor=pink>
                      9:
                     10: <center>
                     11:   <h1>
                     12:     GMP Development Projects
                     13:   </h1>
                     14: </center>
                     15:
                     16: <comment>
                     17:   An up-to-date version of this file is available at
                     18:   <a href="http://www.swox.com/gmp/projects.html">http://www.swox.com/gmp/projects.html</a>.
                     19: </comment>
                     20:
                     21: <p> This file lists projects suitable for volunteers.  Please see the
                     22:     <a href="tasks.html">tasks file</a> for smaller tasks.
                     23:
                     24: <p> If you want to work on any of the projects below, please let tege@swox.com
                     25:     know.  If you want to help with a project that already somebody else is
                     26:     working on, please talk to that person too, tege@swox.com can put you in
                     27:     touch.  (There are no email addresses of volunteers below, due to spamming
                     28:     problems.)
                     29:
                     30: <ul>
                     31: <li> <strong>C++ wrapper</strong>
                     32:
                     33:   <p> A C++ wrapper for GMP is highly desirable.  Several people have started
                     34:   writing one, but nobody has so far finished it.  For a wrapper to be useful,
                     35:   one needs to pay attention to efficiency.
                     36:
                     37:   <ol>
                     38:     <li> Write arithmetic functions for direct applications of most
                     39:          elementary C++ types.  This might be necessary to avoid
                     40:          ambiguities, but it is also desirable from an efficiency
                     41:          standpoint.
                     42:     <li> Avoid running constructors/destructors when not necessary.
                     43:          For example, implement <code>a&nbsp+=&nbsp;b</code> by directly applying mpz_add.
                     44:   </ol>
                     45:
                     46: <p> <li> <strong>Faster multiplication</strong>
                     47:
                     48:   <p> The current multiplication code uses Karatsuba, 3-way Toom-Cook,
                     49:       or Fermat FFT.  Several new developments are desirable:
                     50:
                     51:   <ol>
                     52:     <li> Handle multiplication of operands with different digit count
                     53:         better than today.  We now split the operands in a very
                     54:         inefficient way, see mpn/generic/mul.c.
                     55:
                     56:     <li> Consider N-way Toom-Cook.  See Knuth's Seminumerical
                     57:         Algorithms for details on the method.  Code implementing it
                     58:         exists.  This is asymptotically inferior to FFTs, but is finer
                     59:         grained.  A toom-4 might fit in between toom-3 and the FFTs
                     60:         (or it might not).
                     61:
                     62:     <li> It's possible CPU dependent effects like cache locality will
                     63:          have a greater impact on speed than algorithmic improvements.
                     64:
                     65:   </ol>
                     66:
                     67:
                     68: <p> <li> <strong>Assembly routines</strong>
                     69:
                     70:   <p> Write new and tune existing assembly routines.  The programs in mpn/tests
                     71:   and the tune/speed.c program are useful for testing and timing the routines
                     72:   you write.  See the README files in those directories for more information.
                     73:
                     74:   <p> Please make sure your new routines are fast for these three situations:
                     75:   <ol>
                     76:     <li> Operands that fit into the cache.
                     77:     <li> Small operands of less than, say, 10 limbs.
                     78:     <li> Huge operands that does not fit into the cache.
                     79:   </ol>
                     80:
                     81:   <p> The most important routines are mpn_addmul_1, mpn_mul_basecase and
                     82:   mpn_sqr_basecase.  The latter two don't exist for all machines, while
                     83:   mpn_addmul_1 exists for almost all machines.
                     84:
                     85:   <p> Standard techniques for these routines are unrolling, software
                     86:   pipelining, and specialization for common operand values.  For machines with
                     87:   poor integer multiplication, it is often possible to improve the performance
                     88:   using floating-point operations, or SIMD operations such as MMX or Sun's VIS.
                     89:
                     90:   <p> Using floating-point operations is interesting but somewhat tricky.
                     91:   Since IEEE double has 53 bit of mantissa, one has to split the operands in
                     92:   small prices, so that no result is greater than 2^53.  For 32-bit computers,
                     93:   splitting one operand into 16-bit pieces works.  For 64-bit machines, one
                     94:   operand can be split into 21-bit pieces and the other into 32-bit pieces.  (A
                     95:   64-bit operand can be split into just three 21-bit pieces if one allows the
                     96:   split operands to be negative!)
                     97:
                     98:
                     99: <p> <li> <strong>Faster extended GCD</strong>
                    100:
                    101:   <p> We currently have extended GCD based on Lehmer's method.
                    102:   But the binary method can quite easily be improved for bignums
                    103:   in a similar way Lehmer improved Euclid's algorithm.  The result should
                    104:   beat Lehmer's method by about a factor of 2.  Furthermore, the multiprecision
                    105:   step of Lehmer's method and the binary method will be identical, so the
                    106:   current code can mostly be reused.  It should be possible to share code
                    107:   between GCD and GCDEXT, and probably with Jacobi symbols too.
                    108:
                    109: <p> <li> <strong>Math functions for the mpf layer</strong>
                    110:
                    111:   <p> Implement the functions of math.h for the GMP mpf layer!  Check the book
                    112:   "Pi and the AGM" by Borwein and Borwein for ideas how to do this.  These
                    113:   functions are desirable: acos, acosh, asin, asinh, atan, atanh, atan2, cos,
                    114:   cosh, exp, log, log10, pow, sin, sinh, tan, tanh.
                    115:
                    116: <p> <li> <strong>Faster sqrt</strong>
                    117:
                    118:   <p> The current code for computing square roots use a Newton iteration that
                    119:   rely on division.  It is possible to avoid using division by computing
                    120:   1/sqrt(A) using this formula:
                    121:   <pre>
                    122:                                     2
                    123:                    x   = x  (3 - A x )/2.
                    124:                     i+1   i         i  </pre>
                    125:   The final result is then computed without division using,
                    126:   <pre>
                    127:                      sqrt(A) = A x .
                    128:                                   n  </pre>
                    129:   The resulting code should be substantially faster than the current code.
                    130:
                    131: <p> <li> <strong>Nth root</strong>
                    132:
                    133:   <p> Implement, at the mpn level, a routine for computing the nth root of a
                    134:   number.  The routine should use Newton's method, preferably without using
                    135:   division.
                    136:
                    137:   <p> If the routine becomes fast enough, perhaps square roots could be computed
                    138:   using this function.
                    139:
                    140: <p> <li> <strong>More random number generators</strong>
                    141:
                    142:   <p> Implement some more pseudo random number generator algorithms.
                    143:       Today there's only Linear Congruential.
                    144:
                    145:
                    146: <p> <li> <strong>Test Suite</strong>
                    147:
                    148:   <p> Add a test suite for old bugs.  These tests wouldn't loop or use
                    149:       random numbers, but just test for specific bugs found in the
                    150:       past.
                    151:
                    152:   <p> More importantly, improve the random number controls for test
                    153:       collections:
                    154:
                    155:       <ol>
                    156:         <li> Use the new random number framework.
                    157:         <li> Have every test accept a seed parameter.
                    158:         <li> Allow `make check' to set the seed parameter.
                    159:         <li> Add more tests for important, now untested functions.
                    160:       </ol>
                    161:
                    162:   <p> With this in place, it should be possible to rid GMP of
                    163:       practically all bugs by having some dedicated GMP test machines
                    164:       running "make check" with ever increasing seeds (and
                    165:       periodically updating to the latest GMP).
                    166:
                    167:   <p> If a few more ASSERTs were sprinkled through the code, running
                    168:       some tests with --enable-assert might be useful, though not a
                    169:       substitute for tests on the normal build.
                    170:
                    171:   <p> An important feature of any random tests will be to record the
                    172:       seeds used, and perhaps to snapshot operands before performing
                    173:       each test, so any problem exposed can be reproduced.
                    174:
                    175: </ul>
                    176:
                    177: <hr>
                    178:
                    179: <table width="100%">
                    180:   <tr>
                    181:     <td>
                    182:       <font size=2>
                    183:       Please send comments about this page to
                    184:       <a href="mailto:tege@swox.com">tege@swox.com</a>.<br>
                    185:       Copyright (C) 1999, 2000 Torbjörn Granlund.
                    186:       </font>
                    187:     </td>
                    188:     <td align=right>
                    189:     </td>
                    190:   </tr>
                    191: </table>
                    192:
                    193: </body>
                    194: </html>

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>