/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.nativelibs4java.opencl.demos.random;
import com.nativelibs4java.opencl.util.ParallelRandom;
import com.nativelibs4java.opencl.CLBuildException;
import com.nativelibs4java.opencl.CLContext;
import com.nativelibs4java.opencl.CLEvent;
import com.nativelibs4java.opencl.CLBuffer;
import com.nativelibs4java.opencl.CLMem.MapFlags;
import com.nativelibs4java.opencl.CLMem.Usage;
import com.nativelibs4java.opencl.CLQueue;
import com.nativelibs4java.opencl.JavaCL;
import java.io.IOException;
import java.nio.ByteOrder;
import org.bridj.Pointer;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author ochafik
*/
public class ParallelRandomDemo {
private static void println(Pointer<Integer> b) {
for (int i = 0, n = (int)b.getValidElements(); i < n; i++) {
if (i > 0)
System.out.print(", ");
System.out.print(b.get(i));
if (i > 32)
System.out.print("...");
}
System.out.println();
}
static class Stat {
long total;
long times;
boolean skippedFirst;
void add(long value) {
if (!skippedFirst) {
skippedFirst = true;
return;
}
total += value;
times++;
}
long average() {
return times == 0 ? 0 : total / times;
}
}
public static void main(String[] args) {
try {
CLContext context = JavaCL.createBestContext();
CLQueue queue = context.createDefaultQueue();
int warmupSize = 16;
ParallelRandom demo = new ParallelRandom(queue, warmupSize, System.currentTimeMillis());
println(demo.getSeeds().read(queue));
Pointer<Integer> b = demo.next();
println(b);
b = demo.next();
println(b);
b = demo.next();
println(b);
gc();
long start = System.nanoTime();
int loops = 2800;
Random random = new Random();
int res = 0;
for (int i = loops; i-- != 0;) {
//demo.next(b);
//demo.next();
demo.doNext();
res |= random.nextInt();
}
demo.getQueue().finish();
long time = System.nanoTime() - start;
System.err.println("Warmup took " + time + " ns");
Stat stat;
int testSize = 1024 * 1024;//1024 * 1024;
int testLoops = 10;
System.err.println("n = " + testSize);
demo = new ParallelRandom(queue, testSize, System.currentTimeMillis());
b = demo.next();
gc();
stat = new Stat();
for (int iTest = 0; iTest < testLoops; iTest++) {
start = System.nanoTime();
//b = demo.next();//b);
demo.doNext();
demo.getQueue().finish();
time = System.nanoTime() - start;
stat.add(time);
//System.err.println("[OpenCL] Cost per random number = " + (time / (double)testSize) + " ns");
}
long avgCL = stat.average();
System.err.println("[OpenCL] Avg Cost per random number = " + (stat.average() / (double)testSize) + " ns");
System.err.println();
gc();
stat = new Stat();
for (int iTest = 0; iTest < testLoops; iTest++) {
start = System.nanoTime();
for (int i = testSize; i-- != 0;)
res |= random.nextInt();
time = System.nanoTime() - start;
stat.add(time);
//System.err.println("[Random.nextInt()] Cost per random number = " + (time / (double)testSize) + " ns");
}
long avgJava = stat.average();
System.err.println("[Random.nextInt()] Avg Cost per random number = " + (stat.average() / (double)testSize) + " ns");
System.err.println();
double timesCLFasterThanJava = avgJava / (double)avgCL;
System.err.println("Java / CL (avg) = " + timesCLFasterThanJava);
System.err.println(res); // make sure no brutal optimization happens
System.err.println(b.get(0)); // make sure no brutal optimization happens
//println(b);
} catch (IOException ex) {
Logger.getLogger(ParallelRandom.class.getName()).log(Level.SEVERE, null, ex);
}
}
static void gc() {
try {
System.gc();
Thread.sleep(200);
System.gc();
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(ParallelRandom.class.getName()).log(Level.SEVERE, null, ex);
}
}
}