1
|
1 typedef struct {
|
|
2 int work_num;
|
|
3 int size;
|
|
4 int remain_size;
|
|
5 } param_t;
|
0
|
6
|
1
|
7 __kernel void word_count(__global char* text_data, __global param_t* param, __global int* out_data)
|
0
|
8 {
|
|
9
|
1
|
10 /*
|
|
11 * out_data
|
|
12 *
|
|
13 * ___int____ ___int____ ___int____ ___int____
|
|
14 * __________ __________ __________ __________
|
|
15 * | | | | |
|
|
16 * | word_num | line_num | head | tail |
|
|
17 * |__________|__________|__________|__________|
|
|
18 *
|
|
19 */
|
|
20
|
0
|
21
|
|
22 uint gid = get_global_id(0);
|
1
|
23 int index = gid*4;
|
|
24 int head = gid*4+2;
|
|
25 int tail = gid*4+3;
|
0
|
26
|
1
|
27 int work_num = param->work_num;
|
|
28 int size = param->size;
|
|
29 int remain_size = param->remain_size;
|
|
30 // gid が最後なら remain_size を見る。gid は 0 からスタート
|
|
31 int length = ( (work_num - 1) != gid ) ? size : remain_size;
|
0
|
32 int word_flag = 0;
|
|
33 int word_num = 0;
|
|
34 int line_num = 0;
|
|
35 int i = 0;
|
1
|
36 int start = gid*size;
|
|
37 int end = start + length;
|
0
|
38
|
1
|
39 out_data[head] = (text_data[0] != 0x20) && (text_data[0] != 0x0A);
|
|
40 word_num -= 1-out_data[head];
|
|
41
|
|
42
|
|
43 //for (i = 0; i < length; i++) {
|
|
44 for (i = start; i < end; i++) {
|
0
|
45 if (text_data[i] == 0x20) {
|
|
46 word_flag = 1;
|
|
47 } else if (text_data[i] == 0x0A) {
|
|
48 line_num += 1;
|
|
49 word_flag = 1;
|
|
50 } else {
|
|
51 word_num += word_flag;
|
|
52 word_flag = 0;
|
|
53 }
|
|
54 }
|
|
55
|
|
56 word_num += word_flag;
|
|
57
|
1
|
58 out_data[tail] = (text_data[i-1] != 0x20) && (text_data[i-1] != 0x0A);
|
0
|
59
|
|
60 out_data[index] = word_num;
|
|
61 out_data[index+1] = line_num;
|
|
62
|
|
63 return 0;
|
|
64
|
|
65 }
|