/*
* Copyright (C) 2014 - Martin Berger
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.conrad.data.generic.complex;
import java.io.InputStream;
import java.nio.FloatBuffer;
import com.jogamp.opencl.CLBuffer;
import com.jogamp.opencl.CLDevice;
import edu.stanford.rsl.conrad.data.generic.datatypes.Complex;
import edu.stanford.rsl.conrad.data.generic.opencl.OpenCLGenericGridInterface;
import edu.stanford.rsl.conrad.data.generic.opencl.OpenCLGenericGridOperators;
public class OpenCLComplexGridOperator extends OpenCLGenericGridOperators<Complex> implements ComplexGridOperatorInterface{
static OpenCLComplexGridOperator op = new OpenCLComplexGridOperator();
public static OpenCLComplexGridOperator getInstance() {
return op;
}
@Override
protected InputStream getProgramFileAsStream() {
return OpenCLComplexGridOperator.class.getResourceAsStream("PointwiseOperators.cl");
}
public void conj(final ComplexGrid grid) {
if (debug) System.out.println("Bei OpenCL conj");
// not possible to have a grid that is not implementing OpenCLGenericGridInterface<T>
OpenCLGenericGridInterface<Complex> clGrid = (OpenCLGenericGridInterface<Complex>)grid;
CLDevice device = clGrid.getDelegate().getCLDevice();
clGrid.getDelegate().prepareForDeviceOperation();
CLBuffer<FloatBuffer> clmem = clGrid.getDelegate().getCLBuffer();
runUnaryKernelNoReturn("conj", device, clmem, grid.getNumberOfElements());
clGrid.getDelegate().notifyDeviceChange();
}
@Override
public void abs(final ComplexGrid grid) {
if (debug) System.out.println("Bei OpenCL abs");
// not possible to have a grid that is not implementing OpenCLGenericGridInterface<T>
OpenCLGenericGridInterface<Complex> clGrid = (OpenCLGenericGridInterface<Complex>)grid;
CLDevice device = clGrid.getDelegate().getCLDevice();
clGrid.getDelegate().prepareForDeviceOperation();
CLBuffer<FloatBuffer> clmem = clGrid.getDelegate().getCLBuffer();
runUnaryKernelNoReturn("absolute", device, clmem, grid.getNumberOfElements());
clGrid.getDelegate().notifyDeviceChange();
}
@Override
public Complex getSum(CLBuffer<FloatBuffer> clRes) {
Complex res = new Complex();
int n = clRes.getCLCapacity()/2;
for (int i = 0; i < n; i++) {
res = res.add(new Complex(clRes.getBuffer().get(i*2),clRes.getBuffer().get(i*2+1)));
}
return res;
}
@Override
public Complex getMin(CLBuffer<FloatBuffer> clRes) {
Complex res = new Complex(Double.POSITIVE_INFINITY,Double.POSITIVE_INFINITY);
int n = clRes.getCLCapacity()/2;
for (int i = 0; i < n; i++) {
Complex val = new Complex(clRes.getBuffer().get(i*2),clRes.getBuffer().get(i*2+1));
res = (val.compareTo(res) < 0) ? val : res;
}
return res;
}
@Override
public Complex getMax(CLBuffer<FloatBuffer> clRes) {
Complex res = new Complex(0,0);
int n = clRes.getCLCapacity()/2;
for (int i = 0; i < n; i++) {
Complex val = new Complex(clRes.getBuffer().get(i*2),clRes.getBuffer().get(i*2+1));
res = (val.compareTo(res) > 0) ? val : res;
}
return res;
}
}