Download Jar. Uses 101K of libraries. Click here for Pure Java version (4886L/31K).
1 | !7 |
2 | |
3 | // OpenCL Java binding by Marco Hutter of jocl.org |
4 | // patched by Stefan to allow dynamic library loading |
5 | lib 1006673 |
6 | |
7 | import org.jocl.*; |
8 | import static org.jocl.CL.*; |
9 | |
10 | /** |
11 | * A small JOCL sample. |
12 | */ |
13 | |
14 | /** |
15 | * The source code of the OpenCL program to execute |
16 | */ |
17 | static S programSource = |
18 | "__kernel void "+ |
19 | "sampleKernel(__global const float *a,"+ |
20 | " __global const float *b,"+ |
21 | " __global float *c)"+ |
22 | "{"+ |
23 | " int gid = get_global_id(0);"+ |
24 | " c[gid] = a[gid] * b[gid];"+ |
25 | "}"; |
26 | |
27 | // MAIN PROGRAM |
28 | p { |
29 | // Linux |
30 | // loadNative(1006670); // JOCL Native Parts |
31 | File libFile = prepareProgramFile("opencl.so"); |
32 | copyFile(loadLibrary(#1006670), libFile); |
33 | System.load(libFile.getPath()); |
34 | call(CL.class, "initNativeLibrary", libFile.getName()); |
35 | |
36 | // Create input- and output data |
37 | int n = 10; |
38 | float srcArrayA[] = new float[n]; |
39 | float srcArrayB[] = new float[n]; |
40 | float dstArray[] = new float[n]; |
41 | for (int i=0; i<n; i++) |
42 | { |
43 | srcArrayA[i] = i; |
44 | srcArrayB[i] = i; |
45 | } |
46 | Pointer srcA = Pointer.to(srcArrayA); |
47 | Pointer srcB = Pointer.to(srcArrayB); |
48 | Pointer dst = Pointer.to(dstArray); |
49 | |
50 | // The platform, device type and device number |
51 | // that will be used |
52 | final int platformIndex = 0; |
53 | final long deviceType = CL_DEVICE_TYPE_ALL; |
54 | final int deviceIndex = 0; |
55 | |
56 | // Enable exceptions and subsequently omit error checks in this sample |
57 | CL.setExceptionsEnabled(true); |
58 | |
59 | // Obtain the number of platforms |
60 | int numPlatformsArray[] = new int[1]; |
61 | clGetPlatformIDs(0, null, numPlatformsArray); |
62 | int numPlatforms = numPlatformsArray[0]; |
63 | |
64 | // Obtain a platform ID |
65 | cl_platform_id platforms[] = new cl_platform_id[numPlatforms]; |
66 | clGetPlatformIDs(platforms.length, platforms, null); |
67 | cl_platform_id platform = platforms[platformIndex]; |
68 | |
69 | // Initialize the context properties |
70 | cl_context_properties contextProperties = new cl_context_properties(); |
71 | contextProperties.addProperty(CL_CONTEXT_PLATFORM, platform); |
72 | |
73 | // Obtain the number of devices for the platform |
74 | int numDevicesArray[] = new int[1]; |
75 | clGetDeviceIDs(platform, deviceType, 0, null, numDevicesArray); |
76 | int numDevices = numDevicesArray[0]; |
77 | |
78 | // Obtain a device ID |
79 | cl_device_id devices[] = new cl_device_id[numDevices]; |
80 | clGetDeviceIDs(platform, deviceType, numDevices, devices, null); |
81 | cl_device_id device = devices[deviceIndex]; |
82 | |
83 | // Create a context for the selected device |
84 | cl_context context = clCreateContext( |
85 | contextProperties, 1, new cl_device_id[]{device}, |
86 | null, null, null); |
87 | |
88 | // Create a command-queue for the selected device |
89 | cl_command_queue commandQueue = |
90 | clCreateCommandQueue(context, device, 0, null); |
91 | |
92 | // Allocate the memory objects for the input- and output data |
93 | cl_mem memObjects[] = new cl_mem[3]; |
94 | memObjects[0] = clCreateBuffer(context, |
95 | CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, |
96 | Sizeof.cl_float * n, srcA, null); |
97 | memObjects[1] = clCreateBuffer(context, |
98 | CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, |
99 | Sizeof.cl_float * n, srcB, null); |
100 | memObjects[2] = clCreateBuffer(context, |
101 | CL_MEM_READ_WRITE, |
102 | Sizeof.cl_float * n, null, null); |
103 | |
104 | // Create the program from the source code |
105 | cl_program program = clCreateProgramWithSource(context, |
106 | 1, new String[]{ programSource }, null, null); |
107 | |
108 | // Build the program |
109 | clBuildProgram(program, 0, null, null, null, null); |
110 | |
111 | // Create the kernel |
112 | cl_kernel kernel = clCreateKernel(program, "sampleKernel", null); |
113 | |
114 | // Set the arguments for the kernel |
115 | clSetKernelArg(kernel, 0, |
116 | Sizeof.cl_mem, Pointer.to(memObjects[0])); |
117 | clSetKernelArg(kernel, 1, |
118 | Sizeof.cl_mem, Pointer.to(memObjects[1])); |
119 | clSetKernelArg(kernel, 2, |
120 | Sizeof.cl_mem, Pointer.to(memObjects[2])); |
121 | |
122 | // Set the work-item dimensions |
123 | long global_work_size[] = new long[]{n}; |
124 | long local_work_size[] = new long[]{1}; |
125 | |
126 | // Execute the kernel |
127 | clEnqueueNDRangeKernel(commandQueue, kernel, 1, null, |
128 | global_work_size, local_work_size, 0, null, null); |
129 | |
130 | // Read the output data |
131 | clEnqueueReadBuffer(commandQueue, memObjects[2], CL_TRUE, 0, |
132 | n * Sizeof.cl_float, dst, 0, null, null); |
133 | |
134 | // Release kernel, program, and memory objects |
135 | clReleaseMemObject(memObjects[0]); |
136 | clReleaseMemObject(memObjects[1]); |
137 | clReleaseMemObject(memObjects[2]); |
138 | clReleaseKernel(kernel); |
139 | clReleaseProgram(program); |
140 | clReleaseCommandQueue(commandQueue); |
141 | clReleaseContext(context); |
142 | |
143 | // Verify the result |
144 | boolean passed = true; |
145 | final float epsilon = 1e-7f; |
146 | for (int i=0; i<n; i++) |
147 | { |
148 | float x = dstArray[i]; |
149 | float y = srcArrayA[i] * srcArrayB[i]; |
150 | boolean epsilonEqual = Math.abs(x - y) <= epsilon * Math.abs(x); |
151 | if (!epsilonEqual) |
152 | { |
153 | passed = false; |
154 | break; |
155 | } |
156 | } |
157 | print("Test "+(passed?"PASSED":"FAILED")); |
158 | if (n <= 10) |
159 | { |
160 | print("Result: "+java.util.Arrays.toString(dstArray)); |
161 | } |
162 | } |
download show line numbers debug dex old transpilations
Travelled to 15 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv
No comments. add comment
Snippet ID: | #1006668 |
Snippet name: | JOCLSample.java (GPU calculation, waiting to be ported!) |
Eternal ID of this version: | #1006668/2 |
Text MD5: | 07e4fc19bf305c052156d30791c75ff2 |
Transpilation MD5: | 4ecead5a8b1ea2399d51ededbc9bd24a |
Author: | stefan |
Category: | javax |
Type: | JavaX source code (desktop) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2021-01-05 05:57:43 |
Source code size: | 5390 bytes / 162 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 656 / 1372 |
Version history: | 1 change(s) |
Referenced in: | [show references] |