mirror of https://github.com/macssh/macssh.git
195 lines
7.0 KiB
HTML
Executable File
195 lines
7.0 KiB
HTML
Executable File
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
|
||
<html>
|
||
<head>
|
||
<title>
|
||
GMP Development Projects
|
||
</title>
|
||
</head>
|
||
<body bgcolor=pink>
|
||
|
||
<center>
|
||
<h1>
|
||
GMP Development Projects
|
||
</h1>
|
||
</center>
|
||
|
||
<comment>
|
||
An up-to-date version of this file is available at
|
||
<a href="http://www.swox.com/gmp/projects.html">http://www.swox.com/gmp/projects.html</a>.
|
||
</comment>
|
||
|
||
<p> This file lists projects suitable for volunteers. Please see the
|
||
<a href="tasks.html">tasks file</a> for smaller tasks.
|
||
|
||
<p> If you want to work on any of the projects below, please let tege@swox.com
|
||
know. If you want to help with a project that already somebody else is
|
||
working on, please talk to that person too, tege@swox.com can put you in
|
||
touch. (There are no email addresses of volunteers below, due to spamming
|
||
problems.)
|
||
|
||
<ul>
|
||
<li> <strong>C++ wrapper</strong>
|
||
|
||
<p> A C++ wrapper for GMP is highly desirable. Several people have started
|
||
writing one, but nobody has so far finished it. For a wrapper to be useful,
|
||
one needs to pay attention to efficiency.
|
||
|
||
<ol>
|
||
<li> Write arithmetic functions for direct applications of most
|
||
elementary C++ types. This might be necessary to avoid
|
||
ambiguities, but it is also desirable from an efficiency
|
||
standpoint.
|
||
<li> Avoid running constructors/destructors when not necessary.
|
||
For example, implement <code>a += b</code> by directly applying mpz_add.
|
||
</ol>
|
||
|
||
<p> <li> <strong>Faster multiplication</strong>
|
||
|
||
<p> The current multiplication code uses Karatsuba, 3-way Toom-Cook,
|
||
or Fermat FFT. Several new developments are desirable:
|
||
|
||
<ol>
|
||
<li> Handle multiplication of operands with different digit count
|
||
better than today. We now split the operands in a very
|
||
inefficient way, see mpn/generic/mul.c.
|
||
|
||
<li> Consider N-way Toom-Cook. See Knuth's Seminumerical
|
||
Algorithms for details on the method. Code implementing it
|
||
exists. This is asymptotically inferior to FFTs, but is finer
|
||
grained. A toom-4 might fit in between toom-3 and the FFTs
|
||
(or it might not).
|
||
|
||
<li> It's possible CPU dependent effects like cache locality will
|
||
have a greater impact on speed than algorithmic improvements.
|
||
|
||
</ol>
|
||
|
||
|
||
<p> <li> <strong>Assembly routines</strong>
|
||
|
||
<p> Write new and tune existing assembly routines. The programs in mpn/tests
|
||
and the tune/speed.c program are useful for testing and timing the routines
|
||
you write. See the README files in those directories for more information.
|
||
|
||
<p> Please make sure your new routines are fast for these three situations:
|
||
<ol>
|
||
<li> Operands that fit into the cache.
|
||
<li> Small operands of less than, say, 10 limbs.
|
||
<li> Huge operands that does not fit into the cache.
|
||
</ol>
|
||
|
||
<p> The most important routines are mpn_addmul_1, mpn_mul_basecase and
|
||
mpn_sqr_basecase. The latter two don't exist for all machines, while
|
||
mpn_addmul_1 exists for almost all machines.
|
||
|
||
<p> Standard techniques for these routines are unrolling, software
|
||
pipelining, and specialization for common operand values. For machines with
|
||
poor integer multiplication, it is often possible to improve the performance
|
||
using floating-point operations, or SIMD operations such as MMX or Sun's VIS.
|
||
|
||
<p> Using floating-point operations is interesting but somewhat tricky.
|
||
Since IEEE double has 53 bit of mantissa, one has to split the operands in
|
||
small prices, so that no result is greater than 2^53. For 32-bit computers,
|
||
splitting one operand into 16-bit pieces works. For 64-bit machines, one
|
||
operand can be split into 21-bit pieces and the other into 32-bit pieces. (A
|
||
64-bit operand can be split into just three 21-bit pieces if one allows the
|
||
split operands to be negative!)
|
||
|
||
|
||
<p> <li> <strong>Faster extended GCD</strong>
|
||
|
||
<p> We currently have extended GCD based on Lehmer's method.
|
||
But the binary method can quite easily be improved for bignums
|
||
in a similar way Lehmer improved Euclid's algorithm. The result should
|
||
beat Lehmer's method by about a factor of 2. Furthermore, the multiprecision
|
||
step of Lehmer's method and the binary method will be identical, so the
|
||
current code can mostly be reused. It should be possible to share code
|
||
between GCD and GCDEXT, and probably with Jacobi symbols too.
|
||
|
||
<p> <li> <strong>Math functions for the mpf layer</strong>
|
||
|
||
<p> Implement the functions of math.h for the GMP mpf layer! Check the book
|
||
"Pi and the AGM" by Borwein and Borwein for ideas how to do this. These
|
||
functions are desirable: acos, acosh, asin, asinh, atan, atanh, atan2, cos,
|
||
cosh, exp, log, log10, pow, sin, sinh, tan, tanh.
|
||
|
||
<p> <li> <strong>Faster sqrt</strong>
|
||
|
||
<p> The current code for computing square roots use a Newton iteration that
|
||
rely on division. It is possible to avoid using division by computing
|
||
1/sqrt(A) using this formula:
|
||
<pre>
|
||
2
|
||
x = x (3 - A x )/2.
|
||
i+1 i i </pre>
|
||
The final result is then computed without division using,
|
||
<pre>
|
||
sqrt(A) = A x .
|
||
n </pre>
|
||
The resulting code should be substantially faster than the current code.
|
||
|
||
<p> <li> <strong>Nth root</strong>
|
||
|
||
<p> Implement, at the mpn level, a routine for computing the nth root of a
|
||
number. The routine should use Newton's method, preferably without using
|
||
division.
|
||
|
||
<p> If the routine becomes fast enough, perhaps square roots could be computed
|
||
using this function.
|
||
|
||
<p> <li> <strong>More random number generators</strong>
|
||
|
||
<p> Implement some more pseudo random number generator algorithms.
|
||
Today there's only Linear Congruential.
|
||
|
||
|
||
<p> <li> <strong>Test Suite</strong>
|
||
|
||
<p> Add a test suite for old bugs. These tests wouldn't loop or use
|
||
random numbers, but just test for specific bugs found in the
|
||
past.
|
||
|
||
<p> More importantly, improve the random number controls for test
|
||
collections:
|
||
|
||
<ol>
|
||
<li> Use the new random number framework.
|
||
<li> Have every test accept a seed parameter.
|
||
<li> Allow `make check' to set the seed parameter.
|
||
<li> Add more tests for important, now untested functions.
|
||
</ol>
|
||
|
||
<p> With this in place, it should be possible to rid GMP of
|
||
practically all bugs by having some dedicated GMP test machines
|
||
running "make check" with ever increasing seeds (and
|
||
periodically updating to the latest GMP).
|
||
|
||
<p> If a few more ASSERTs were sprinkled through the code, running
|
||
some tests with --enable-assert might be useful, though not a
|
||
substitute for tests on the normal build.
|
||
|
||
<p> An important feature of any random tests will be to record the
|
||
seeds used, and perhaps to snapshot operands before performing
|
||
each test, so any problem exposed can be reproduced.
|
||
|
||
</ul>
|
||
|
||
<hr>
|
||
|
||
<table width="100%">
|
||
<tr>
|
||
<td>
|
||
<font size=2>
|
||
Please send comments about this page to
|
||
<a href="mailto:tege@swox.com">tege@swox.com</a>.<br>
|
||
Copyright (C) 1999, 2000 Torbj<62>rn Granlund.
|
||
</font>
|
||
</td>
|
||
<td align=right>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
|
||
</body>
|
||
</html>
|