Mercurial > hg > Members > nobuyasu > CbC
diff benchmark/binary-trees/binary-trees.c @ 33:3946f8d26710 draft default tip
add benchmarck/binary-trees
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 09 Apr 2013 16:41:30 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/benchmark/binary-trees/binary-trees.c Tue Apr 09 16:41:30 2013 +0900 @@ -0,0 +1,129 @@ +/* The Computer Language Benchmarks Game + * http://benchmarksgame.alioth.debian.org/ + * + * contributed by Francesco Abbate + */ + + +#include <stdlib.h> +#include <stdio.h> + +typedef off_t off64_t; +#include <apr_pools.h> + +const size_t LINE_SIZE = 64; + +struct node +{ + int i; + struct node *left; + struct node *right; +}; + +int +node_check(const struct node *n) +{ + if (n->left) + { + int lc = node_check (n->left); + int rc = node_check (n->right); + return lc + n->i - rc; + } + + return n->i; +} + +struct node * +node_get_avail (apr_pool_t *pool) +{ + return apr_palloc (pool, sizeof(struct node)); +} + +struct node * +make (int i, int depth, apr_pool_t *pool) +{ + struct node *curr = node_get_avail (pool); + + curr->i = i; + + if (depth > 0) + { + curr->left = make (2*i-1, depth - 1, pool); + curr->right = make (2*i , depth - 1, pool); + } + else + { + curr->left = NULL; + curr->right = NULL; + } + + return curr; +} + +int +main(int argc, char *argv[]) +{ + apr_pool_t *long_lived_pool; + int min_depth = 4; + int req_depth = (argc == 2 ? atoi(argv[1]) : 10); + int max_depth = (req_depth > min_depth + 2 ? req_depth : min_depth + 2); + int stretch_depth = max_depth+1; + + apr_initialize(); + + /* Alloc then dealloc stretchdepth tree */ + { + apr_pool_t *store; + struct node *curr; + + apr_pool_create (&store, NULL); + curr = make (0, stretch_depth, store); + printf ("stretch tree of depth %i\t check: %i\n", stretch_depth, + node_check (curr)); + apr_pool_destroy (store); + } + + apr_pool_create (&long_lived_pool, NULL); + + { + struct node *long_lived_tree = make(0, max_depth, long_lived_pool); + + /* buffer to store output of each thread */ + char *outputstr = (char*) malloc(LINE_SIZE * (max_depth +1) * sizeof(char)); + int d; + +#pragma omp parallel for + for (d = min_depth; d <= max_depth; d += 2) + { + int iterations = 1 << (max_depth - d + min_depth); + apr_pool_t *store; + int c = 0, i; + + apr_pool_create (&store, NULL); + + for (i = 1; i <= iterations; ++i) + { + struct node *a, *b; + + a = make ( i, d, store); + b = make (-i, d, store); + c += node_check (a) + node_check (b); + apr_pool_clear (store); + } + apr_pool_destroy (store); + + /* each thread write to separate location */ + sprintf(outputstr + LINE_SIZE * d, "%d\t trees of depth %d\t check: %d\n", (2 * iterations), d, c); + } + + /* print all results */ + for (d = min_depth; d <= max_depth; d += 2) + printf("%s", outputstr + (d * LINE_SIZE) ); + free(outputstr); + + printf ("long lived tree of depth %i\t check: %i\n", max_depth, + node_check (long_lived_tree)); + + return 0; + } +}