package rootbeer.examples.gtc2013; public class MatrixCpuThread implements Runnable { private float[] m_a; private float[] m_b; private float[] m_c; private int m_index; private int m_blockSize; private int m_gridSize; private int m_numCores; private Thread m_thread; private boolean m_transpose; public MatrixCpuThread(float[] a, float[] b, float[] c, int index, int block_size, int grid_size, int num_cores, boolean transpose){ m_a = a; m_b = b; m_c = c; m_index = index; m_blockSize = block_size; m_gridSize = grid_size; m_numCores = num_cores; m_transpose = transpose; m_thread = new Thread(this); m_thread.setDaemon(true); m_thread.start(); } //see: http://blog.ryanrampersad.com/2010/01/matrix-multiplication-in-java/ @Override public void run(){ int num_each = m_blockSize / m_numCores; int start_row = m_index * num_each; int stop_row = (m_index + 1) * num_each; if(m_index == m_numCores - 1){ stop_row = m_blockSize; } int b_columns = m_blockSize * m_gridSize; int a_columns = m_blockSize; for(int i = start_row; i < stop_row; ++i){ for(int j = 0; j < b_columns; ++j){ float sum = 0; int dest_index = i*b_columns+j; for(int k = 0; k < a_columns; ++k){ int a_src = i*a_columns+k; int b_src; if(m_transpose){ b_src = j*a_columns+k; } else { b_src = k*b_columns+j; } float a_value = m_a[a_src]; float b_value = m_b[b_src]; sum += a_value * b_value; } m_c[dest_index] = sum; } } } public void join(){ try { m_thread.join(); } catch(Exception ex){ ex.printStackTrace(); } } }