Dear Decio,<br><br>Thanks a lot for your help! I saw hopes from your comments. <br><br>Indeed, I am dealing with addition/subtraction/multiplication/division and exp/log with extremely large numbers or numbers for which huge precision needs to be preserved using GMP/MPFR. I need to identify which portion of the code in GMP/MPFR, if I rewrite using Assembly language and focusing on optimization, will lead me to the most performance gain. I really need a TREMENDOUS speed up. 
<br><br>You questioned that why I dodged optimization on the algorithm level. Here is the reason. I am dealing just one expression(complicated), but with one expression, my task is to implement it and to squeeze as much performance as possible. I don&#39;t see how I can optimize from the algorithm level, other than the vectorization which I&#39;ve already used in Matlab. 
<br><br>The whole expression is kind of straighforward, so I provide it below, using Matlab to make it easy to demonstrate. I attach my program below. As you can see, it involves addition/subtraction/multiplication/division and exp/log with extremely large numbers or numbers for which huge precision needs to be preserved. The range of k and n in the program can be hundreds. That&#39;s to say we are dealing with numbers of the order of gamma(hundreds), due to the binomial numbers used. I&#39;ve used Matlab&#39;s symbolic computation. All the variables, except n, are not integers or rationals. 
<br><br>I&#39;ve used Matlab&#39;s vectorized computation to achieve faster speed. But still, it&#39;s slow, because of the symbolic computations. However, we have to maintain super high precisions -- we did a test, if we change some variables from symbolic to double floating point, then we are in huge trouble, the result is way off. For this reason, the variables we send in to this function are all in symbolic form. The large binomial coefficients are obtained using Maple&#39;s binomial function.
<br><br>I have converted this program into GMP/MPFR and I&#39;ve found some performance gain. But still the speed is far from our demand. There two troublesome issues: (1) we have to manually set the number of precision bits by ourself for each set of parameters. As you can see there are many parameters involved. Their different combination requires different number of precision bits in order to get the correct results. If we are doing conservative, we set the number of precision bits to be 10240 to guarantee the correct results for &quot;almost all&quot; parameter sets. Then it is extremely slow. (2) We have to optimize the code and make it faster by a speedup of hundreds to thousands times. 
<br><br>Based on my description, could you give me some more detailed pointers? So I can start getting into solve the problem? <br><br>Thanks a lot and happy new year!!! <br><br>-------------------------<br>function p=MyIntegrate(t, s, c, de, n, v_t, ka, mu, si);
<br>R_t=c/de;<br>for k=0:n;<br>&nbsp;&nbsp;&nbsp; pr(k+1)=maple(&#39;binomial&#39;, R_t+k-1, k);<br>end;<br><br>for i=1:length(s)<br>&nbsp;&nbsp;&nbsp; la=MyL(de*([0:n]+R_t), t, s(i), v_t, ka, mu, si);<br>&nbsp;&nbsp;&nbsp; for k=0:n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=alter(k,la);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p(k+1)=pr(k+1)*y;
<br>&nbsp;&nbsp;&nbsp; end<br>end;<br><br>return;<br><br>function res=alter(k,a)<br>for m=0:k<br>&nbsp;&nbsp;&nbsp; s(m+1)=maple(&#39;binomial&#39;, sym(k), sym(m));<br>end<br>res=s*((-1).^[0:k].*a(1:k+1))&#39;;<br>return;<br><br>function L=MyL(u,t,s,v_t,ka,mu,si)
<br>ga=0.5*sqrt(ka^2+2*u*si^2);<br>temp1=ga*(s-t);<br>temp2=sinh(temp1);<br>den=ga.*cosh(temp1)+0.5*ka*temp2;<br>be=-u.*temp2./den;<br>al=2*ka*mu/si^2*(0.5*ka*(s-t)+log(ga./den));<br>L=exp(al+be*v_t);<br>return;<br><br><br>
<br><br><div><span class="gmail_quote">On 1/1/07, <b class="gmail_sendername">Décio Luiz Gazzoni Filho</b> &lt;<a href="mailto:decio@decpp.net" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
decio@decpp.net</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">-----BEGIN PGP SIGNED MESSAGE-----<br>Hash: SHA1<br><br><br>On Jan 1, 2007, at 8:13 PM, Michael wrote:
<br><br>&gt; Does anybody have a statistic about how much performance is gained<br>&gt; by using Intel Compiler and Intel tools, than MSVS 2005?<br><br>Maybe 2 or 3%. If you got 5% I&#39;d be absolutely astonished.<br><br>


&gt;<br>&gt; Also if I pay big bucks and hire some experts to rewrite some<br>&gt; portions of the GMP and MPFR (only a small portion that is related<br>&gt; to my project, to make the whole thing manageable) in a Intel<br>


&gt; platform optimized Assembly language. Will that improve speed a lot?<br>&gt;<br><br>Depends on what part you need to be faster. If your bottleneck is the<br>multiprecision addition code, forget it. If your bottleneck is
<br>multiplication with huge arguments (say hundreds of millions or<br>larger), then hiring someone to write a faster FFT (or an NTT, at<br>that size) would bring about some large gains. If your bottleneck is<br>the division code, or some of the other code that could be using
<br>Newton methods along with subquadratic multiplication, then the<br>improvements could be huge. But unless you specify what specific<br>operation is your bottleneck, then it&#39;s impossible to give an answer.<br>Different parts of GMP are at different levels of optimization.
<br><br>Now one thing has been asked, but you dodged the question: have you<br>ruled out all possibilities of algorithmic optimization? Low-level<br>optimization can only get you so far, and usually not as far as<br>algorithmic optimization will. You could write the best grammar-
<br>school multiply code possible, but in the millions of digits range it<br>would take a severe beating from even the most simple-minded and<br>badly written FFT possible. And even if you&#39;re done with algorithmic<br>


optimization, have you profiled your code to find the true<br>bottlenecks and where to focus your efforts on?<br><br>If at all possible, please shed some light on what you&#39;re trying to<br>do. You appear biased towards low-level optimization, but others
<br>could help point out better strategies, if they only knew what it is<br>you&#39;re trying to accomplish.<br><br>Décio<br>-----BEGIN PGP SIGNATURE-----<br>Version: GnuPG v1.4.5 (Darwin)<br><br>iD8DBQFFma+g9zcAVrR+ETURAs0zAJ46+m/YAHHRrk9michzSFlLzxL5OwCeIVTU
<br>SUVdvXiDUJzGT3RXaNAxQL0=<br>=tmyf<br>-----END PGP SIGNATURE-----<br></blockquote></div><br>