package org.trifort.rootbeer.testcases.rootbeertest.kerneltemplate;
/*
* Copyright 2012 Phil Pratt-Szeliga and other contributors
* http://chirrup.org/
*
* See the file LICENSE for copying permission.
*/
import org.trifort.rootbeer.runtime.Kernel;
import org.trifort.rootbeer.runtime.RootbeerGpu;
public class MatrixKernel implements Kernel {
private int[] m_a;
private int[] m_b;
private int[] m_c;
private int m_blockSize;
private int m_gridSize;
public MatrixKernel(int[] a, int[] b, int[] c, int block_size, int grid_size){
m_a = a;
m_b = b;
m_c = c;
m_blockSize = block_size;
m_gridSize = grid_size;
}
public void gpuMethod(){
int block_idxx = RootbeerGpu.getBlockIdxx();
int thread_idxx = RootbeerGpu.getThreadIdxx();
int b_columns = m_blockSize * m_gridSize;
int a_columns = m_blockSize;
int i = thread_idxx;
int j = block_idxx;
int sum = 0;
for(int k = 0; k < a_columns; ++k){
sum += m_a[i*a_columns+k] + m_b[k*b_columns+j];
}
m_c[i*b_columns+j] = sum;
//RootbeerGpu.setSharedFloat((row*block_size) + col, m_a[row*block_size]);
}
public boolean compare(MatrixKernel rhs) {
int[] lhs_c = m_c;
int[] rhs_c = rhs.m_c;
if(lhs_c.length != rhs_c.length){
System.out.println("length");
return false;
}
for(int i = 0; i < lhs_c.length; ++i){
int lhs_value = lhs_c[i];
int rhs_value = rhs_c[i];
if(lhs_value != rhs_value){
System.out.println("m_c");
System.out.println("lhs_value: "+lhs_value);
System.out.println("rhs_value: "+rhs_value);
System.out.println("index: "+i);
return false;
}
}
return true;
}
}