gem5/tests/test-progs/matrix-mult/mm.cpp

81 lines
1.8 KiB
C++

#include <iomanip>
#include <iostream>
#include <random>
#include "../../../util/m5/m5op.h"
#define BLOCK_SIZE 16
using namespace std;
void multiply(double **A, double **B, double **C, int size)
{
for (int k = 0; k < size; k += BLOCK_SIZE) {
for (int j = 0; j < size; j += BLOCK_SIZE) {
for (int i = 0; i < size; i++) {
for (int jj = j; jj < min(j + BLOCK_SIZE, size); jj++) {
for (int kk = k; kk < min(k + BLOCK_SIZE, size); kk++) {
C[i][jj] += A[i][kk] * B[kk][jj];
}
}
}
}
}
}
void printMatrix(double **A, int size)
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
cout << setprecision(3) << setw(8) << A[i][j] << " ";
}
cout << endl;
}
}
int main(int argc, char *argv[])
{
int size = 128;
cout << "Initalizing the matricies...";
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dis(0, 1);
double *dataA = new double[size*size];
double *dataB = new double[size*size];
double *dataC = new double[size*size];
double **A = new double*[size];
double **B = new double*[size];
double **C = new double*[size];
for (int i = 0; i < size; i++) {
A[i] = &dataA[size * i];
B[i] = &dataB[size * i];
C[i] = &dataC[size * i];
for (int j = 0; j < size; j++) {
A[i][j] = dis(gen);
B[i][j] = dis(gen);
C[i][j] = 0;
}
}
cout << "Done." << endl;
cout << "Beginning multiply...";
multiply(A, B, C, size);
cout << "Done." << endl;
delete[] A;
delete[] B;
delete[] C;
delete[] dataA;
delete[] dataB;
delete[] dataC;
}