package com.nativelibs4java.opencl; import static com.nativelibs4java.opencl.JavaCL.listPlatforms; import java.nio.Buffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import org.bridj.*; import static org.bridj.Pointer.*; /** * @author ochafik */ public class CLTestUtils { public enum Target { CPU, GPU, CPU_GPU; } public static interface Action1<X> { void call(X x); } public static interface Action2<X, Y> { void call(X x, Y y); } public static interface Action3<X, Y, Z> { void call(X x, Y y, Z z); } /// Calculate the average relative error of operations between two result buffers public static double avgError(FloatBuffer a, Pointer<Float> b, int dataSize) { double tot = 0; for (int i = 0; i < dataSize; i++) { float va = a.get(i), vb = b.get(i); float d = va - vb; if (Float.isNaN(d)) d = d + 0; if (d < 0) d = -d; float m = (va + vb) / 2; if (m == 0) continue; double r = d / (double)m; tot += r; } return tot / dataSize; } public static double avgError(DoubleBuffer a, Pointer<Double> b, int dataSize) { double tot = 0; for (int i = 0; i < dataSize; i++) { double va = a.get(i), vb = b.get(i); double d = va - vb; if (Double.isNaN(d)) d = d + 0; if (d < 0) d = -d; double m = (va + vb) / 2; if (m == 0) continue; double r = d / (double)m; tot += r; } return tot / dataSize; } public static void fillBuffersWithSomeDataf(FloatBuffer a, FloatBuffer b) { fillBuffersWithSomeDataf((Pointer<Float>)pointerToBuffer(a), (Pointer<Float>)pointerToBuffer(b)); } public static void fillBuffersWithSomeDatad(DoubleBuffer a, DoubleBuffer b) { fillBuffersWithSomeDatad((Pointer<Double>)pointerToBuffer(a), (Pointer<Double>)pointerToBuffer(b)); } public static void fillBuffersWithSomeDataf(Pointer<Float> a, Pointer<Float> b) { int s = (int)a.getValidElements(); for (int i = 0; i < s; i++) { float v = i; a.set(i, v); b.set(i, v); } } public static void fillBuffersWithSomeDatad(Pointer<Double> a, Pointer<Double> b) { int s = (int)a.getValidElements(); for (int i = 0; i < s; i++) { double v = i; a.set(i, v); b.set(i, v); } } public static CLDevice[] getDevices(Target target) { CLPlatform platform = listPlatforms()[0]; switch (target) { case CPU: return platform.listCPUDevices(true); case GPU: return platform.listGPUDevices(true); case CPU_GPU: return platform.listAllDevices(true); default: throw new IllegalArgumentException("Unknown target : " + target); } } public static class ExecResult<B> { public B buffer; public double unitTimeNano; public ExecResult(B buffer, double unitTimeNano) { this.buffer = buffer; this.unitTimeNano = unitTimeNano; } } }