changeset 2:1a32564347d5

parallel word count
author Yutaka_Kinjyo
date Sun, 24 Jul 2011 01:45:40 +0900
parents 403e35dd9b6d
children 1c0c9299c292
files WordCount/Makefile WordCount/main.cc
diffstat 2 files changed, 48 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/WordCount/Makefile	Tue Jul 12 17:17:11 2011 +0900
+++ b/WordCount/Makefile	Sun Jul 24 01:45:40 2011 +0900
@@ -1,7 +1,7 @@
 TARGET= word_count
 CC = g++
 WARN = -Wall
-CFLAGS = -g #-isysroot /Developer/SDKs/MacOSX10.6.sdk
+CCFLAGS = -g #-isysroot /Developer/SDKs/MacOSX10.6.sdk
 LIBS = -framework OpenCL #-lclsdk
 
 HEADERS = $(shell ls *.h)
--- a/WordCount/main.cc	Tue Jul 12 17:17:11 2011 +0900
+++ b/WordCount/main.cc	Sun Jul 24 01:45:40 2011 +0900
@@ -11,6 +11,7 @@
 
 #define OUT_PARAM_NUM 4
 #define PRINT_PARAM_NUM 2
+#define FLAG_PARAM_NUM 2
 
 typedef struct {
     caddr_t file_mmap;
@@ -82,7 +83,7 @@
 
     //kernelファイルの大きさ取得して、メモリ確保
     int fd = -1;
-    const char *kernel_filename =  "./word_count.cl";
+    const char *kernel_filename =  "./kernel/word_count.cl";
     if ((fd=open(kernel_filename,O_RDONLY,0666))==0) {
         fprintf(stderr,"can't open %s\n",kernel_filename);
     }
@@ -139,24 +140,13 @@
 
     //カウントするテキストデータのメモリオブジェクト
     cl_mem text_memobj = clCreateBuffer(context, CL_MEM_READ_ONLY, 
-                                        st_mmap.size * sizeof(char), NULL, &ret);
+                                        st_mmap.size, NULL, &ret);
 
     ret = clEnqueueWriteBuffer(command_queue, text_memobj,
                                CL_TRUE, 0, st_mmap.size, (char*)st_mmap.file_mmap,
                                0, NULL, NULL);
 
     oclCheckError(ret, CL_SUCCESS);
-
-    // 必要なパラメータのオブジェクト
-    cl_mem param_memobj = clCreateBuffer(context, CL_MEM_READ_ONLY, 
-                                         sizeof(param_t), NULL, &ret);
-
-    ret = clEnqueueWriteBuffer(command_queue, param_memobj,
-                               CL_TRUE, 0, sizeof(int), (int*)(&st_mmap.size),
-                               0, NULL, NULL);
-
-    oclCheckError(ret, CL_SUCCESS);
-
     
     /*
      * 並列度の計算
@@ -166,8 +156,12 @@
 
     // このdivi_size はどうやって決めるよ
     int divi_size = 1024;
-    size_t global_work_size = (st_mmap.size + divi_size - 1) / divi_size;
+    //size_t global_work_size = (st_mmap.size + divi_size - 1) / divi_size;
+    size_t global_work_size = st_mmap.size / divi_size;
     int remain_size = st_mmap.size - global_work_size * divi_size; 
+    if (remain_size > 0) {
+        global_work_size += 1;
+    }
 
     /* 
      * 行数、単語数, 分割地点のフラグを格納する配列
@@ -180,6 +174,23 @@
 
     oclCheckError(ret, CL_SUCCESS);
 
+    // 必要なパラメータのオブジェクト
+    cl_mem param_memobj = clCreateBuffer(context, CL_MEM_READ_ONLY, 
+                                         sizeof(param_t), NULL, &ret);
+
+    param_t param;
+    param.work_num    = global_work_size;
+    param.size        = divi_size;
+    param.remain_size = remain_size;
+
+
+    ret = clEnqueueWriteBuffer(command_queue, param_memobj,
+                               CL_TRUE, 0, sizeof(param_t), &param,
+                               0, NULL, NULL);
+
+    oclCheckError(ret, CL_SUCCESS);
+
+
 
     // 引数のSet
     // memory object にしなくてもできるsetできるかも
@@ -211,13 +222,35 @@
 
     printf("global_work_size %d\n", (int)global_work_size);
 
+    int word_line_num[PRINT_PARAM_NUM];
+
+    for (int i = 0; i < PRINT_PARAM_NUM; i++) {
+        word_line_num[i] = 0;
+    } 
+
     for (int i = 0; i < global_work_size; i++) {
+
         for (int j = 0; j < PRINT_PARAM_NUM; j++) {
+
             printf("%d ", out_data[i*OUT_PARAM_NUM+j]);
+            word_line_num[j] += out_data[i*OUT_PARAM_NUM+j];
+
         }
+
+        if ((i != global_work_size-1) && 
+            (out_data[i*OUT_PARAM_NUM+PRINT_PARAM_NUM]) && 
+            (out_data[i*OUT_PARAM_NUM+PRINT_PARAM_NUM+1])) {
+            
+            word_line_num[0] += 1;
+
+        } 
+
         printf("\n");
+
     }
 
+    printf("%d %d", word_line_num[0], word_line_num[1]);
+
     clFlush(command_queue);
     clFinish(command_queue);
     clReleaseKernel(kernel);