comparison example/word_count_test/main.cc @ 661:68f0253f5a71

add word_count_test remove word_flag from main.cc
author yutaka@henri.cr.ie.u-ryukyu.ac.jp
date Wed, 02 Dec 2009 03:38:20 +0900
parents
children 8a807e2f64f8
comparison
equal deleted inserted replaced
660:e1856ef4fc74 661:68f0253f5a71
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();
13
14 const char *usr_help_str = "Usage: ./word_count [-cpu spe_num] [-file filename]\n";
15
16 typedef struct {
17 caddr_t file_mmap;
18 off_t size;
19 } st_mmap_t;
20
21
22 /*与えられたsizeをfix_byte_sizeの倍数にする(丸め込むっていうのかな?)*/
23 int
24 fix_byte(int size,int fix_byte_size)
25 {
26 size = (size/fix_byte_size)*fix_byte_size + ((size%fix_byte_size)!= 0)*fix_byte_size;
27
28 return size;
29 }
30
31
32 st_mmap_t
33 my_mmap(char *filename)
34 {
35
36 /*マッピングだよ!*/
37 int fd = -1;
38 int map = MAP_PRIVATE;
39 st_mmap_t st_mmap;
40 struct stat sb;
41
42 if ((fd=open(filename,O_RDONLY,0666))==0) {
43 fprintf(stderr,"can't open %s\n",filename);
44 }
45
46 if (fstat(fd,&sb)) {
47 fprintf(stderr,"can't fstat %s\n",filename);
48 }
49
50 printf("file size %d\n",(int)sb.st_size);
51
52 /*sizeをページングサイズの倍数にあわせる*/
53 st_mmap.size = fix_byte(sb.st_size,4096);
54
55 printf("fix 4096byte file size %d\n",(int)st_mmap.size);
56
57 st_mmap.file_mmap = (char*)mmap(NULL,st_mmap.size,PROT_READ,map,fd,(off_t)0);
58 if (st_mmap.file_mmap == (caddr_t)-1) {
59 fprintf(stderr,"Can't mmap file\n");
60 perror(NULL);
61 exit(0);
62 }
63
64 return st_mmap;
65
66 }
67
68
69 void
70 run_start(TaskManager *manager, char *filename)
71 {
72 HTaskPtr t_exec;
73 HTaskPtr t_print;
74
75 st_mmap_t st_mmap;
76 st_mmap = my_mmap(filename);
77
78
79 /*sizeはdivision_sizeの倍数にしている。*/
80 int size = st_mmap.size;
81 char *file_mmap = st_mmap.file_mmap;
82
83 /* 1task分のデータサイズ(byte) */
84 int division_size;
85 if (size >= 4096*4) {
86 division_size = 4096 * 4;/*16kbyte*/
87 }
88 else {
89 division_size = size;
90 }
91
92 printf("dvision_size %d\n",division_size);
93
94 /* "word num" and "line num" */
95 int status_num = 2;
96 /* taskの数 */
97 int task_num = size / division_size;
98 int out_task_num = task_num + (division_size*task_num < size);
99
100 printf("task_num %d\n",task_num);
101
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*out_task_num;
106 unsigned long long *o_data = (unsigned long long*)manager->allocate(out_size);
107
108 int pad = 2;
109 unsigned long long *head_tail_flag =
110 (unsigned long long*)manager->allocate(out_size);
111
112 printf("out size %d\n",out_size);
113
114 /*各SPEの結果を合計して出力するタスク*/
115
116 t_print = manager->create_task(TASK_PRINT);
117 t_print->add_inData(o_data, out_size);
118 t_print->add_inData(head_tail_flag, out_size);
119 t_print->add_param(out_task_num);
120 t_print->add_param(status_num);
121 t_print->add_param(out_task_num);
122 t_print->add_param(pad);
123
124 /*各SPEに処理するデータを割り振る。*/
125
126 /*渡すデータの最後が文字かどうか。(スペース、改行以外)*/
127
128 int i;
129 for (i = 0; i < task_num; i++) {
130
131 t_exec = manager->create_task(TASK_EXEC);
132 t_exec->add_inData(file_mmap + i*division_size, division_size);
133 t_exec->add_outData(o_data + i*status_num, division_out_size);
134 t_exec->add_outData(head_tail_flag + i*pad, division_out_size);
135 t_exec->add_param(division_size);
136 t_exec->set_cpu(SPE_ANY);
137 t_print->wait_for(t_exec);
138 t_exec->spawn();
139
140 size -= division_size;
141
142 }
143
144 if (size) {
145
146 t_exec = manager->create_task(TASK_EXEC);
147 t_exec->add_inData(file_mmap + i*division_size, size);
148 t_exec->add_outData(o_data + i*status_num, division_out_size);
149 t_exec->add_outData(head_tail_flag + i*pad, division_out_size);
150 t_exec->add_param(size);
151 t_exec->set_cpu(SPE_ANY);
152 t_print->wait_for(t_exec);
153 t_exec->spawn();
154 }
155
156 t_print->spawn();
157 }
158
159 char*
160 init(int argc, char **argv)
161 {
162
163 char *filename = 0;
164
165 for (int i = 1; argv[i]; ++i) {
166 if (strcmp(argv[i], "-file") == 0) {
167 filename = argv[i+1];
168 }
169 }
170 if (filename==0) {
171 printf("usage: %s [-count 10] -file filename\n",argv[0]);
172 exit(1);
173 }
174
175 return filename;
176 }
177
178 int
179 TMmain(TaskManager *manager, int argc, char *argv[])
180 {
181
182 char *filename = 0;
183 filename = init(argc, argv);
184
185 if (filename < 0) {
186 return -1;
187 }
188
189 task_init();
190 run_start(manager, filename);
191
192 return 0;
193 }