comparison hello/hello.cc @ 0:0e6e76dbdb0f

add file
author Yutaka_Kinjyo
date Tue, 12 Jul 2011 11:12:51 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:0e6e76dbdb0f
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <unistd.h>
6 #include <OpenCL/opencl.h>
7 #include <oclUtils.h>
8
9
10 #define MEM_SIZE (128)
11
12 int main(int args, char *argv[])
13 {
14
15 int fd = -1;
16 const char *filename = "./hello.cl";
17 if ((fd=open(filename,O_RDONLY,0666))==0) {
18 fprintf(stderr,"can't open %s\n",filename);
19 }
20
21 struct stat sb;
22 if (fstat(fd,&sb)) {
23 fprintf(stderr,"can't fstat %s\n",filename);
24 }
25
26 size_t source_size = sb.st_size;
27 void *source_str = malloc(source_size);
28
29 int err = read(fd, source_str, source_size);
30 if (err == -1) {
31 fprintf(stderr,"can't read %s\n",filename);
32 }
33
34 close(fd);
35
36 cl_platform_id platform_id = NULL;
37 cl_device_id device_id = NULL;
38 cl_uint ret_num_platforms = NULL;
39 cl_uint ret_num_devices = NULL;
40
41 cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
42
43 // CL_DEVICE_TYPE_CPU, CL_DEVICE_TYPE_GPU, と指定できる
44 // CL_DEVICE_TYPE_DEFAULT はどうなるのか
45 ret = clGetDeviceIDs( platform_id, CL_DEVICE_TYPE_DEFAULT,
46 1, &device_id, &ret_num_devices);
47
48 oclCheckError(ret, CL_SUCCESS);
49
50 //OpenCLコンテキストの作成
51 cl_context context = clCreateContext( NULL, 1, &device_id, NULL, NULL, &ret);
52
53 cl_command_queue command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
54
55 cl_mem memobj = clCreateBuffer(context, CL_MEM_READ_WRITE,
56 MEM_SIZE * sizeof(char), NULL, &ret);
57
58 // カーネルプログラムを読み込む
59 cl_program program = clCreateProgramWithSource(context, 1, (const char **)&source_str,
60 (const size_t *)&source_size, &ret);
61
62 ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
63
64 oclCheckError(ret, CL_SUCCESS);
65
66 //カーネルプログラムをビルド
67 cl_kernel kernel = clCreateKernel(program, "hello", &ret);
68
69 ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobj);
70
71 oclCheckError(ret, CL_SUCCESS);
72
73 ret = clEnqueueTask(command_queue, kernel, 0, NULL, NULL);
74
75 oclCheckError(ret, CL_SUCCESS);
76
77 char string[MEM_SIZE];
78 ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0,
79 MEM_SIZE * sizeof(char), string, 0, NULL, NULL);
80
81 oclCheckError(ret, CL_SUCCESS);
82
83 puts(string);
84
85 clFlush(command_queue);
86 clFinish(command_queue);
87 clReleaseKernel(kernel);
88 clReleaseProgram(program);
89 clReleaseMemObject(memobj);
90 clReleaseCommandQueue(command_queue);
91 clReleaseContext(context);
92
93 free(source_str);
94
95 return 0;
96
97 }