Skip to content
Serial.c 1.63 KiB
Newer Older
petros.anastasiadis's avatar
petros.anastasiadis committed
/*
 * 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"
petros.anastasiadis's avatar
petros.anastasiadis committed

int main(int argc, char **argv)
{
	/* Initializations */
	int i, j, k, n, m;
	double timer;
petros.anastasiadis's avatar
petros.anastasiadis committed

	if (argc < 3) error("Usage: ./Program N M");
	else if ( argc == 3) { /*./Program N M */
petros.anastasiadis's avatar
petros.anastasiadis committed
		n = atoi(argv[1]);
		m = atoi(argv[2]);		
	}
	else error("Too many Arguments");
petros.anastasiadis's avatar
petros.anastasiadis committed
	
	/* Allocate space */
	double *x 	= (double *) malloc(m * sizeof(*x));
petros.anastasiadis's avatar
petros.anastasiadis committed
	double *y	= (double *) malloc(n * sizeof(*y));
petros.anastasiadis's avatar
petros.anastasiadis committed
	double **M 	= (double **) malloc(n * sizeof(*M));
petros.anastasiadis's avatar
petros.anastasiadis committed
	for( i=0 ; i<n ; ++i) M[i] = (double *) calloc(m, sizeof(double));
	if( !y || !x || !M ) error("memory allocation failed");

	/* Initialize matrices */
	matrix_init_rand(M,n,m,1.0); /* Normal matrices generated randomly */
petros.anastasiadis's avatar
petros.anastasiadis committed

	/* 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 ;
petros.anastasiadis's avatar
petros.anastasiadis committed
#ifdef _DEBUG_
petros.anastasiadis's avatar
petros.anastasiadis committed
	/* Output y vector to a file for debugging */
	FILE * fp;
	char filename[] = "Serial.debug" ;
petros.anastasiadis's avatar
petros.anastasiadis committed
	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) ;
petros.anastasiadis's avatar
petros.anastasiadis committed
#endif
petros.anastasiadis's avatar
petros.anastasiadis committed
	report_results(timer);

	return 0;
}