# HG changeset patch # User Yutaka_Kinjyo # Date 1311439540 -32400 # Node ID 1a32564347d542b254e859ea278688b39fd8ee45 # Parent 403e35dd9b6d6d980af8b79e968de0cb334bf192 parallel word count diff -r 403e35dd9b6d -r 1a32564347d5 WordCount/Makefile --- 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) diff -r 403e35dd9b6d -r 1a32564347d5 WordCount/main.cc --- 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), ¶m, + 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);