comparison example/word_count/main.cc @ 393:cb06748ba6cf draft

add word_count
author e065725@localhost.localdomain
date Tue, 15 Sep 2009 16:30:46 +0900
parents
children bc2012726a51
comparison
equal deleted inserted replaced
392:96200cf9a0d0 393:cb06748ba6cf
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/mman.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include "TaskManager.h"
10 #include "Func.h"
11
12 extern void task_init(void);
13
14 const char *usr_help_str = "Usage: ./dependency [-cpu spe_num] [-nodepend]\n\
15 -nodepend No Depenendcy";
16
17 typedef struct {
18 caddr_t file_mmap;
19 off_t size;
20 } st_mmap_t;
21
22
23 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/
24 int
25 fix_byte(int size,int fix_byte_size)
26 {
27 size = (size/fix_byte_size)*fix_byte_size + ((size%fix_byte_size)!= 0)*fix_byte_size;
28
29 return size;
30 }
31
32
33 st_mmap_t
34 my_mmap(char *filename)
35 {
36
37 /*マッピングだよ!*/
38 int fd = -1;
39 int map = MAP_PRIVATE;
40 st_mmap_t st_mmap;
41 struct stat sb;
42
43 if ((fd=open(filename,O_RDONLY,0666))==0) {
44 fprintf(stderr,"can't open %s\n",filename);
45 }
46
47 if (fstat(fd,&sb)) {
48 fprintf(stderr,"can't fstat %s\n",filename);
49 }
50
51 printf("file size %d\n",(int)sb.st_size);
52
53 /*sizeをページングサイズの倍数にあわせる*/
54 st_mmap.size = fix_byte(sb.st_size,4096);
55
56 printf("fix 4096byte file size %d\n",st_mmap.size);
57
58 st_mmap.file_mmap = (char*)mmap(NULL,st_mmap.size,PROT_READ,map,fd,(off_t)0);
59 if (st_mmap.file_mmap == (caddr_t)-1) {
60 fprintf(stderr,"Can't mmap file\n");
61 perror(NULL);
62 exit(0);
63 }
64
65 return st_mmap;
66
67 }
68
69
70 void
71 run_start(char *filename)
72 {
73 HTaskPtr t_exec;
74 HTaskPtr t_print;
75
76 st_mmap_t st_mmap;
77 st_mmap = my_mmap(filename);
78
79
80 /*sizeはdivision_sizeの倍数にしている。*/
81 int size = st_mmap.size;
82 char *file_mmap = st_mmap.file_mmap;
83
84 /* 1task分のデータサイズ(byte) */
85 int division_size;
86 if (size >= 4096*4) {
87 division_size = 4096 * 4;/*16kbyte*/
88 }
89 else {
90 division_size = size;
91 }
92
93 division_size = 4096;
94
95 printf("dvision_size %d\n",division_size);
96
97 /* "word num" and "line num" */
98 int status_num = 2;
99 /* taskの数 */
100 int task_num = size / division_size;
101 printf("task_num %d\n",task_num);
102 /* out用のdivision_size. statusが2つなので、あわせて16byteになるように、long long(8byte)を使用 */
103 int division_out_size = 16;
104 /* out用のデータのサイズ。*/
105 int out_size = division_out_size*task_num;
106 unsigned long long *o_data = (unsigned long long*)manager->allocate(out_size);
107
108
109 printf("out size %d\n",out_size);
110
111 /*各SPEの結果を合計して出力するタスク*/
112
113 t_print = manager->create_task(TASK_PRINT);
114 t_print->add_inData(o_data, out_size);
115 t_print->add_param(task_num);
116 t_print->add_param(status_num);
117
118 int length = division_size;
119
120 printf("length %d\n",length);
121
122 /*各SPEに処理するデータを割り振る。*/
123
124 /*渡すデータの最後が文字かどうか。(スペース、改行以外)*/
125 int word_flag = 0;
126 int i;
127 for (i = 0; i < task_num; i++) {
128
129 t_exec = manager->create_task(TASK_EXEC);
130 t_exec->add_inData(file_mmap + i*division_size, division_size);
131 t_exec->add_outData(o_data + i*status_num, division_out_size);
132 t_exec->add_param(length);
133 t_exec->add_param(word_flag);
134 t_exec->set_cpu(SPE_ANY);
135 t_print->wait_for(t_exec);
136 t_exec->spawn();
137
138 word_flag = ((file_mmap[(i+1)*division_size-1] != 0x20) && (file_mmap[(i+1)*division_size-1] != 0x0A));
139
140 }
141
142 t_print->spawn();
143 }
144
145 char*
146 init(int argc, char **argv)
147 {
148
149 char *filename;
150
151 for (int i = 1; argv[i]; ++i) {
152
153 if (strcmp(argv[i], "-file") == 0) {
154 filename = argv[i+1];
155 }
156
157 }
158
159 return filename;
160 }
161
162 int
163 TMmain(int argc, char *argv[])
164 {
165
166 char *filename = init(argc, argv);
167
168
169 if (filename < 0) {
170 return -1;
171 }
172
173 task_init();
174 run_start(filename);
175
176 return 0;
177 }