Index: src/tests/.expect/matrixSum.txt
===================================================================
--- src/tests/.expect/matrixSum.txt	(revision b8a17e276abd20bf0c3fbed4862d4fdbf625bfe0)
+++ src/tests/.expect/matrixSum.txt	(revision b8a17e276abd20bf0c3fbed4862d4fdbf625bfe0)
@@ -0,0 +1,1 @@
+10000
Index: src/tests/matrixSum.c
===================================================================
--- src/tests/matrixSum.c	(revision b8a17e276abd20bf0c3fbed4862d4fdbf625bfe0)
+++ src/tests/matrixSum.c	(revision b8a17e276abd20bf0c3fbed4862d4fdbf625bfe0)
@@ -0,0 +1,42 @@
+#include <fstream>
+#include <kernel>
+#include <thread>
+
+thread Adder {
+    int * row, cols, * subtotal;			// communication
+};
+
+void ?{}( Adder & adder, int row[], int cols, int & subtotal ) {
+    adder.row = row;
+    adder.cols = cols;
+    adder.subtotal = &subtotal;
+}
+
+void main( Adder & adder ) {
+    *adder.subtotal = 0;
+    for ( int c = 0; c < adder.cols; c += 1 ) {
+	*adder.subtotal += adder.row[c];
+    } // for
+}
+
+int main() {
+    const int rows = 10, cols = 1000;
+    int matrix[rows][cols], subtotals[rows], total = 0;
+    processor p;					// extra kernel thread
+
+    for ( int r = 0; r < rows; r += 1 ) {
+	for ( int c = 0; c < cols; c += 1 ) {
+	    matrix[r][c] = 1;
+	} // for
+    } // for
+    Adder * adders[rows];
+    for ( int r = 0; r < rows; r += 1 ) {		// start threads to sum rows
+	adders[r] = &(*malloc()){ matrix[r], cols, subtotals[r] };
+//	adders[r] = new( matrix[r], cols, &subtotals[r] );
+    } // for
+    for ( int r = 0; r < rows; r += 1 ) {		// wait for threads to finish
+	delete( adders[r] );
+	total += subtotals[r];				// total subtotals
+    } // for
+    sout | total | endl;
+}
