From: Rob Pike Date: Fri, 7 Aug 2009 19:53:51 +0000 (-0700) Subject: threadring X-Git-Tag: weekly.2009-11-06~944 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c30d81bd238e928adc6b92f5876f302d9a6e83d3;p=gostls13.git threadring more interesting than most R=rsc DELTA=132 (131 added, 0 deleted, 1 changed) OCL=32876 CL=32881 --- diff --git a/test/bench/threadring.c b/test/bench/threadring.c new file mode 100644 index 0000000000..2c4fb77515 --- /dev/null +++ b/test/bench/threadring.c @@ -0,0 +1,102 @@ +/* +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of "The Computer Language Benchmarks Game" nor the + name of "The Computer Language Shootout Benchmarks" nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +* The Computer Language Benchmarks Game +* http://shootout.alioth.debian.org/ + +* contributed by Premysl Hruby +*/ + +#include +#include +#include +#include +#include + +#define THREADS (503) + + +struct stack { + char x[PTHREAD_STACK_MIN]; +}; + + +/* staticaly initialize mutex[0] mutex */ +static pthread_mutex_t mutex[THREADS]; +static int data[THREADS]; +static struct stack stacks[THREADS]; +/* stacks must be defined staticaly, or my i386 box run of virtual memory for this + * process while creating thread +- #400 */ + +static void* thread(void *num) +{ + int l = (int)num; + int r = (l+1) % THREADS; + int token; + + while(1) { + pthread_mutex_lock(mutex + l); + token = data[l]; + if (token) { + data[r] = token - 1; + pthread_mutex_unlock(mutex + r); + } + else { + printf("%i\n", l+1); + exit(0); + } + } +} + + + +int main(int argc, char **argv) +{ + int i; + pthread_t cthread; + pthread_attr_t stack_attr; + + if (argc != 2) + exit(255); + data[0] = atoi(argv[1]); + + pthread_attr_init(&stack_attr); + + for (i = 0; i < THREADS; i++) { + pthread_mutex_init(mutex + i, NULL); + pthread_mutex_lock(mutex + i); + + pthread_attr_setstack(&stack_attr, &stacks[i], sizeof(struct stack)); + pthread_create(&cthread, &stack_attr, thread, (void*)i); + } + + pthread_mutex_unlock(mutex + 0); + pthread_join(cthread, NULL); +} diff --git a/test/bench/threadring.go b/test/bench/threadring.go new file mode 100644 index 0000000000..55d9ad29da --- /dev/null +++ b/test/bench/threadring.go @@ -0,0 +1,74 @@ +/* +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of "The Computer Language Benchmarks Game" nor the + name of "The Computer Language Shootout Benchmarks" nor the names of + its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* The Computer Language Benchmarks Game + * http://shootout.alioth.debian.org/ + * + * contributed by The Go Authors. + */ + +package main + +import ( + "flag"; + "fmt"; + "os"; + "time"; +) + +var n = flag.Int("n", 1000, "how many passes") + +const Nthread = 503 + +func f(i int, in <-chan int, out chan<- int) { + for { + n := <-in; + if n == 0 { + fmt.Printf("%d\n", i); + os.Exit(0); + } + out <- n - 1 + } +} + +func main() { + flag.Parse(); + + one := make(chan int); // will be input to thread 1 + var in, out chan int = nil, one; + for i := 1; i <= Nthread-1; i++ { + in, out = out, make(chan int); + go f(i, in, out); + } + go f(Nthread, out, one); + one <- *n; + for { + time.Sleep(100*1e9); // wait for ring to run + } +} diff --git a/test/bench/threadring.txt b/test/bench/threadring.txt new file mode 100644 index 0000000000..f20bd4efea --- /dev/null +++ b/test/bench/threadring.txt @@ -0,0 +1 @@ +292 diff --git a/test/bench/timing.log b/test/bench/timing.log index 8fbf43a444..973c71c0b8 100644 --- a/test/bench/timing.log +++ b/test/bench/timing.log @@ -115,3 +115,8 @@ pidigits 10000 gc pidigits 71.24u 0.04s 71.28r # 8.5% faster gc_B pidigits 71.25u 0.03s 71.29r # 4% faster +threadring 50000000 + gcc -O2 threadring.c -lpthread 35.51u 160.21s 199.50r + gccgo -O2 threadring.go 90.33u 459.95s 448.03r + gc threadring 33.11u 0.00s 33.14r + GOMAXPROCS=4 gc threadring 114.48u 226.65s 371.59r diff --git a/test/bench/timing.sh b/test/bench/timing.sh index 233e381c62..7ea4facf02 100755 --- a/test/bench/timing.sh +++ b/test/bench/timing.sh @@ -119,9 +119,16 @@ pidigits() { run 'gc_B pidigits' $O.out -n 10000 } +threadring() { + echo 'threadring 50000000' + run 'gcc -O2 threadring.c -lpthread' a.out 50000000 + run 'gccgo -O2 threadring.go' a.out -n 50000000 + run 'gc threadring' $O.out -n 50000000 +} + case $# in 0) - run="fasta revcomp nbody binarytree fannkuch regexdna spectralnorm knucleotide mandelbrot meteor pidigits" + run="fasta revcomp nbody binarytree fannkuch regexdna spectralnorm knucleotide mandelbrot meteor pidigits threadring" ;; *) run=$*