view example/word_count/ppe/Print.cc @ 2053:030b8efcf357 draft

remove wordCount dependency in FileMapReduce
author masa
date Thu, 28 Jan 2016 18:52:38 +0900
parents cc1ea3933551
children
line wrap: on
line source

#include <stdio.h>
#include <string.h>
#include "Print.h"
#include "Func.h"
#include "FileMapReduce.h"

#define STATUS_NUM 2
/* これは必須 */
SchedDefineTask1(Print,run_print);

static int
run_print(SchedTask *s, void *rbuf, void *wbuf)
{
    MapReduce *w = (MapReduce*)s->get_input(0);
    unsigned long long *idata = w->o_data;
    long status_num = STATUS_NUM;
    int out_task_num = w->task_num;

    /*
     *  head_flag
     *  o_data[0]
     *  o_data[1]
     *
     */
    unsigned long long word_data[STATUS_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 2 
     *    head_tail_flag[5]
     *
     *            0   1 | 2   3   4   5  
     *   ___ ___ ___ ___ ___ ___ ___ ___  
     *  | W | L | h | t | W | L | h | t |
     *  |___|___|___|___|___|___|___|___|
     *                  | 
     *                |-----------| 
     *                     比較
     *
     */

    s->printf("start sum\n");

    for (int i = 0; i < STATUS_NUM; i++) {
        word_data[i] = 0;
    }

    int out_size = w->division_out_size / sizeof(unsigned long long);
    for (int i = 0; i < out_task_num ; i++) {
        word_data[0] += idata[i*out_size+0];
        //        printf("idata[%d]=%lld\n",i*w->out_size+0,idata[i*w->out_size+0]);
        word_data[1] += idata[i*out_size+1];
        unsigned long long *head_tail_flag = 
            &idata[i*out_size+2];
        if((i!=out_task_num-1)&&
           (head_tail_flag[1] == 1) && (head_tail_flag[4] == 0)) {
            flag_cal_sum++;
        }
    }

    word_data[0] += flag_cal_sum;

    for (int i = status_num-1; i >=0; i--) {
        s->printf("%llu ",word_data[i]);
    }

    //printf("j = %d\n",j);


    s->printf("\n");

    return 0;
}