view WordCount/word_count.cl @ 5:ef8efbd04df9 default tip

minor change
author Yutaka_Kinjyo
date Thu, 28 Jul 2011 11:10:28 +0900
parents 403e35dd9b6d
children
line wrap: on
line source

typedef struct {
    int work_num;
    int size;
    int remain_size;
} param_t;

__kernel void word_count(__global char* text_data,  __global param_t* param, __global int* out_data)
{

    /*
     *                   out_data  
     *
     *  ___int____ ___int____ ___int____ ___int____ 
     *  __________ __________ __________ __________ 
     * |          |          |          |          |
     * | word_num | line_num |   head   |   tail   |
     * |__________|__________|__________|__________|
     *
     */


  uint gid = get_global_id(0);
  int index = gid*4;
  int head = gid*4+2;
  int tail = gid*4+3;

  int work_num = param->work_num;
  int size = param->size;
  int remain_size = param->remain_size;
  // gid が最後なら remain_size を見る。gid は 0 からスタート
  int length = ( (work_num - 1) != gid ) ? size : remain_size;
  int word_flag = 0;
  int word_num = 0;
  int line_num = 0;
  int i = 0;
  int start = gid*size;
  int end = start + length;

  out_data[head] = (text_data[0] != 0x20) && (text_data[0] != 0x0A);
  word_num -= 1-out_data[head];


  //for (i = 0; i < length; i++) {
  for (i = start; i < end; i++) {
    if (text_data[i] == 0x20) {
      word_flag = 1;
    } else if (text_data[i] == 0x0A) {
      line_num += 1;
      word_flag = 1;
    } else {
      word_num += word_flag;
      word_flag = 0;
    }
  }

  word_num += word_flag;

  out_data[tail] = (text_data[i-1] != 0x20) && (text_data[i-1] != 0x0A);

  out_data[index] = word_num;
  out_data[index+1] = line_num;

  return 0;

}