Newer
Older
/*
* A Serial implementation of the Matrix-Vector multiplication
*
* Author: Petros Anastasiadis(panastas@cslab.ece.ntua.gr)
*/
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Need to include External_Functions for these */
#include "matrix_op.h"
#include "util.h"
#include "input.h"
int main(int argc, char **argv)
{
/* Initializations */
int i, j, k, n, m;
int *I, *cooCol, n_z, sparse=0;
double *cooVal, timer;
if (argc < 2) error("Too few Arguments");
else if ( argc == 2) /* ./Program Input_File -> File Input to COO */
{
if(!mtx_read(&I, &cooCol, &cooVal, &n, &m, &n_z, argv[1])) error("input and/or COO convertion failed");
sparse = 1;
}
else if ( argc == 3) { /*./Program N M -> Generate random NxM matrix */
n = atoi(argv[1]);
m = atoi(argv[2]);
}
else error("Too many Arguments");
/* Allocate space */
double *x = (double *) malloc(m * sizeof(*x));
for( i=0 ; i<n ; ++i) M[i] = (double *) calloc(m, sizeof(double));
if( !y || !x || !M ) error("memory allocation failed");
/* Initialize matrices */
if (sparse) {
regenerate_matrix_coo(M, I, cooCol, cooVal, n, m, n_z); /* Sparse matrices read from .mtx format */
}
else matrix_init_rand(M,n,m,1.0); /* Normal matrices generated randomly */
/* Initialize vectors */
vec_init_rand(x, m, 1.0);
vec_init(y, n, 0.0);
/* Serial Kernel */
printf("Serial Version(N=%d, M=%d): ", n, m);
timer = csecond();
for (i = 0; i < NR_ITER; ++i){
register double yi;
for (k = 0; k < n; ++k) {
yi = 0.0 ;
for (j = 0; j < m; ++j) yi += M[k][j]*x[j];
y[k] = yi;
}
}
timer = csecond() - timer ;
/* Output y vector to a file for debugging */
FILE * fp;
char filename[] = "Serial.debug" ;
if(( fp = fopen( filename, "w")) == NULL) error("Output file creation failed\n");
for (k = 0; k < n; ++k) fprintf(fp, "%lf ", y[k]) ;
fclose(fp) ;