Finding large difference b/w execution time of c++ and D codes for same problem
Marco Leise
Marco.Leise at gmx.de
Wed Feb 13 05:26:33 PST 2013
I like optimization challenges. This is an excellent test
program to check the effect of different floating point types
on intermediate values. Remember that when you store values in
a float variable, the FPU actually has to round it down to
that precision, store it in a 32-bit memory location, then
load it back in and expand it - you _asked_ for that.
I compiled with LDC2 and these are the results:
D code serial with dimension 32768 ...
using floats Total time: 13.399 [sec]
using doubles Total time: 9.429 [sec]
using reals Total time: 8.909 [sec] // <- !!!
You get both, 50% more speed and more precision! It is a
win-win situation. Also take a look at Phobos' std.math that
returns real everywhere.
Modified code:
---8<-------------------------------
module main;
import std.datetime;
import std.metastrings;
import std.stdio;
import std.typetuple;
enum DIM = 32 * 1024;
int juliaValue;
template Julia(TReal)
{
struct ComplexStruct
{
float r;
float i;
TReal squarePlusMag(const ComplexStruct another)
{
TReal r1 = r*r - i*i + another.r;
TReal i1 = 2.0*i*r + another.i;
r = r1;
i = i1;
return (r1*r1 + i1*i1);
}
}
int juliaFunction( int x, int y )
{
auto c = ComplexStruct(0.8, 0.156);
auto a = ComplexStruct(x, y);
foreach (i; 0 .. 200)
if (a.squarePlusMag(c) > 1000)
return 0;
return 1;
}
void kernel()
{
foreach (x; 0 .. DIM) {
foreach (y; 0 .. DIM) {
juliaValue = juliaFunction( x, y );
}
}
}
}
void main()
{
writeln("D code serial with dimension " ~ toStringNow!DIM ~ " ...");
StopWatch sw;
foreach (Math; TypeTuple!(float, double, real))
{
sw.start();
Julia!(Math).kernel();
sw.stop();
writefln(" using %ss Total time: %s [sec]",
Math.stringof, (sw.peek().msecs * 0.001));
sw.reset();
}
}
------------------------------->8---
--
Marco
More information about the Digitalmars-d-learn
mailing list