annotate hello/hello.cc @ 0:0e6e76dbdb0f

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