Mercurial > hg > Members > yutaka > OpenCL
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 } |