package tutorial; import com.nativelibs4java.opencl.*; import java.io.IOException; import java.nio.DoubleBuffer; import org.bridj.Pointer; public class DFT2 { final CLQueue queue; final CLContext context; final DiscreteFourierTransformProgram program; public DFT2(CLQueue queue) throws IOException, CLBuildException { this.queue = queue; this.context = queue.getContext(); this.program = new DiscreteFourierTransformProgram(context); } public synchronized Pointer<Double> dft(Pointer<Double> in, boolean forward) throws CLBuildException { assert in.getValidElements() % 2 == 0; int length = (int)in.getValidElements() / 2; CLBuffer<Double> inBuf = context.createDoubleBuffer(CLMem.Usage.Input, in, true); // true = copy CLBuffer<Double> outBuf = context.createDoubleBuffer(CLMem.Usage.Output, length * 2); // The following call is type-safe, thanks to the JavaCL Maven generator : // (if the OpenCL function signature changes, the generated Java definition will be updated and compilation will fail) CLEvent dftEvt = program.dft(queue, inBuf, outBuf, length, forward ? 1 : -1, new int[]{length}, null); return outBuf.read(queue, dftEvt); } public double[] dft(double[] complexValues, boolean forward) throws CLBuildException { Pointer<Double> outBuffer = dft(Pointer.pointerToDoubles(complexValues), forward); return outBuffer.getDoubles(); } }