2 #==========================================================================
5 # Author : Christopher Batten (cbatten@mit.edu)
6 # Date : April 29, 2005
8 (our $usageMsg = <<'ENDMSG') =~ s/^\#//gm;
10 # Simple script which creates an input data set and the reference data
11 # for the matmul benchmark.
20 #--------------------------------------------------------------------------
21 # Command line processing
22 #--------------------------------------------------------------------------
30 print " Usage: matmul_gendata.pl [options] \n";
33 print " --help print this message\n";
34 print " --size size of input data [1000]\n";
35 print " --seed random seed [1]\n";
41 sub processCommandLine
()
47 Getopt
::Long
::GetOptions
( \
%opts, 'help|?', 'size:i', 'seed:i' ) or usage
();
48 $opts{"help"} and usage
();
52 #--------------------------------------------------------------------------
54 #--------------------------------------------------------------------------
58 my $arrayName = $_[0];
62 my $arrayLen = scalar(@
{$arrayRef});
64 print "static data_t ".$arrayName."[ARRAY_SIZE] = \n";
67 if ( $arrayLen <= $numCols ) {
69 for ( my $i = 0; $i < $arrayLen; $i++ ) {
70 print sprintf("%3d",$arrayRef->[$i]);
71 if ( $i != $arrayLen-1 ) {
79 my $numRows = int($arrayLen/$numCols);
80 for ( my $j = 0; $j < $numRows; $j++ ) {
82 for ( my $i = 0; $i < $numCols; $i++ ) {
83 my $index = $j*$numCols + $i;
84 print sprintf("%3d",$arrayRef->[$index]);
85 if ( $index != $arrayLen-1 ) {
92 if ( $arrayLen > ($numRows*$numCols) ) {
94 for ( my $i = 0; $i < ($arrayLen-($numRows*$numCols)); $i++ ) {
95 my $index = $numCols*$numRows + $i;
96 print sprintf("%3d",$arrayRef->[$index]);
97 if ( $index != $arrayLen-1 ) {
111 #--------------------------------------------------------------------------
113 #--------------------------------------------------------------------------
115 # http://answers.oreilly.com/topic/418-how-to-multiply-matrices-in-perl/
119 my ($m1rows,$m1cols) = matdim
($m1);
120 my ($m2rows,$m2cols) = matdim
($m2);
125 for $i (range
($m1rows)) {
126 for $j (range
($m2cols)) {
127 for $k (range
($m1cols)) {
128 $result->[$i][$j] += $m1->[$i][$k] * $m2->[$k][$j];
135 sub range
{ 0 .. ($_[0] - 1) }
140 my $type = ref $ary_ref;
141 if ($type ne "ARRAY") { die "$type is bad array ref for $ary_ref" }
142 return scalar(@
$ary_ref);
147 my $rows = veclen
($matrix);
148 my $cols = veclen
($matrix->[0]);
149 return ($rows, $cols);
152 #--------------------------------------------------------------------------
154 #--------------------------------------------------------------------------
159 processCommandLine
();
160 srand($opts{"seed"});
162 # create random input arrays
165 for ( my $i = 0; $i < $opts{"size"}; $i++ ) {
166 for ( my $j = 0; $j < $opts{"size"}; $j++ ) {
167 $mat_values1->[$i][$j] = int(rand(4));
168 $mat_values2->[$i][$j] = int(rand(4));
173 my $mat_results = mmult
( $mat_values1, $mat_values2 );
175 # translate 2d arrays to 1d-somethings (I don't know how to code in perl - Chris)
179 for ( my $i = 0; $i < $opts{"size"}; $i++ ) {
180 for ( my $j = 0; $j < $opts{"size"}; $j++ ) {
181 my $value1 = $mat_values1->[$i][$j];
182 my $value2 = $mat_values2->[$i][$j];
183 my $result = $mat_results->[$i][$j];
184 push( @values1, $value1 );
185 push( @values2, $value2 );
186 push( @results, $result );
190 print "\n#ifndef __DATASET_H";
191 print "\n#define __DATASET_H";
192 print "\n\#define ARRAY_SIZE ".($opts{"size"}*$opts{"size"})." \n\n";
193 print "\n\#define DIM_SIZE ".$opts{"size"}." \n\n";
194 print "\ntypedef double data_t;";
196 printArray
( "input1_data", \
@values1 );
197 printArray
( "input2_data", \
@values2 );
198 printArray
( "verify_data", \
@results);
200 print "\n#endif //__DATASET_H";