Skip to content
Browse files

Update Java mandelbrot program to fastest from Benchmarks Game site a…

…s of Feb 21 2013 for 4 core 64-bit hardware
  • Loading branch information...
1 parent 3340c57 commit c8eeb341ac3f0e9a1e9b7be5ec36270757e47fb3 @jafingerhut committed
View
2 clojure-benchmarks-results/Clojure-whole-program-benchmarks.html
@@ -220,7 +220,7 @@
</td>
<td>Double precision arithmetic, embarassingly parallel<br>
</td>
- <td>[<a href="mandelbrot.java-6.java">Java</a>]<br>
+ <td>[<a href="mandelbrot.java-2.java">Java</a>]<br>
[<a href="mandelbrot.clj-9-par-1.3.clj">Clojure</a>]<br>
View
87 clojure-benchmarks-results/mandelbrot.java-2.java
@@ -0,0 +1,87 @@
+/* The Computer Language Benchmarks Game
+
+ * http://shootout.alioth.debian.org/
+
+ *
+
+ * contributed by Stefan Krause
+
+ * slightly modified by Chad Whipkey
+
+ * parallelized by Colin D Bennett 2008-10-04
+
+ * reduce synchronization cost by The Anh Tran
+
+ * optimizations and refactoring by Enotus 2010-11-11
+
+ * optimization by John Stalcup 2012-2-19
+
+ */
+
+
+import java.io.*;
+import java.util.concurrent.atomic.*;
+
+public final class mandelbrot {
+ static byte[][] out;
+ static AtomicInteger yCt;
+ static double[] Crb;
+ static double[] Cib;
+
+ static int getByte(int x, int y){
+ int res=0;
+ for(int i=0;i<8;i+=2){
+ double Zr1=Crb[x+i];
+ double Zi1=Cib[y];
+
+ double Zr2=Crb[x+i+1];
+ double Zi2=Cib[y];
+
+ int b=0;
+ int j=49;do{
+ double nZr1=Zr1*Zr1-Zi1*Zi1+Crb[x+i];
+ double nZi1=Zr1*Zi1+Zr1*Zi1+Cib[y];
+ Zr1=nZr1;Zi1=nZi1;
+
+ double nZr2=Zr2*Zr2-Zi2*Zi2+Crb[x+i+1];
+ double nZi2=Zr2*Zi2+Zr2*Zi2+Cib[y];
+ Zr2=nZr2;Zi2=nZi2;
+
+ if(Zr1*Zr1+Zi1*Zi1>4){b|=2;if(b==3)break;}
+ if(Zr2*Zr2+Zi2*Zi2>4){b|=1;if(b==3)break;}
+ }while(--j>0);
+ res=(res<<2)+b;
+ }
+ return res^-1;
+ }
+
+ static void putLine(int y, byte[] line){
+ for (int xb=0; xb<line.length; xb++)
+ line[xb]=(byte)getByte(xb*8,y);
+ }
+
+ public static void main(String[] args) throws Exception {
+ int N=6000;
+ if (args.length>=1) N=Integer.parseInt(args[0]);
+
+ Crb=new double[N+7]; Cib=new double[N+7];
+ double invN=2.0/N; for(int i=0;i<N;i++){ Cib[i]=i*invN-1.0; Crb[i]=i*invN-1.5; }
+ yCt=new AtomicInteger();
+ out=new byte[N][(N+7)/8];
+
+ Thread[] pool=new Thread[2*Runtime.getRuntime().availableProcessors()];
+ for (int i=0;i<pool.length;i++)
+ pool[i]=new Thread(){
+ public void run() {
+ int y; while((y=yCt.getAndIncrement())<out.length) putLine(y,out[y]);
+ }
+ };
+ for (Thread t:pool) t.start();
+ for (Thread t:pool) t.join();
+
+ OutputStream stream = new BufferedOutputStream(System.out);
+ stream.write(("P4\n"+N+" "+N+"\n").getBytes());
+ for(int i=0;i<N;i++) stream.write(out[i]);
+ stream.close();
+ }
+}
View
79 clojure-benchmarks-results/mandelbrot.java-6.java
@@ -1,79 +0,0 @@
-/* The Computer Language Benchmarks Game
- * http://shootout.alioth.debian.org/
- *
- * contributed by Stefan Krause
- * slightly modified by Chad Whipkey
- * parallelized by Colin D Bennett 2008-10-04
- * reduce synchronization cost by The Anh Tran
- * optimizations and refactoring by Enotus 2010-11-11
- */
-
-
-import java.io.*;
-import java.util.concurrent.atomic.AtomicInteger;
-
-public final class mandelbrot {
- static byte[][] out;
- static AtomicInteger yCt;
- static double[] Crb;
- static double[] Cib;
-
- static int getByte(int x, int y){
- double Ci=Cib[y];
- int res=0;
- for(int i=0;i<8;i+=2){
- double Zr1=Crb[x+i];
- double Zi1=Cib[y];
-
- double Zr2=Crb[x+i+1];
- double Zi2=Cib[y];
-
- int b=0;
- int j=49;do{
- double nZr1=Zr1*Zr1-Zi1*Zi1+Crb[x+i];
- double nZi1=Zr1*Zi1+Zr1*Zi1+Cib[y];
- Zr1=nZr1;Zi1=nZi1;
-
- double nZr2=Zr2*Zr2-Zi2*Zi2+Crb[x+i+1];
- double nZi2=Zr2*Zi2+Zr2*Zi2+Cib[y];
- Zr2=nZr2;Zi2=nZi2;
-
- if(Zr1*Zr1+Zi1*Zi1>4) b|=2;
- if(Zr2*Zr2+Zi2*Zi2>4) b|=1;
- if(b==3) break;
- }while(--j>0);
- res=(res<<2)+b;
- }
- return res^-1;
- }
-
- static void putLine(int y, byte[] line){
- for (int xb=0; xb<line.length; xb++)
- line[xb]=(byte)getByte(xb*8,y);
- }
-
- public static void main(String[] args) throws Exception {
- int N=6000;
- if (args.length>=1) N=Integer.parseInt(args[0]);
-
- Crb=new double[N+7]; Cib=new double[N+7];
- double invN=2.0/N; for(int i=0;i<N;i++){ Cib[i]=i*invN-1.0; Crb[i]=i*invN-1.5; }
- yCt=new AtomicInteger();
- out=new byte[N][(N+7)/8];
-
- Thread[] pool=new Thread[2*Runtime.getRuntime().availableProcessors()];
- for (int i=0;i<pool.length;i++)
- pool[i]=new Thread(){
- public void run() {
- int y; while((y=yCt.getAndIncrement())<out.length) putLine(y,out[y]);
- }
- };
- for (Thread t:pool) t.start();
- for (Thread t:pool) t.join();
-
- OutputStream stream = new BufferedOutputStream(System.out);
- stream.write(("P4\n"+N+" "+N+"\n").getBytes());
- for(int i=0;i<N;i++) stream.write(out[i]);
- stream.close();
- }
-}

0 comments on commit c8eeb34

Please sign in to comment.
Something went wrong with that request. Please try again.