0
|
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 }
|