00001 /* 00002 * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 00003 * The President and Fellows of Harvard College. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the University nor the names of its contributors 00014 * may be used to endorse or promote products derived from this software 00015 * without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND 00018 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE 00021 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00022 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00023 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00024 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00025 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00026 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00027 * SUCH DAMAGE. 00028 */ 00029 00030 /* matmult.c 00031 * Test program to do matrix multiplication on large arrays. 00032 * 00033 * This version uses a storage-inefficient technique to get a 00034 * shorter running time for the same memory usage. 00035 * 00036 * Intended to stress virtual memory system. 00037 * 00038 * Once the VM system assignment is complete your system should be 00039 * able to survive this. 00040 */ 00041 00042 #include <unistd.h> 00043 #include <stdio.h> 00044 00045 #define Dim 72 /* sum total of the arrays doesn't fit in 00046 * physical memory 00047 */ 00048 00049 #define RIGHT 8772192 /* correct answer */ 00050 00051 int A[Dim][Dim]; 00052 int B[Dim][Dim]; 00053 int C[Dim][Dim]; 00054 int T[Dim][Dim][Dim]; 00055 00056 int 00057 main() 00058 { 00059 int i, j, k, r; 00060 00061 for (i = 0; i < Dim; i++) /* first initialize the matrices */ 00062 for (j = 0; j < Dim; j++) { 00063 A[i][j] = i; 00064 B[i][j] = j; 00065 C[i][j] = 0; 00066 } 00067 00068 for (i = 0; i < Dim; i++) /* then multiply them together */ 00069 for (j = 0; j < Dim; j++) 00070 for (k = 0; k < Dim; k++) 00071 T[i][j][k] = A[i][k] * B[k][j]; 00072 00073 for (i = 0; i < Dim; i++) 00074 for (j = 0; j < Dim; j++) 00075 for (k = 0; k < Dim; k++) 00076 C[i][j] += T[i][j][k]; 00077 00078 r = 0; 00079 for (i = 0; i < Dim; i++) 00080 r += C[i][i]; 00081 00082 printf("matmult finished.\n"); 00083 printf("answer is: %d (should be %d)\n", r, RIGHT); 00084 if (r != RIGHT) { 00085 printf("FAILED\n"); 00086 return 1; 00087 } 00088 printf("Passed.\n"); 00089 return 0; 00090 }