source: benchmark/io/readv-posix.c@ 9317419

ADT ast-experimental
Last change on this file since 9317419 was e54d0c3, checked in by Peter A. Buhr <pabuhr@…>, 4 years ago

Fixed benchmarks after another change to getTimeNsec()

  • Property mode set to 100644
File size: 3.4 KB
Line 
1#include <assert.h>
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5
6extern "C" {
7 #include <locale.h>
8 #include <getopt.h>
9 #include <fcntl.h>
10 #include <sys/uio.h>
11}
12
13#include <unistd.h>
14
15#include <pthread.h>
16
17#include "../benchcltr.hfa"
18
19int fd;
20volatile bool run = false;
21volatile size_t count = 0;
22
23unsigned long int buflen = 50;
24
25void * reader_main( void * arg ) {
26 pthread_barrier_wait( (pthread_barrier_t*) arg );
27 /* paranoid */ assert( true == __atomic_load_n(&run, __ATOMIC_RELAXED) );
28
29 char data[buflen];
30 struct iovec iov = { data, buflen };
31
32 while(__atomic_load_n(&run, __ATOMIC_RELAXED)) {
33 int r = preadv2(fd, &iov, 1, 0, 0);
34 if(r < 0) {
35 fprintf(stderr, "%s\n", strerror(-r));
36 abort();
37 }
38
39 __atomic_fetch_add( &count, 1, __ATOMIC_SEQ_CST );
40 }
41
42 return NULL;
43}
44
45int main(int argc, char * argv[]) {
46 unsigned flags = 0;
47 unsigned sublen = 16;
48
49 setlocale(LC_ALL, "");
50
51 for(;;) {
52 static struct option options[] = {
53 BENCH_OPT_LONG
54 {"polled-io", required_argument, 0, 'i'},
55 {"bufsize", required_argument, 0, 'b'},
56 {0, 0, 0, 0}
57 };
58
59 int idx = 0;
60 int opt = getopt_long(argc, argv, BENCH_OPT_SHORT "ib:", options, &idx);
61
62 const char * arg = optarg ? optarg : "";
63 char * end;
64 switch(opt) {
65 // Exit Case
66 case -1:
67 goto arg_loop;
68 BENCH_OPT_CASE
69 case 'i':
70 flags |= O_DIRECT;
71 break;
72 case 'b':
73 buflen = strtoul(arg, &end, 10);
74 if(*end != '\0' && buflen < 10) {
75 fprintf(stderr, "Buffer size must be at least 10, was %s\n", arg);
76 goto usage;
77 }
78 break;
79 default: /* ? */
80 fprintf(stderr, "%d\n", opt);
81 usage:
82 bench_usage( argv );
83 fprintf( stderr, " -i, --polled-io If set opens the file with O_DIRECT\n" );
84 fprintf( stderr, " -b, --buflen=SIZE Number of bytes to read per request\n" );
85 exit(EXIT_FAILURE);
86 }
87 }
88 arg_loop:
89
90 fd = open(__FILE__, flags);
91 if(fd < 0) {
92 fprintf(stderr, "Could not open source file\n");
93 exit(EXIT_FAILURE);
94 }
95
96 printf("Running %d threads, reading %lu bytes each, over %d processors for %f seconds\n", nthreads, buflen, nprocs, duration);
97
98 {
99 uint64_t start, end;
100 {
101 pthread_barrier_t barrier;
102 pthread_barrier_init(&barrier, NULL, nthreads + 1);
103 {
104 pthread_t threads[nthreads];
105 for(int i = 0; i < nthreads; i++) {
106 pthread_attr_t attr;
107 pthread_attr_init( &attr );
108 pthread_create( &threads[i], &attr, reader_main, &barrier );
109 }
110
111 printf("Starting\n");
112 bool is_tty = isatty(STDOUT_FILENO);
113 start = timeHiRes();
114 run = true;
115
116 pthread_barrier_wait( &barrier );
117 wait_duration(duration, start, end, is_tty);
118
119 run = false;
120 end = timeHiRes();
121 printf("\nDone\n");
122
123 for(int i = 0; i < nthreads; i++) {
124 void * ret;
125 pthread_join( threads[i], &ret );
126 }
127 }
128 pthread_barrier_destroy(&barrier);
129 }
130 printf("Took %'ld ms\n", to_miliseconds(end - start));
131 printf("Total reads : %'15zu\n", count);
132 printf("Reads per second : %'18.2lf\n", ((double)count) / to_fseconds(end - start));
133 printf("Total read size : %'15zu\n", buflen * count);
134 printf("Bytes per second : %'18.2lf\n", ((double)count * buflen) / to_fseconds(end - start));
135 }
136
137 close(fd);
138}
Note: See TracBrowser for help on using the repository browser.