Package org.encog.plugins.opencl.example

Source Code of org.encog.plugins.opencl.example.SimpleTest

package org.encog.plugins.opencl.example;

import java.nio.FloatBuffer;

import org.encog.util.file.ResourceInputStream;

import com.nativelibs4java.opencl.CLBuildException;
import com.nativelibs4java.opencl.CLContext;
import com.nativelibs4java.opencl.CLEvent;
import com.nativelibs4java.opencl.CLFloatBuffer;
import com.nativelibs4java.opencl.CLKernel;
import com.nativelibs4java.opencl.CLMem.Usage;
import com.nativelibs4java.opencl.CLProgram;
import com.nativelibs4java.opencl.CLQueue;
import com.nativelibs4java.opencl.JavaCL;
import com.nativelibs4java.util.NIOUtils;

public class SimpleTest {
  public static void main(String[] args) {
    System.out.println("Start");
    CLContext context = JavaCL.createBestContext();
    CLQueue queue = context.createDefaultQueue();

    float[] A = { 1.0f, 2.0f, 3.0f, 4.0f };
    float[] B = { 5.0f, 6.0f, 7.0f, 8.0f };
       
    String myKernelSource = ResourceInputStream.readResourceAsString("org/encog/plugins/opencl/kernels/simple.cl");
   
    FloatBuffer array1 = NIOUtils.directFloats(10, context.getByteOrder());
    FloatBuffer array2 = NIOUtils.directFloats(10, context.getByteOrder());
    FloatBuffer resultArray = NIOUtils.directFloats(10, context.getByteOrder());
   
    array1.put(A);
    array2.put(B);
   
    CLFloatBuffer b1 = context.createFloatBuffer(Usage.Input, array1, true);
    CLFloatBuffer b2 = context.createFloatBuffer(Usage.Input, array2, true);
    CLFloatBuffer b3 = context.createFloatBuffer(Usage.Output, resultArray, false);

    CLProgram program;
    try {
      program = context.createProgram(myKernelSource).build();
      CLKernel kernel = program.createKernel(
              "simpleKernel",
              b1,
              b2,
              b3
      );
     
     
     
      CLEvent kernelCompletion;
      // The same kernel can be safely used by different threads, as long as setArgs + enqueueNDRange are in a synchronized block
      synchronized (kernel) {
          //kernel.setArgs(b1,b2,b3);
          kernelCompletion = kernel.enqueueNDRange(queue, new int[] { A.length }, new int[] { 1 } );
      }
      kernelCompletion.waitFor(); // better not to wait for it but to pass it as a dependent event to some other queuable operation (CLBuffer.read, for instance)
     
      FloatBuffer f = b3.read(queue, kernelCompletion);
     
      for(int i=0;i<A.length;i++) {
        System.out.println( A[i] + " * " + B[i] + " = " + f.get(i));
      }
     
     
     
    } catch (CLBuildException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
   

  }
}
TOP

Related Classes of org.encog.plugins.opencl.example.SimpleTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.