diff example/word_count_test/spe/Print.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 d753b4f6b129
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/example/word_count_test/spe/Print.cc	Wed Dec 02 03:38:20 2009 +0900
@@ -0,0 +1,91 @@
+#include <stdio.h>
+#include <string.h>
+#include "Print.h"
+#include "Func.h"
+
+/* これは必須 */
+SchedDefineTask(Print);
+
+static int
+run(SchedTask *s, void *rbuf, void *wbuf)
+{
+    unsigned long long *idata = (unsigned long long*)s->get_input(rbuf, 0);
+    unsigned long long *head_tail_flag= (unsigned long long*)s->get_input(rbuf,1);
+    long task_num = (long)s->get_param(0);
+    long status_num = (long)s->get_param(1);
+    int out_task_num = (int)s->get_param(2);
+    int pad = (int)s->get_param(3);
+    unsigned long long word_data[task_num];
+
+    int flag_cal_sum = 0;
+    //printf("pad %d\n",pad);
+
+
+    /* head_tail_flag : task = 2 : 1
+     *
+     *    head_tail_flag[2]
+     *  ___________ __________
+     * |           |          |
+     * | head_flag | tail_fag | 
+     * |___________|__________|
+     *      [0]         [1] 
+     * 
+     * |----------------------|
+     *    unsigned long long 
+     *          16byte
+     *
+     * 配列先頭の head_flag はみない
+     * 配列末尾の tail_flag はみない
+     * 担当範囲前の末尾文字が「改行と、スペース以外」(tail_flag = 1)で、
+     * 担当範囲の先頭文字が「改行とスペース」(head_flag = 0)の場合
+     * 単語数を +1  することで、整合性がとれる。
+     *
+     * ex.
+     *    task_num 4
+     *    head_tail_flag[8]
+     *
+     *      0   1   2   3   4   5   6   7
+     *     ___ ___ ___ ___ ___ ___ ___ ___ 
+     *    | h | t | h | t | h | t | h | t |
+     *    |___|___|___|___|___|___|___|___|
+     *        |-------|-------|-------| 
+     *           比較    比較    比較
+     *
+     */
+
+
+    for (int i = 1; i < out_task_num * pad - pad; i += pad) {
+      //printf("%llu ",head_tail_flag[i]);
+      //printf("%llu\n",head_tail_flag[i+1]);
+
+      if((head_tail_flag[i] == 1) && (head_tail_flag[i+1] == 0)) {
+	flag_cal_sum++;
+      }
+
+    }
+
+    s->printf("start sum\n");
+
+    for (int i = 0; i < status_num; i++) {
+	word_data[i] = 0;
+    }
+
+    for (int i = 0; i < task_num*status_num; i += status_num) {
+	for (int j = 0; j < status_num; j++) {
+	    word_data[j] += idata[i+j];
+	}
+    }
+
+    word_data[0] += flag_cal_sum;
+
+    for (int i = 0; i < status_num; i++) {
+	s->printf("%llu ",word_data[i]);
+    }
+
+    //printf("j = %d\n",j);
+
+
+    s->printf("\n");
+
+    return 0;
+}