Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  safa
Language: C/C++
Code:
#include <stdio.h>
#include <stdlib.h>

#include <time.h>

#ifndef N
#define N 16
#endif

struct Matrix {
  unsigned int height;
  unsigned int width;
  float** mat;
};

void init_matrix(unsigned int height, unsigned int width,
                 struct Matrix** const m);
void delete_matrix(struct Matrix** const m);
void randomize_matrix(struct Matrix* m);
void null_matrix(struct Matrix* m);
struct timespec time_difference(struct timespec const* const start,
                                struct timespec const* const end);

int main(void) {
  struct timespec time1, time2;
  struct Matrix* m1 = NULL;  // left hand side
  struct Matrix* m2 = NULL;  // right hand side
  struct Matrix* m3 = NULL;  // result
  struct Matrix* m4 = NULL;  // check

  init_matrix(N, N, &m1);
  init_matrix(N, N, &m2);
  init_matrix(N, N, &m3);
  randomize_matrix(m1);
  randomize_matrix(m2);
  null_matrix(m3);

  // Start time
  clock_gettime(CLOCK_REALTIME, &time1);
  // Multiplication
  for(unsigned int i = 0; i < m1->height; ++i) {
    for(unsigned int j = 0; j < m2->width; ++j) {
      for(unsigned int k = 0; k < m1->width; ++k) {
        m3->mat[i][j] += m1->mat[i][k] * m2->mat[k][j];
      }
    }
  }
  // End time
  clock_gettime(CLOCK_REALTIME, &time2);

  struct timespec time_diff = time_difference(&time1, &time2);
  printf("\nTime: (sec:nsec)\n");
  printf("  %ld:%ld\n\n", time_diff.tv_sec, time_diff.tv_nsec);

  // free memory
  delete_matrix(&m1);
  delete_matrix(&m2);
  delete_matrix(&m3);
  delete_matrix(&m4);

  return 0;
}

void init_matrix(unsigned int height, unsigned int width,
                 struct Matrix** const m) {
  *m = malloc(sizeof(struct Matrix));
  (*m)->height = height;
  (*m)->width = width;
  (*m)->mat = (float**)malloc(height * sizeof(float*));

  for(unsigned int i = 0; i < height; ++i) {
    (*m)->mat[i] = (float*)malloc(width * sizeof(float));
  }
}

void delete_matrix(struct Matrix** const m) {
  if(m != NULL && *m != NULL) {
    for(unsigned int i = 0; i < (*m)->height; ++i) {
      free((*m)->mat[i]);
    }
    free((*m)->mat);
    free(*m);
    *m = NULL;
  }
}

void randomize_matrix(struct Matrix* const m) {
  srand(clock());  // more random numbers

  for(unsigned int i = 0; i < m->height; ++i) {
    for(unsigned int j = 0; j < m->width; ++j) {
      m->mat[i][j] = ((float)rand()) / RAND_MAX;
    }
  }
}

void null_matrix(struct Matrix* const m) {
  for(unsigned int i = 0; i < m->height; ++i) {
    for(unsigned int j = 0; j < m->width; ++j) {
      m->mat[i][j] = 0;
    }
  }
}

struct timespec time_difference(struct timespec const* const start,
                                struct timespec const* const end) {
  struct timespec temp;

  if((end->tv_nsec - start->tv_nsec) < 0) {
    temp.tv_sec = end->tv_sec - start->tv_sec - 1;
    temp.tv_nsec = 1000000000 + end->tv_nsec - start->tv_nsec;
  } else {
    temp.tv_sec = end->tv_sec - start->tv_sec;
    temp.tv_nsec = end->tv_nsec - start->tv_nsec;
  }
  return temp;
}
Comments: