source: proto/Compiler/workspace/pablo_template.c @ 865

Last change on this file since 865 was 865, checked in by cameron, 9 years ago

Add @global declaration template facility; use for struct types.

File size: 4.5 KB
Line 
1#include <string.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <errno.h>
5#include <sys/types.h>
6#include <sys/stat.h>
7
8#include "../lib/lib_simd.h"
9#include "../lib/perflib/perfsec.h"
10#include "../lib/s2p.h"
11#include "../lib/carryQ.h"
12
13typedef SIMD_type BytePack;
14typedef SIMD_type BitBlock;
15
16#define BLOCK_SIZE (sizeof(SIMD_type) * 8)      /* BLOCK_SIZE           - SIMD register in bits */
17#define BUFFER_SIZE (BLOCK_SIZE * 16)           /* BUFFER_SIZE          - multiple of BLOCK_SIZE */
18#define OVERLAP_BUFSIZE BLOCK_SIZE              /* OVERLAP_BUFSIZE      - SIMD register width in bytes overlap */
19
20#ifdef BUFFER_PROFILING
21        BOM_Table * perf_timer;
22#elif CODE_CLOCKER
23        #define NUM_EVENTS 1
24        int Events[NUM_EVENTS] = {PAPI_TOT_CYC};
25        //int Events[NUM_EVENTS] = {PAPI_L2_DCM};
26        //int Events[NUM_EVENTS] = {PAPI_TOT_CYC, PAPI_BR_MSP};
27        int cal_size = 20;
28        CC * perf_timer = new CC(Events,NUM_EVENTS,cal_size);
29#else
30        void * perf_timer;
31#endif
32
33@global
34
35void do_process(FILE *infile, FILE *outfile) {
36
37        /* Compiler generated stream variable declarations. */
38        @decl
39
40        BitBlock bit[8];
41        BitBlock error_mask;
42        BitBlock EOF_mask = simd_const_1(1);
43
44        /* 8 * sizeof(SIMD_type) bytes. */
45        BytePack U8[8];
46
47        /* Source file data is broken into buffers, buffers are broken into blocks, blocks are SIMD register width. */
48        int buf_pos = 0;
49        int block_pos = 0;
50        int err_pos = 0;
51
52        BytePack buf[(OVERLAP_BUFSIZE+BUFFER_SIZE+OVERLAP_BUFSIZE)];
53        char * srcbuf = ((char *) buf) + OVERLAP_BUFSIZE;
54        memset((unsigned char *)srcbuf,0,OVERLAP_BUFSIZE);
55        memset(((unsigned char *)srcbuf)+OVERLAP_BUFSIZE+BUFFER_SIZE,0,OVERLAP_BUFSIZE); /* Zero out first and last sizeof(SIMD_type) bytes. */
56
57        /* File IO */
58        int chars_avail = 0;
59        int chars_read = 0;
60
61        chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
62        chars_avail = chars_read;
63        if(ferror(infile)) { fprintf(stderr, "Error: Failed to read input file.\n"); return; }
64        if(chars_avail==0 && feof(infile)) { return; }
65
66        @stream_stmts
67
68        while(1) {
69
70                PERF_SEC_START(perf_timer);
71
72                while (chars_avail >= BLOCK_SIZE) { /* process full blocks */
73
74                        BytePack * U8 = (BytePack *) &srcbuf[block_pos];
75
76                        s2p(U8[0], U8[1], U8[2], U8[3], U8[4], U8[5], U8[6], U8[7],
77                        bit[0], bit[1], bit[2], bit[3], bit[4], bit[5], bit[6], bit[7]);
78
79                        @block_stmts
80
81                        if (bitblock_has_bit(error_mask)){
82                                pos = buf_pos + block_pos + count_forward_zeroes(error_mask);
83                                fprintf(stderr, "Error at position %i.\n", pos);
84                                exit(-1);
85                        }
86
87                        chars_avail -= BLOCK_SIZE;
88                        block_pos += BLOCK_SIZE;
89                }
90
91                if(chars_avail > 0 || @any_carry ) { /* process final partial block */
92                        /* extra */
93                        EOF_mask = sisd_srl(simd_const_1(1),sisd_from_int(BLOCK_SIZE-chars_avail));
94                        BitBlock high_bit_mask = sisd_srl(sisd_high_bit_mask, sisd_from_int(BLOCK_SIZE-chars_avail));
95
96                        BytePack * U8 = (BytePack *) &srcbuf[block_pos];
97
98                        s2p(U8[0], U8[1], U8[2], U8[3], U8[4], U8[5], U8[6], U8[7],
99                        bit[0], bit[1], bit[2], bit[3], bit[4], bit[5], bit[6], bit[7]);
100
101                        bit[0] = simd_and(bit[0], EOF_mask);
102                        bit[1] = simd_and(bit[1], EOF_mask);
103                        bit[2] = simd_and(bit[2], EOF_mask);
104                        bit[3] = simd_and(bit[3], EOF_mask);
105                        bit[4] = simd_and(bit[4], EOF_mask);
106                        bit[5] = simd_and(bit[5], EOF_mask);
107                        bit[6] = simd_and(bit[6], EOF_mask);
108                        bit[7] = simd_and(bit[7], EOF_mask);
109
110                        @block_stmts
111
112                        if(bitblock_has_bit(error_mask)) {
113                                err_pos = buf_pos + block_pos + count_forward_zeroes(error_mask);
114                                fprintf(stderr, "Initial error at position %i.\n", err_pos);
115                                exit(-1);
116                        }
117                }
118
119                PERF_SEC_END(perf_timer, chars_avail);
120
121                buf_pos += chars_read;
122                block_pos = 0;
123
124                chars_read = fread((void *)srcbuf, 1, BUFFER_SIZE, infile);
125                chars_avail = chars_read;
126                if(ferror(infile)) { fprintf(stderr, "Failed to read input file.\n"); return; }
127                if(chars_avail==0 && feof(infile)) { return; }
128        }
129}
130
131int main(int argc, char * argv[]) {
132        char * infilename, * outfilename;
133        FILE *infile, *outfile;
134        struct stat fileinfo;
135
136        if (argc < 2) {
137                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
138                exit(-1);
139        }
140
141        infilename = argv[1];
142        stat(infilename, &fileinfo);
143        infile = fopen(infilename, "rb");
144        if (!infile) {
145                fprintf(stderr, "Error: Cannot open %s for reading.\n", infilename);
146                exit(-1);
147        }
148
149        if (argc < 3) {
150                outfile = stdout;
151        }       else {
152                outfilename = argv[2];
153                outfile = fopen(outfilename, "wb");
154                if (!outfile) {
155                        fprintf(stderr, "Error: Cannot open %s for writing.\n", outfilename);
156                        exit(-1);
157                }
158        }
159
160        // PERF_SEC_BIND(1);
161
162        PERF_SEC_INIT(perf_timer);
163
164        do_process(infile, outfile);
165
166        PERF_SEC_DUMP(perf_timer);
167
168        PERF_SEC_DESTROY(perf_timer);
169
170        fclose(infile);
171        fclose(outfile);
172
173        return(0);
174}
Note: See TracBrowser for help on using the repository browser.