// Quick and dirty timings for various implementations of the matrix sum
// S = A + B. Based on code given in Considering Recursion by Arch Robison,
// Dr. Dobb's Journal, March 2000.
//
// CS 306, Computer Algorithms II
// Fall 2008
#include "episode-timer.h"
static void
matrix_sum_loop(
double s[], double a[], double b[], unsigned, unsigned, unsigned n) {
for (unsigned r = 0; r < n; r++)
for (unsigned c = 0; c < n; c++)
s[r*n + c] = a[r*n + c] + b[r*n + c]
}
static void col_by_col(
double [], double [], double [], unsigned, unsigned, unsigned)
static void
row_by_row(
double s[], double a[], double b[], unsigned r, unsigned, unsigned n) {
if (r < n) {
col_by_col(s, a, b, r, 0, n)
row_by_row(s, a, b, r + 1, 0, n)
}
}
static void
col_by_col(
double s[], double a[], double b[], unsigned r, unsigned c, unsigned n) {
if (c < n) {
s[r*n + c] = a[r*n +c] + b[r*n +c]
col_by_col(s, a, b, r, c + 1, n)
}
}
static void
matrix_sum_recursive(
double s[], double a[], double b[], unsigned r, unsigned c, unsigned n) {
if (n == 1)
s[r*n + c] = a[r*n + c] + b[r*n + c]
else {
n /= 2
matrix_sum_recursive(s, a, b, r, c, n)
matrix_sum_recursive(s, a, b, r + n, c, n)
matrix_sum_recursive(s, a, b, r, c + n, n)
matrix_sum_recursive(s, a, b, r + n, c + n, n)
}
}
typedef void (* sumfun)(double [], double [], double [], unsigned, unsigned, unsigned)
static void
time(sumfun f, unsigned n, unsigned i, const char * const name) {
double
* s = new double[n*n],
* a = new double[n*n],
* b = new double[n*n]
episode_timer et
f(s, a, b, 0, 0, n)
for (unsigned j = 0; j < i; j++) {
et.start()
f(s, a, b, 0, 0, n)
et.stop()
}
printf("%11s %9u usec total, %4.2g sec/sum (%4.2g).\n",
name, et.total(), et.average()/1000000, et.stddev())
}
int main() {
unsigned
n = 1 << 11,
i = 10
time(matrix_sum_loop, n, i, "loop")
time(row_by_row, n, i, "2 recursive")
time(matrix_sum_recursive, n, i, "1 recursive")
}
// $Log: matrix-sums.cc,v $
// Revision 1.1 2007-09-23 15:24:20 rclayton
// Created.
//
syntax highlighted by Code2HTML, v. 0.9.1