package org.trifort.rootbeer.testcases.rootbeertest.kerneltemplate;
import org.trifort.rootbeer.runtime.Kernel;
import org.trifort.rootbeer.runtime.RootbeerGpu;
public class GpuVectorMapRunOnGpu2 implements Kernel {
public GpuVectorMap2 m_map;
public GpuVectorMapRunOnGpu2(GpuVectorMap2 map) {
this.m_map = map;
}
@Override
public void gpuMethod() {
int thread_idxx = RootbeerGpu.getThreadIdxx();
int block_idxx = RootbeerGpu.getBlockIdxx();
// Setup sharedMemory from Map
if (thread_idxx == 0) {
double[] vector = m_map.get(block_idxx);
debug(block_idxx, vector); // TODO Error
for (int i = 0; i < vector.length; i++) {
RootbeerGpu.setSharedDouble(i * 8, vector[i]);
// System.out.println(vector[i]);
}
}
RootbeerGpu.syncthreads();
// Each kernel increments one item
double val = RootbeerGpu.getSharedDouble(thread_idxx * 8);
RootbeerGpu.setSharedDouble(thread_idxx * 8, val + 1);
RootbeerGpu.syncthreads();
// Put sharedMemory back into Map
if (thread_idxx == 0) {
double[] vector = new double[RootbeerGpu.getBlockDimx()];
for (int i = 0; i < vector.length; i++) {
vector[i] = RootbeerGpu.getSharedDouble(i * 8);
}
m_map.put(block_idxx, vector);
}
}
private synchronized void debug(int val, double[] arr) {
int x = arr.length; // ERROR arr.length sets array values to 0
// System.out.print("(");
// System.out.print(val);
// System.out.print(",");
// if (arr != null) {
// for (int i = 0; i < arr.length; i++) {
// System.out.print(Double.toString(arr[i]));
// if (i + 1 < arr.length) {
// System.out.print(",");
// }
// }
// }
// System.out.println(")");
}
}