| #!/usr/bin/env bash |
| # Copyright 2009 The Go Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file. |
| |
| set -e |
| |
| eval $(go tool dist env) |
| GC="go tool compile" |
| LD="go tool link" |
| |
| gccm="" |
| case "$O" in |
| 8) |
| gccm=-m32;; |
| 6) |
| gccm=-m64;; |
| esac |
| |
| EXE="out" |
| havepcre=true |
| haveglib=true |
| havegmp=true |
| case "$(uname)" in |
| *MINGW* | *WIN32* | *CYGWIN*) |
| havepcre=false |
| haveglib=false |
| havegmp=false |
| if which pkg-config >/dev/null 2>&1; then |
| if pkg-config --cflags libpcre >/dev/null 2>&1 |
| then |
| echo "havepcre" |
| havepcre=true |
| fi |
| if pkg-config --cflags glib-2.0 >/dev/null 2>&1 |
| then |
| haveglib=true |
| fi |
| if pkg-config --cflags gmp >/dev/null 2>&1 |
| then |
| havegmp=true |
| fi |
| fi |
| EXE=exe;; |
| esac |
| |
| PATH=.:$PATH |
| |
| havegccgo=false |
| if which gccgo >/dev/null 2>&1 |
| then |
| havegccgo=true |
| fi |
| |
| mode=run |
| case X"$1" in |
| X-test) |
| mode=test |
| shift |
| esac |
| |
| gc() { |
| $GC $1.go; $LD -o a.$EXE $1.o |
| } |
| |
| gc_B() { |
| $GC -B $1.go; $LD -o a.$EXE $1.o |
| } |
| |
| runonly() { |
| if [ $mode = run ] |
| then |
| "$@" |
| fi |
| } |
| |
| run() { |
| if [ $mode = test ] |
| then |
| if echo $1 | grep -q '^gc ' |
| then |
| $1 # compile the program |
| program=$(echo $1 | sed 's/gc //') |
| shift |
| echo $program |
| $1 <fasta-1000.txt > /tmp/$$ |
| case $program in |
| chameneosredux) |
| # exact numbers may vary but non-numbers should match |
| grep -v '[0-9]' /tmp/$$ > /tmp/$$x |
| grep -v '[0-9]' chameneosredux.txt > /tmp/$$y |
| cmp /tmp/$$x /tmp/$$y |
| rm -f /tmp/$$ /tmp/$$x /tmp/$$y |
| ;; |
| *) |
| cmp /tmp/$$ $program.txt |
| rm -f /tmp/$$ |
| esac |
| fi |
| return |
| fi |
| if ! $havegccgo && echo $1 | grep -q '^gccgo ' |
| then |
| return |
| fi |
| echo -n ' '$1' ' |
| $1 |
| shift |
| |
| echo $((time -p $* >/dev/null) 2>&1) | awk '{print $4 "u " $6 "s " $2 "r"}' |
| } |
| |
| fasta() { |
| runonly echo 'fasta -n 25000000' |
| run "gcc $gccm -O2 fasta.c" a.$EXE 25000000 |
| run 'gccgo -O2 fasta.go' a.$EXE -n 25000000 #commented out until WriteString is in bufio |
| run 'gc fasta' a.$EXE -n 25000000 |
| run 'gc_B fasta' a.$EXE -n 25000000 |
| } |
| |
| revcomp() { |
| runonly gcc -O2 fasta.c |
| runonly a.$EXE 25000000 > x |
| runonly echo 'reverse-complement < output-of-fasta-25000000' |
| run "gcc $gccm -O2 reverse-complement.c" a.$EXE < x |
| run 'gccgo -O2 reverse-complement.go' a.$EXE < x |
| run 'gc reverse-complement' a.$EXE < x |
| run 'gc_B reverse-complement' a.$EXE < x |
| rm x |
| } |
| |
| nbody() { |
| runonly echo 'nbody -n 50000000' |
| run "gcc $gccm -O2 nbody.c -lm" a.$EXE 50000000 |
| run 'gccgo -O2 nbody.go' a.$EXE -n 50000000 |
| run 'gc nbody' a.$EXE -n 50000000 |
| run 'gc_B nbody' a.$EXE -n 50000000 |
| } |
| |
| binarytree() { |
| runonly echo 'binary-tree 15 # too slow to use 20' |
| run "gcc $gccm -O2 binary-tree.c -lm" a.$EXE 15 |
| run 'gccgo -O2 binary-tree.go' a.$EXE -n 15 |
| run 'gccgo -O2 binary-tree-freelist.go' a.$EXE -n 15 |
| run 'gc binary-tree' a.$EXE -n 15 |
| run 'gc binary-tree-freelist' a.$EXE -n 15 |
| } |
| |
| fannkuch() { |
| runonly echo 'fannkuch 12' |
| run "gcc $gccm -O2 fannkuch.c" a.$EXE 12 |
| run 'gccgo -O2 fannkuch.go' a.$EXE -n 12 |
| run 'gccgo -O2 fannkuch-parallel.go' a.$EXE -n 12 |
| run 'gc fannkuch' a.$EXE -n 12 |
| run 'gc fannkuch-parallel' a.$EXE -n 12 |
| run 'gc_B fannkuch' a.$EXE -n 12 |
| } |
| |
| regexdna() { |
| runonly gcc -O2 fasta.c |
| runonly a.$EXE 100000 > x |
| runonly echo 'regex-dna 100000' |
| if $havepcre; then |
| run "gcc $gccm -O2 regex-dna.c $(pkg-config libpcre --cflags --libs)" a.$EXE <x |
| fi |
| run 'gccgo -O2 regex-dna.go' a.$EXE <x |
| run 'gccgo -O2 regex-dna-parallel.go' a.$EXE <x |
| run 'gc regex-dna' a.$EXE <x |
| run 'gc regex-dna-parallel' a.$EXE <x |
| run 'gc_B regex-dna' a.$EXE <x |
| rm x |
| } |
| |
| spectralnorm() { |
| runonly echo 'spectral-norm 5500' |
| run "gcc $gccm -O2 spectral-norm.c -lm" a.$EXE 5500 |
| run 'gccgo -O2 spectral-norm.go' a.$EXE -n 5500 |
| run 'gc spectral-norm' a.$EXE -n 5500 |
| run 'gc_B spectral-norm' a.$EXE -n 5500 |
| } |
| |
| knucleotide() { |
| runonly gcc -O2 fasta.c |
| runonly a.$EXE 1000000 > x # should be using 25000000 |
| runonly echo 'k-nucleotide 1000000' |
| if [ $mode = run ] && $haveglib; then |
| run "gcc -O2 k-nucleotide.c $(pkg-config glib-2.0 --cflags --libs)" a.$EXE <x |
| fi |
| run 'gccgo -O2 k-nucleotide.go' a.$EXE <x |
| run 'gccgo -O2 k-nucleotide-parallel.go' a.$EXE <x |
| run 'gc k-nucleotide' a.$EXE <x |
| run 'gc k-nucleotide-parallel' a.$EXE <x |
| run 'gc_B k-nucleotide' a.$EXE <x |
| rm x |
| } |
| |
| mandelbrot() { |
| runonly echo 'mandelbrot 16000' |
| run "gcc $gccm -O2 mandelbrot.c" a.$EXE 16000 |
| run 'gccgo -O2 mandelbrot.go' a.$EXE -n 16000 |
| run 'gc mandelbrot' a.$EXE -n 16000 |
| run 'gc_B mandelbrot' a.$EXE -n 16000 |
| } |
| |
| meteor() { |
| runonly echo 'meteor 2098' |
| run "gcc $gccm -O2 meteor-contest.c" a.$EXE 2098 |
| run 'gccgo -O2 meteor-contest.go' a.$EXE -n 2098 |
| run 'gc meteor-contest' a.$EXE -n 2098 |
| run 'gc_B meteor-contest' a.$EXE -n 2098 |
| } |
| |
| pidigits() { |
| runonly echo 'pidigits 10000' |
| if $havegmp; then |
| run "gcc $gccm -O2 pidigits.c -lgmp" a.$EXE 10000 |
| fi |
| run 'gccgo -O2 pidigits.go' a.$EXE -n 10000 |
| run 'gc pidigits' a.$EXE -n 10000 |
| run 'gc_B pidigits' a.$EXE -n 10000 |
| } |
| |
| threadring() { |
| runonly echo 'threadring 50000000' |
| run "gcc $gccm -O2 threadring.c -lpthread" a.$EXE 50000000 |
| run 'gccgo -O2 threadring.go' a.$EXE -n 50000000 |
| run 'gc threadring' a.$EXE -n 50000000 |
| } |
| |
| chameneos() { |
| runonly echo 'chameneos 6000000' |
| run "gcc $gccm -O2 chameneosredux.c -lpthread" a.$EXE 6000000 |
| run 'gccgo -O2 chameneosredux.go' a.$EXE 6000000 |
| run 'gc chameneosredux' a.$EXE 6000000 |
| } |
| |
| case $# in |
| 0) |
| run="fasta revcomp nbody binarytree fannkuch regexdna spectralnorm knucleotide mandelbrot meteor pidigits threadring chameneos" |
| ;; |
| *) |
| run=$* |
| esac |
| |
| for i in $run |
| do |
| $i |
| runonly echo |
| done |
| |
| rm *.o *.$EXE # Clean up |
| |