annotate hello_World_Example/hello.cc @ 2:ccea4e6a1945

add OpenCL example
author Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
date Tue, 22 Jan 2013 23:19:41 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 // File: hello.c
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 // Abstract: A simple "Hello World" compute example showing basic usage of OpenCL which
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // calculates the mathematical square (X[i] = pow(X[i],2)) for a buffer of
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // floating point values.
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 // Version: <1.0>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Inc. ("Apple")
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 // in consideration of your agreement to the following terms, and your use,
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 // installation, modification or redistribution of this Apple software
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 // constitutes acceptance of these terms. If you do not agree with these
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 // terms, please do not use, install, modify or redistribute this Apple
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 // software.
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 // In consideration of your agreement to abide by the following terms, and
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 // subject to these terms, Apple grants you a personal, non - exclusive
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 // license, under Apple's copyrights in this original Apple software ( the
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 // "Apple Software" ), to use, reproduce, modify and redistribute the Apple
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 // Software, with or without modifications, in source and / or binary forms;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 // provided that if you redistribute the Apple Software in its entirety and
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 // without modifications, you must retain this notice and the following text
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 // and disclaimers in all such redistributions of the Apple Software. Neither
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 // the name, trademarks, service marks or logos of Apple Inc. may be used to
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 // endorse or promote products derived from the Apple Software without specific
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 // prior written permission from Apple. Except as expressly stated in this
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 // notice, no other rights or licenses, express or implied, are granted by
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 // Apple herein, including but not limited to any patent rights that may be
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 // infringed by your derivative works or by other works in which the Apple
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 // Software may be incorporated.
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 // The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 // WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 // WARRANTIES OF NON - INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 // PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 // ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 // IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 // CONSEQUENTIAL DAMAGES ( INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 // INTERRUPTION ) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 // AND / OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 // UNDER THEORY OF CONTRACT, TORT ( INCLUDING NEGLIGENCE ), STRICT LIABILITY OR
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 // OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 // Copyright ( C ) 2008 Apple Inc. All Rights Reserved.
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 ////////////////////////////////////////////////////////////////////////////////
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 #include <fcntl.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 #include <stdio.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 #include <stdlib.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 #include <string.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 #include <math.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 #include <unistd.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 #include <sys/types.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 #include <sys/stat.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 #include <OpenCL/opencl.h>
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 ////////////////////////////////////////////////////////////////////////////////
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 // Use a static data size for simplicity
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 #define DATA_SIZE (1024)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 ////////////////////////////////////////////////////////////////////////////////
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 // Simple compute kernel which computes the square of an input array
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 const char *KernelSource = "\n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 "__kernel void square( \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 " __global float* input, \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 " __global float* output, \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 " const unsigned int count) \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 "{ \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 " int i = get_global_id(0); \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 " if(i < count) \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 " output[i] = input[i] * input[i]; \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 "} \n" \
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 "\n";
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 ////////////////////////////////////////////////////////////////////////////////
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 int main(int argc, char** argv)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 int err; // error code returned from api calls
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 float data[DATA_SIZE]; // original data set given to device
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 float results[DATA_SIZE]; // results returned from device
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 unsigned int correct; // number of correct results returned
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 size_t global; // global domain size for our calculation
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 size_t local; // local domain size for our calculation
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 cl_device_id device_id; // compute device id
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 cl_context context; // compute context
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 cl_command_queue commands; // compute command queue
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 cl_program program; // compute program
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 cl_kernel kernel; // compute kernel
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 cl_mem input; // device memory used for the input array
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 cl_mem output; // device memory used for the output array
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 // Fill our data set with random float values
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 int i = 0;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 unsigned int count = DATA_SIZE;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 for(i = 0; i < count; i++)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 data[i] = rand() / (float)RAND_MAX;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 // Connect to a compute device
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 int gpu = 1;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 err = clGetDeviceIDs(NULL, gpu ? CL_DEVICE_TYPE_GPU : CL_DEVICE_TYPE_CPU, 1, &device_id, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 if (err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 printf("Error: Failed to create a device group!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 return EXIT_FAILURE;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 // Create a compute context
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 context = clCreateContext(0, 1, &device_id, NULL, NULL, &err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 if (!context)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 printf("Error: Failed to create a compute context!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 return EXIT_FAILURE;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 // Create a command commands
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 commands = clCreateCommandQueue(context, device_id, 0, &err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 if (!commands)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
137 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 printf("Error: Failed to create a command commands!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 return EXIT_FAILURE;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 // Create the compute program from the source buffer
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 program = clCreateProgramWithSource(context, 1, (const char **) & KernelSource, NULL, &err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 if (!program)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 printf("Error: Failed to create compute program!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 return EXIT_FAILURE;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 // Build the program executable
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 if (err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 size_t len;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 char buffer[2048];
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 printf("Error: Failed to build program executable!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 printf("%s\n", buffer);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 // Create the compute kernel in the program we wish to run
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 kernel = clCreateKernel(program, "square", &err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 if (!kernel || err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 printf("Error: Failed to create compute kernel!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 // Create the input and output arrays in device memory for our calculation
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 input = clCreateBuffer(context, CL_MEM_READ_ONLY, sizeof(float) * count, NULL, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(float) * count, NULL, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 if (!input || !output)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 printf("Error: Failed to allocate device memory!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 // Write our data set into the input array in device memory
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 err = clEnqueueWriteBuffer(commands, input, CL_TRUE, 0, sizeof(float) * count, data, 0, NULL, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 if (err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 printf("Error: Failed to write to source array!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 // Set the arguments to our compute kernel
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 err = 0;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &input);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 err |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &output);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 err |= clSetKernelArg(kernel, 2, sizeof(unsigned int), &count);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 if (err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 printf("Error: Failed to set kernel arguments! %d\n", err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 // Get the maximum work group size for executing the kernel on the device
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 err = clGetKernelWorkGroupInfo(kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 if (err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 printf("Error: Failed to retrieve kernel work group info! %d\n", err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 // Execute the kernel over the entire range of our 1d input data set
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 // using the maximum number of work group items for this device
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 global = count;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, &global, &local, 0, NULL, NULL);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219 if (err)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 printf("Error: Failed to execute kernel!\n");
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 return EXIT_FAILURE;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 // Wait for the command commands to get serviced before reading back results
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 clFinish(commands);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
228
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 // Read back the results from the device to verify the output
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 err = clEnqueueReadBuffer( commands, output, CL_TRUE, 0, sizeof(float) * count, results, 0, NULL, NULL );
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 if (err != CL_SUCCESS)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 printf("Error: Failed to read output array! %d\n", err);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 exit(1);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 // Validate our results
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 correct = 0;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 for(i = 0; i < count; i++)
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 {
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 if(results[i] == data[i] * data[i])
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 correct++;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 // Print a brief summary detailing the results
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 printf("Computed '%d/%d' correct values!\n", correct, count);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
250
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 // Shutdown and cleanup
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 //
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 clReleaseMemObject(input);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 clReleaseMemObject(output);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 clReleaseProgram(program);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 clReleaseKernel(kernel);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 clReleaseCommandQueue(commands);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 clReleaseContext(context);
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 return 0;
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 }
ccea4e6a1945 add OpenCL example
Yuhi TOMARI <yuhi@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262