Commit aed97626 authored by ChaiShushan's avatar ChaiShushan Committed by Ian Lance Taylor

test/bench/shootout: support windows

1. fix executable extension (a.out -> a.exe).
2. fix pthread build error on mingw
3. if depends lib messing, skip the test

LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/100210043
parent c00804c5
...@@ -41,8 +41,12 @@ POSSIBILITY OF SUCH DAMAGE. ...@@ -41,8 +41,12 @@ POSSIBILITY OF SUCH DAMAGE.
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#define THREADS (503) // PTHREAD_STACK_MIN undeclared on mingw
#ifndef PTHREAD_STACK_MIN
#define PTHREAD_STACK_MIN 65535
#endif
#define THREADS (503)
struct stack { struct stack {
char x[PTHREAD_STACK_MIN]; char x[PTHREAD_STACK_MIN];
...@@ -94,7 +98,13 @@ int main(int argc, char **argv) ...@@ -94,7 +98,13 @@ int main(int argc, char **argv)
pthread_mutex_init(mutex + i, NULL); pthread_mutex_init(mutex + i, NULL);
pthread_mutex_lock(mutex + i); pthread_mutex_lock(mutex + i);
#if defined(__MINGW32__) || defined(__MINGW64__)
pthread_attr_setstackaddr(&stack_attr, &stacks[i]);
pthread_attr_setstacksize(&stack_attr, sizeof(struct stack));
#else
pthread_attr_setstack(&stack_attr, &stacks[i], sizeof(struct stack)); pthread_attr_setstack(&stack_attr, &stacks[i], sizeof(struct stack));
#endif
pthread_create(&cthread, &stack_attr, thread, (void*)(uintptr_t)i); pthread_create(&cthread, &stack_attr, thread, (void*)(uintptr_t)i);
} }
......
...@@ -18,6 +18,33 @@ case "$O" in ...@@ -18,6 +18,33 @@ case "$O" in
gccm=-m64;; gccm=-m64;;
esac 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 PATH=.:$PATH
havegccgo=false havegccgo=false
...@@ -34,11 +61,11 @@ X-test) ...@@ -34,11 +61,11 @@ X-test)
esac esac
gc() { gc() {
$GC $1.go; $LD $1.$O $GC $1.go; $LD -o $O.$EXE $1.$O
} }
gc_B() { gc_B() {
$GC -B $1.go; $LD $1.$O $GC -B $1.go; $LD -o $O.$EXE $1.$O
} }
runonly() { runonly() {
...@@ -86,122 +113,126 @@ run() { ...@@ -86,122 +113,126 @@ run() {
fasta() { fasta() {
runonly echo 'fasta -n 25000000' runonly echo 'fasta -n 25000000'
run "gcc $gccm -O2 fasta.c" a.out 25000000 run "gcc $gccm -O2 fasta.c" a.$EXE 25000000
run 'gccgo -O2 fasta.go' a.out -n 25000000 #commented out until WriteString is in bufio run 'gccgo -O2 fasta.go' a.$EXE -n 25000000 #commented out until WriteString is in bufio
run 'gc fasta' $O.out -n 25000000 run 'gc fasta' $O.$EXE -n 25000000
run 'gc_B fasta' $O.out -n 25000000 run 'gc_B fasta' $O.$EXE -n 25000000
} }
revcomp() { revcomp() {
runonly gcc -O2 fasta.c runonly gcc -O2 fasta.c
runonly a.out 25000000 > x runonly a.$EXE 25000000 > x
runonly echo 'reverse-complement < output-of-fasta-25000000' runonly echo 'reverse-complement < output-of-fasta-25000000'
run "gcc $gccm -O2 reverse-complement.c" a.out < x run "gcc $gccm -O2 reverse-complement.c" a.$EXE < x
run 'gccgo -O2 reverse-complement.go' a.out < x run 'gccgo -O2 reverse-complement.go' a.$EXE < x
run 'gc reverse-complement' $O.out < x run 'gc reverse-complement' $O.$EXE < x
run 'gc_B reverse-complement' $O.out < x run 'gc_B reverse-complement' $O.$EXE < x
rm x rm x
} }
nbody() { nbody() {
runonly echo 'nbody -n 50000000' runonly echo 'nbody -n 50000000'
run "gcc $gccm -O2 nbody.c -lm" a.out 50000000 run "gcc $gccm -O2 nbody.c -lm" a.$EXE 50000000
run 'gccgo -O2 nbody.go' a.out -n 50000000 run 'gccgo -O2 nbody.go' a.$EXE -n 50000000
run 'gc nbody' $O.out -n 50000000 run 'gc nbody' $O.$EXE -n 50000000
run 'gc_B nbody' $O.out -n 50000000 run 'gc_B nbody' $O.$EXE -n 50000000
} }
binarytree() { binarytree() {
runonly echo 'binary-tree 15 # too slow to use 20' runonly echo 'binary-tree 15 # too slow to use 20'
run "gcc $gccm -O2 binary-tree.c -lm" a.out 15 run "gcc $gccm -O2 binary-tree.c -lm" a.$EXE 15
run 'gccgo -O2 binary-tree.go' a.out -n 15 run 'gccgo -O2 binary-tree.go' a.$EXE -n 15
run 'gccgo -O2 binary-tree-freelist.go' a.out -n 15 run 'gccgo -O2 binary-tree-freelist.go' a.$EXE -n 15
run 'gc binary-tree' $O.out -n 15 run 'gc binary-tree' $O.$EXE -n 15
run 'gc binary-tree-freelist' $O.out -n 15 run 'gc binary-tree-freelist' $O.$EXE -n 15
} }
fannkuch() { fannkuch() {
runonly echo 'fannkuch 12' runonly echo 'fannkuch 12'
run "gcc $gccm -O2 fannkuch.c" a.out 12 run "gcc $gccm -O2 fannkuch.c" a.$EXE 12
run 'gccgo -O2 fannkuch.go' a.out -n 12 run 'gccgo -O2 fannkuch.go' a.$EXE -n 12
run 'gccgo -O2 fannkuch-parallel.go' a.out -n 12 run 'gccgo -O2 fannkuch-parallel.go' a.$EXE -n 12
run 'gc fannkuch' $O.out -n 12 run 'gc fannkuch' $O.$EXE -n 12
run 'gc fannkuch-parallel' $O.out -n 12 run 'gc fannkuch-parallel' $O.$EXE -n 12
run 'gc_B fannkuch' $O.out -n 12 run 'gc_B fannkuch' $O.$EXE -n 12
} }
regexdna() { regexdna() {
runonly gcc -O2 fasta.c runonly gcc -O2 fasta.c
runonly a.out 100000 > x runonly a.$EXE 100000 > x
runonly echo 'regex-dna 100000' runonly echo 'regex-dna 100000'
run "gcc $gccm -O2 regex-dna.c -lpcre" a.out <x if $havepcre; then
run 'gccgo -O2 regex-dna.go' a.out <x run "gcc $gccm -O2 regex-dna.c $(pkg-config libpcre --cflags --libs)" a.$EXE <x
run 'gccgo -O2 regex-dna-parallel.go' a.out <x fi
run 'gc regex-dna' $O.out <x run 'gccgo -O2 regex-dna.go' a.$EXE <x
run 'gc regex-dna-parallel' $O.out <x run 'gccgo -O2 regex-dna-parallel.go' a.$EXE <x
run 'gc_B regex-dna' $O.out <x run 'gc regex-dna' $O.$EXE <x
run 'gc regex-dna-parallel' $O.$EXE <x
run 'gc_B regex-dna' $O.$EXE <x
rm x rm x
} }
spectralnorm() { spectralnorm() {
runonly echo 'spectral-norm 5500' runonly echo 'spectral-norm 5500'
run "gcc $gccm -O2 spectral-norm.c -lm" a.out 5500 run "gcc $gccm -O2 spectral-norm.c -lm" a.$EXE 5500
run 'gccgo -O2 spectral-norm.go' a.out -n 5500 run 'gccgo -O2 spectral-norm.go' a.$EXE -n 5500
run 'gc spectral-norm' $O.out -n 5500 run 'gc spectral-norm' $O.$EXE -n 5500
run 'gc_B spectral-norm' $O.out -n 5500 run 'gc_B spectral-norm' $O.$EXE -n 5500
} }
knucleotide() { knucleotide() {
runonly gcc -O2 fasta.c runonly gcc -O2 fasta.c
runonly a.out 1000000 > x # should be using 25000000 runonly a.$EXE 1000000 > x # should be using 25000000
runonly echo 'k-nucleotide 1000000' runonly echo 'k-nucleotide 1000000'
if [ $mode = run ]; then if [ $mode = run ] && $haveglib; then
run "gcc -O2 k-nucleotide.c $(pkg-config glib-2.0 --cflags --libs)" a.out <x run "gcc -O2 k-nucleotide.c $(pkg-config glib-2.0 --cflags --libs)" a.$EXE <x
fi fi
run 'gccgo -O2 k-nucleotide.go' a.out <x run 'gccgo -O2 k-nucleotide.go' a.$EXE <x
run 'gccgo -O2 k-nucleotide-parallel.go' a.out <x run 'gccgo -O2 k-nucleotide-parallel.go' a.$EXE <x
run 'gc k-nucleotide' $O.out <x run 'gc k-nucleotide' $O.$EXE <x
run 'gc k-nucleotide-parallel' $O.out <x run 'gc k-nucleotide-parallel' $O.$EXE <x
run 'gc_B k-nucleotide' $O.out <x run 'gc_B k-nucleotide' $O.$EXE <x
rm x rm x
} }
mandelbrot() { mandelbrot() {
runonly echo 'mandelbrot 16000' runonly echo 'mandelbrot 16000'
run "gcc $gccm -O2 mandelbrot.c" a.out 16000 run "gcc $gccm -O2 mandelbrot.c" a.$EXE 16000
run 'gccgo -O2 mandelbrot.go' a.out -n 16000 run 'gccgo -O2 mandelbrot.go' a.$EXE -n 16000
run 'gc mandelbrot' $O.out -n 16000 run 'gc mandelbrot' $O.$EXE -n 16000
run 'gc_B mandelbrot' $O.out -n 16000 run 'gc_B mandelbrot' $O.$EXE -n 16000
} }
meteor() { meteor() {
runonly echo 'meteor 2098' runonly echo 'meteor 2098'
run "gcc $gccm -O2 meteor-contest.c" a.out 2098 run "gcc $gccm -O2 meteor-contest.c" a.$EXE 2098
run 'gccgo -O2 meteor-contest.go' a.out -n 2098 run 'gccgo -O2 meteor-contest.go' a.$EXE -n 2098
run 'gc meteor-contest' $O.out -n 2098 run 'gc meteor-contest' $O.$EXE -n 2098
run 'gc_B meteor-contest' $O.out -n 2098 run 'gc_B meteor-contest' $O.$EXE -n 2098
} }
pidigits() { pidigits() {
runonly echo 'pidigits 10000' runonly echo 'pidigits 10000'
run "gcc $gccm -O2 pidigits.c -lgmp" a.out 10000 if $havegmp; then
run 'gccgo -O2 pidigits.go' a.out -n 10000 run "gcc $gccm -O2 pidigits.c -lgmp" a.$EXE 10000
run 'gc pidigits' $O.out -n 10000 fi
run 'gc_B pidigits' $O.out -n 10000 run 'gccgo -O2 pidigits.go' a.$EXE -n 10000
run 'gc pidigits' $O.$EXE -n 10000
run 'gc_B pidigits' $O.$EXE -n 10000
} }
threadring() { threadring() {
runonly echo 'threadring 50000000' runonly echo 'threadring 50000000'
run "gcc $gccm -O2 threadring.c -lpthread" a.out 50000000 run "gcc $gccm -O2 threadring.c -lpthread" a.$EXE 50000000
run 'gccgo -O2 threadring.go' a.out -n 50000000 run 'gccgo -O2 threadring.go' a.$EXE -n 50000000
run 'gc threadring' $O.out -n 50000000 run 'gc threadring' $O.$EXE -n 50000000
} }
chameneos() { chameneos() {
runonly echo 'chameneos 6000000' runonly echo 'chameneos 6000000'
run "gcc $gccm -O2 chameneosredux.c -lpthread" a.out 6000000 run "gcc $gccm -O2 chameneosredux.c -lpthread" a.$EXE 6000000
run 'gccgo -O2 chameneosredux.go' a.out 6000000 run 'gccgo -O2 chameneosredux.go' a.$EXE 6000000
run 'gc chameneosredux' $O.out 6000000 run 'gc chameneosredux' $O.$EXE 6000000
} }
case $# in case $# in
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment