source: proto/RE2PBS/re2pbs_demo_template.cpp @ 1204

Last change on this file since 1204 was 1204, checked in by ksherdy, 8 years ago

Add demo template file.

File size: 5.6 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <errno.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6#include "../lib/lib_simd.h"
7
8#define BLOCK_SIZE (sizeof(SIMD_type) * 8)
9#define SEGMENT_BLOCKS 12
10#define BUFFER_SIZE (BLOCK_SIZE * SEGMENT_BLOCKS)
11#define OVERLAP_BUFSIZE (sizeof(SIMD_type))
12
13typedef long ScanBlock;
14typedef SIMD_type BytePack;
15typedef SIMD_type BitBlock;
16
17#include "../lib/carryQ.h"
18#include "../lib/perflib/perfsec.h"
19#include "../lib/s2p.h"
20//#include "LineColTracker.h"
21
22#ifdef BUFFER_PROFILING
23        BOM_Table * parser_timer;
24
25#elif CODE_CLOCKER
26        #define NUM_EVENTS 1
27        int Events[NUM_EVENTS] = {PAPI_TOT_CYC};
28        //int Events[NUM_EVENTS] = {PAPI_L2_DCM};
29        //int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
30        int cal_size = 20;
31        CC * parser_timer = new CC(Events,NUM_EVENTS,cal_size);
32#else
33        void * parser_timer;
34#endif
35
36int block_base=0;
37int buffer_base=0;
38int buffer_last;
39char * source;
40LineColTracker tracker;
41BitBlock EOF_mask = simd_const_1(1);
42
43static inline int StreamScan(ScanBlock * stream, int blk_count, int ProcessPos(int)) {
44        int blk;
45        int block_pos = 0;
46
47        for (blk = 0; blk < blk_count; blk++) {
48                ScanBlock s = stream[blk];
49                while(s) {
50                        int code = (ProcessPos(cfzl(s) + block_pos));
51                        if (code) return code;
52                        s = s & (s-1);  // clear rightmost bit.
53                }
54                block_pos += 8 * sizeof(ScanBlock);
55        }
56        return 0;
57}
58
59static inline void ReportError(const char * error_msg, int error_pos_in_block) {
60  int error_line, error_column;
61  tracker.get_Line_and_Column(error_pos_in_block, error_line, error_column);
62  fprintf(stderr, "%s at line %i, column %i\n", error_msg, error_line, error_column);
63}
64
65@global
66
67static inline void s2p_do_block(BytePack U8[], Basis_bits & basis_bits) {
68  s2p(U8[0], U8[1], U8[2], U8[3], U8[4], U8[5], U8[6], U8[7],
69        basis_bits.bit_0, basis_bits.bit_1, basis_bits.bit_2, basis_bits.bit_3, basis_bits.bit_4, basis_bits.bit_5, basis_bits.bit_6, basis_bits.bit_7);
70}
71
72static inline void s2p_do_final_block(BytePack U8[], Basis_bits & basis_bits, BitBlock EOF_mask) {
73  s2p_do_block(U8, basis_bits);
74  basis_bits.bit_0 = simd_and(basis_bits.bit_0, EOF_mask);
75  basis_bits.bit_1 = simd_and(basis_bits.bit_1, EOF_mask);
76  basis_bits.bit_2 = simd_and(basis_bits.bit_2, EOF_mask);
77  basis_bits.bit_3 = simd_and(basis_bits.bit_3, EOF_mask);
78  basis_bits.bit_4 = simd_and(basis_bits.bit_4, EOF_mask);
79  basis_bits.bit_5 = simd_and(basis_bits.bit_5, EOF_mask);
80  basis_bits.bit_6 = simd_and(basis_bits.bit_6, EOF_mask);
81  basis_bits.bit_7 = simd_and(basis_bits.bit_7, EOF_mask);
82}
83
84void do_process(FILE *infile, FILE *outfile) {
85
86@decl
87
88  int buf_pos = 0;
89  int block_pos = 0;
90  int errpos = 0;
91  int chars_avail = 0;
92  int check_pos = 0;
93  int chars_read = 0;
94  BytePack buf[(BUFFER_SIZE+BLOCK_SIZE+OVERLAP_BUFSIZE*2)/sizeof(SIMD_type)];
95
96  char * srcbuf = ((char *) buf) + OVERLAP_BUFSIZE;
97  buffer_base = buf_pos;
98  source = srcbuf;
99
100  chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE + OVERLAP_BUFSIZE, infile);
101  chars_avail = chars_read;
102  if (chars_avail > BUFFER_SIZE) chars_avail = BUFFER_SIZE;
103
104@stream_stmts
105
106/* Full Buffers */
107
108    while (chars_avail == BUFFER_SIZE) {
109      PERF_SEC_START(parser_timer);
110      for (int blk = 0; blk < SEGMENT_BLOCKS; blk++) {
111          block_base = blk*BLOCK_SIZE;
112          s2p_do_block((BytePack *) &srcbuf[block_base], basis_bits);
113          @block_stmts
114          //postprocess_do_block(lex, ctCDPI_Callouts, ref_Callouts, check_streams, chars_avail);
115      }
116      tracker.Advance_buffer();
117      PERF_SEC_END(parser_timer, chars_avail);
118           
119      int bytes_left = chars_read - chars_avail;
120      memmove(srcbuf, &srcbuf[BUFFER_SIZE], bytes_left);
121      chars_read = fread(&srcbuf[bytes_left],1, BUFFER_SIZE + OVERLAP_BUFSIZE - bytes_left, infile) + bytes_left;
122      chars_avail = chars_read;
123      if (chars_avail > BUFFER_SIZE) chars_avail = BUFFER_SIZE;
124      buf_pos += chars_avail;
125      buffer_base = buf_pos;
126    }
127/* Final Partial Buffer */
128    PERF_SEC_START(parser_timer);
129
130    block_pos = 0;
131    int remaining = chars_avail;
132/* Full Blocks */
133    while (remaining >= BLOCK_SIZE) {
134          block_base = block_pos;
135          s2p_do_block((BytePack *) &srcbuf[block_pos], basis_bits);
136          @block_stmts
137          postprocess_do_block(lex, ctCDPI_Callouts, ref_Callouts, check_streams, chars_avail);
138          block_pos += BLOCK_SIZE;
139          remaining -= BLOCK_SIZE;
140    }
141    block_base = block_pos;
142    if (remaining > 0 || @any_carry) {
143          EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-remaining));
144          s2p_do_final_block((BytePack *) &srcbuf[block_pos], basis_bits, EOF_mask);
145          @final_block_stmts
146          //postprocess_do_block(lex, ctCDPI_Callouts, ref_Callouts, check_streams, chars_avail);
147    }
148    buf_pos += chars_avail;
149    buffer_base = buf_pos;
150    tracker.Advance_buffer();
151
152    PERF_SEC_END(parser_timer, chars_avail);
153}
154
155int
156main(int argc, char * argv[]) {
157        char * infilename, * outfilename;
158        FILE *infile, *outfile;
159        struct stat fileinfo;
160
161        if (argc < 2) {
162                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
163                exit(-1);
164        }
165
166        infilename = argv[1];
167        stat(infilename, &fileinfo);
168        infile = fopen(infilename, "rb");
169        if (!infile) {
170                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
171                exit(-1);
172        }
173
174        if (argc < 3) outfile = stdout;
175        else {
176                outfilename = argv[2];
177                outfile = fopen(outfilename, "wb");
178                if (!outfile) {
179                        fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
180                        exit(-1);
181                }
182        }
183
184//      PERF_SEC_BIND(1);
185
186        PERF_SEC_INIT(parser_timer);
187
188        do_process(infile, outfile);
189
190        PERF_SEC_DUMP(parser_timer);
191
192        PERF_SEC_DESTROY(parser_timer);
193
194        fclose(infile);
195        fclose(outfile);
196        return(0);
197}
Note: See TracBrowser for help on using the repository browser.