00001 #include "stdlib.h"
00002 #define FRAY_STATS
00003 #include "fray.h"
00004 #include "stdio.h"
00005
00006
00007
00008 int foop;
00009 #define PRIME 262584211
00010 #define TABLE_SIZE (1<<25)
00011 #define NUM_SWAPS 10000000
00012 uint64_t a[TABLE_SIZE];
00013 uint64_t perm[TABLE_SIZE];
00014 void chase(fray_block *fb, int64_t id) {
00015 int iter = NUM_SWAPS/fb->sched;
00016 uint64_t s = uint64_t(a+id);
00017
00018 while(iter--) {
00019
00020 fray_prefetch_and_yield(fb, (void*) s);
00021 s = *((uint64_t*)s);
00022 }
00023 foop = s;
00024 fray_return(fb);
00025 }
00026 void goof(fray_block *fb, int64_t id) {
00027 int i;
00028 fprintf(stderr, "goof %ld\n", id);
00029 for (i = 0; i < id; i++) {
00030 fray_yield(fb);
00031 }
00032 fprintf(stderr, "%ld arrived at barrier 1\n", id);
00033 fray_barrier(fb);
00034 fprintf(stderr, "%ld freed from barrier 1\n", id);
00035 if (random() & 0x1) {
00036 fprintf(stderr, "%ld arrived at barrier 2\n", id);
00037 fray_barrier(fb);
00038 fprintf(stderr, "%ld left from barrier 2\n", id);
00039 }
00040 else {
00041 fprintf(stderr, "%ld skipping barrier 2\n", id);
00042 }
00043 fray_return(fb);
00044 }
00045 void hoof(fray_block *fb, int64_t id) {
00046 if (id) {
00047 fray_barrier(fb);
00048 fprintf(stderr, "%ld returned from barrier 3\n", id);
00049 fray_return(fb);
00050 }
00051 else fray_return(fb);
00052 }
00053 void poof(fray_block *fb, int64_t id) {
00054 int i, r;
00055 for (i = 0, r = random()&3; i <= r; i++) {
00056 fprintf(stderr, "%d: Here's %d!\n", i, (int) id+1);
00057 fray_yield(fb);
00058 }
00059 fray_return(fb);
00060 }
00061
00062 #include <sys/time.h>
00063
00064 int main() {
00065 if (STACK_SIZE_64 < 512) fprintf(stderr, "Are you SURE a stack of %d is big enough for fray printfs?\n", STACK_SIZE_64);
00066 fray_block fb;
00067
00068
00069
00070 fray(&fb, &hoof, 0, MAX_FRAY_MEMBERS);
00071
00072 double usec_tot = 0;
00073 #define REPEAT 5
00074 int k;
00075
00076
00077 for(int i=0;i<TABLE_SIZE;i++) {
00078 perm[i] = i;
00079 }
00080
00081 for(int i=0;i<TABLE_SIZE-1;i++) {
00082 uint64_t rnd = i+lrand48()%(TABLE_SIZE-i);
00083 uint64_t x = perm[i];
00084 perm[i] = perm[rnd];
00085 perm[rnd] = x;
00086 }
00087
00088
00089 for(int i=0; i<TABLE_SIZE; i++) {
00090 a[perm[i]] = (uint64_t)(a + perm[(i+1)%TABLE_SIZE]);
00091 }
00092
00093 for (k = (int) MAX_FRAY_MEMBERS; k > 0; k--) {
00094 usec_tot = 0;
00095 int j;
00096 for (j = 0; j < REPEAT; j++) {
00097 struct timeval tv_start, tv_end;
00098 gettimeofday(&tv_start, 0);
00099 fray(&fb, &chase, 0, k);
00100 gettimeofday(&tv_end, 0);
00101 double usec = (tv_end.tv_sec - tv_start.tv_sec)*1000000 + (tv_end.tv_usec - tv_start.tv_usec);
00102 fprintf(stderr, "f&s(%d) ( %g ns/iter): %d iters in %g secs.\n", k, 1000*usec/NUM_SWAPS, NUM_SWAPS, usec/1000000);
00103 usec_tot += usec;
00104 }
00105 fprintf(stdout, "%d: %g ", k, 1000*usec_tot/NUM_SWAPS/REPEAT);
00106 }
00107 return 0;
00108 }