package turtlekit.cuda;
import java.nio.FloatBuffer;
import jcuda.Pointer;
import jcuda.driver.CUdeviceptr;
public class CudaAverageField implements CudaObject {
//TODO ADD UN TABLEAU POUR LES RESULTATS !!!!!!!!!
final int width, height;
private FloatBuffer values;
private FloatBuffer result;
CUdeviceptr valuesPtr;
CUdeviceptr resultPtr;
CudaKernel averageComputation;
private Pointer valuesPinnedMemory;
private Pointer resultPinnedMemory;
private KernelConfiguration kernelConfiguration;
private Pointer widthPtr;
private Pointer heightPtr;
private Pointer dataGridPtr;
private Pointer resultGridPtr;
private Pointer depthPtr;
public CudaAverageField(String name, int width, int height, int depth, float[] valuesAverage) {
widthPtr = getPointerToInt(width);
heightPtr = getPointerToInt(height);
depthPtr = getPointerToInt(depth);
this.width = width;
this.height = height;
valuesPtr = new CUdeviceptr();
valuesPinnedMemory = new Pointer();
values = (FloatBuffer) getUnifiedBufferBetweenPointer(valuesPinnedMemory, valuesPtr, Float.class);
dataGridPtr = Pointer.to(valuesPinnedMemory);
resultPtr = new CUdeviceptr();
resultPinnedMemory = new Pointer();
result = (FloatBuffer) getUnifiedBufferBetweenPointer(resultPinnedMemory, resultPtr,Float.class);
resultGridPtr = Pointer.to(resultPinnedMemory);
initFunctions();
}
private void initValues(float[] valuesAverage) {
values.rewind();
result.rewind();
for (float f : valuesAverage) {
values.put(f);
result.put(0);
}
}
/**
* @return the width
*/
public int getWidth() {
return width;
}
/**
* @return the height
*/
public int getHeight() {
return height;
}
/**
* @return the values
*/
public FloatBuffer getValues() {
return values;
}
/**
* @param values the values to set
*/
public void setValues(FloatBuffer values) {
this.values = values;
}
public float get(int index) {
return values.get(index);
}
public float getResult(int index) {
return result.get(index);
}
public void set(int index, float value) {
values.put(index, value);
}
protected void initFunctions() {
kernelConfiguration = getNewKernelConfiguration();
averageComputation = getCudaKernel("AVERAGE_DEPTH_1D_V2", "/turtlekit/cuda/kernels/Average_2D.cu", kernelConfiguration);
}
public void computeAverage(){
averageComputation.run(
widthPtr,
heightPtr,
dataGridPtr,
resultGridPtr,
depthPtr
);
}
@Override
public void freeMemory() {
freeCudaMemory(valuesPtr);
freeCudaMemory(resultPtr);
}
}