#!/usr/bin/perl

$double  = 1;
$complex = 1;
$matrix  = 1000;

$min_array =   0;
$max_array = 512;
$count     = 2;

sub benchmark{
    local $prog    = $_[0];
    local $block_p = $_[1];
    local $block_q = $_[2];
    local $block_r = $_[3];
    local $mflops;
    local $i;
    local $tmp, $max;

    `make SIMPLE=-DSIMPLE BLOCK_P=$block_p BLOCK_Q=$block_q BLOCK_R=$block_r $prog`;

    $mflops = 0;
    for($i=0;$i<$count;$i++){
	$mflops += `$prog $matrix $matrix 0 $params 1`;
    }

    return $mflops / $count;
}       

if ($complex){
    if ($double){$target = "bmz";} else {$target = "bmc";};
    $params = "3.00 2.00 1.00 0.00";
}else{
    if ($double){$target = "bmd";} else {$target = "bms";};
    $params = "3.00 0.00";
}

if ($double) { $size = 8;} else {$size = 4;};
if ($complex) { $size = $size * 2;};

`make clean`;

$max = 0;

for ($p = 16; $p <= 120; $p += 4){
    for ($q = 120; $q < 420; $q += 4){
	for ($r = 120; $r < 420; $r += 4){
	    
	    $q = $r;

	    $array_a = $p * $q * $size;
	    $array_b = $q * $r * $size;
	    $array_size = (($array_a + $array_b) >> 10);

	    if (($array_size > $min_array) && ($array_size < $max_array)){
		printf STDERR ("%3d %3d %3d :", $p, $q, $r);
		printf STDERR ("%5d + %5d =  %5d : ",
			       ($array_a>>10), ($array_b>>10), 
			       ($array_a+$array_b)>>10);
		`rm -f zgemm_nn.o` if ( $complex &&  $double);
		`rm -f cgemm_nn.o` if ( $complex && !$double);
		`rm -f dgemm_nn.o` if (!$complex &&  $double);
		`rm -f sgemm_nn.o` if (!$complex && !$double);
		
		$mflops =  &benchmark($target, $p, $q, $r);
		printf STDERR "%9.3f\n", $mflops;
		$max = $mflops if ($mflops > $max);
	    }
	}
    }
}

printf STDERR "MAX = $max MFLOPS\n";

`make clean`;
