All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.aparapi.internal.jni.KernelRunnerJNI Maven / Gradle / Ivy

There is a newer version: 3.0.2
Show newest version
/**
 * Copyright (c) 2016 - 2018 Syncleus, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.aparapi.internal.jni;

import com.aparapi.Kernel;
import com.aparapi.ProfileInfo;
import com.aparapi.Range;
import com.aparapi.annotation.Experimental;
import com.aparapi.device.OpenCLDevice;
import com.aparapi.internal.annotation.DocMe;
import com.aparapi.internal.annotation.UsedByJNICode;

import java.nio.ByteBuffer;
import java.util.List;

/**
 * This class is intended to be used as a 'proxy' or 'facade' object for Java code to interact with JNI
 */
public abstract class KernelRunnerJNI{

   /**
    * This 'bit' indicates that a particular KernelArg represents a boolean type (array or primitive).
    * 
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_BOOLEAN = 1 << 0;

   /**
    * This 'bit' indicates that a particular KernelArg represents a byte type (array or primitive).
    * 
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_BYTE = 1 << 1;

   /**
    * This 'bit' indicates that a particular KernelArg represents a float type (array or primitive).
    * 
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_FLOAT = 1 << 2;

   /**
    * This 'bit' indicates that a particular KernelArg represents a int type (array or primitive).
    * 
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_INT = 1 << 3;

   /**
    * This 'bit' indicates that a particular KernelArg represents a double type (array or primitive).
    * 
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_DOUBLE = 1 << 4;

   /**
    * This 'bit' indicates that a particular KernelArg represents a long type (array or primitive).
    * 
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_LONG = 1 << 5;

   /**
    * TODO:
    * 
    * @see com.aparapi.internal.annotation.UsedByJNICode
    * 
    * @author gfrost
    */
   @UsedByJNICode protected static final int ARG_SHORT = 1 << 6;

   /**
    * This 'bit' indicates that a particular KernelArg represents an array.
* So ARG_ARRAY|ARG_INT tells us this arg is an array of int. * * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_ARRAY = 1 << 7; /** * This 'bit' indicates that a particular KernelArg represents a primitive (non array).
* So ARG_PRIMITIVE|ARG_INT tells us this arg is a primitive int. * * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_PRIMITIVE = 1 << 8; /** * This 'bit' indicates that a particular KernelArg is read by the Kernel (note from the Kernel's point of view).
* So ARG_ARRAY|ARG_INT|ARG_READ tells us this arg is an array of int's that are read by the kernel. * * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_READ = 1 << 9; /** * This 'bit' indicates that a particular KernelArg is mutated by the Kernel (note from the Kernel's point of view).
* So ARG_ARRAY|ARG_INT|ARG_WRITE tells us this arg is an array of int's that we expect the kernel to mutate. * * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_WRITE = 1 << 10; /** * This 'bit' indicates that a particular KernelArg resides in local memory in the generated OpenCL code.
* * * @see com.aparapi.internal.annotation.UsedByJNICode * @see com.aparapi.annotation.Experimental * * @author gfrost */ @Experimental @UsedByJNICode protected static final int ARG_LOCAL = 1 << 11; /** * This 'bit' indicates that a particular KernelArg resides in global memory in the generated OpenCL code.
* * * @see com.aparapi.internal.annotation.UsedByJNICode * @see com.aparapi.annotation.Experimental * * @author gfrost */ @Experimental @UsedByJNICode protected static final int ARG_GLOBAL = 1 << 12; /** * This 'bit' indicates that a particular KernelArg resides in constant memory in the generated OpenCL code.
* * * @see com.aparapi.internal.annotation.UsedByJNICode * @see com.aparapi.annotation.Experimental * * @author gfrost */ @Experimental @UsedByJNICode protected static final int ARG_CONSTANT = 1 << 13; /** * This 'bit' indicates that a particular KernelArg has it's length reference, in which case a synthetic arg is passed (name mangled) to the OpenCL kernel.
* * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_ARRAYLENGTH = 1 << 14; /** * TODO: * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_APARAPI_BUFFER = 1 << 15; /** * This 'bit' indicates that the arg has been explicitly marked for reading * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_EXPLICIT = 1 << 16; /** * This 'bit' indicates that the arg has been explicitly marked for writing * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_EXPLICIT_WRITE = 1 << 17; /** * TODO: * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_OBJ_ARRAY_STRUCT = 1 << 18; /** * This 'bit' indicates that a particular KernelArg represents a char type (array or primitive). * * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author rlamothe */ @UsedByJNICode protected static final int ARG_CHAR = 1 << 21; /** * This 'bit' indicates that a particular KernelArg represents a static field (array or primitive). * * * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int ARG_STATIC = 1 << 22; /** * This 'bit' indicates that we wish to enable profiling from the JNI code. * * @see com.aparapi.annotations.UsedByJNICode * * @author gfrost */ //@UsedByJNICode protected static final int JNI_FLAG_ENABLE_PROFILING = 1 << 0; /** * This 'bit' indicates that we wish to store profiling information in a CSV file from JNI code. * * @see com.aparapi.annotations.UsedByJNICode * * @author gfrost */ // @UsedByJNICode protected static final int JNI_FLAG_ENABLE_PROFILING_CSV = 1 << 1; /** * This 'bit' indicates that we want to execute on the GPU. * * Be careful changing final constants starting with JNI.
* * @see com.aparapi.internal.annotation.UsedByJNICode * * @author gfrost */ @UsedByJNICode protected static final int JNI_FLAG_USE_GPU = 1 << 2; /** * This 'bit' indicates that we wish to enable verbose JNI layer messages to stderr.
* * @see com.aparapi.annotations.UsedByJNICode * * @author gfrost */ // @UsedByJNICode protected static final int JNI_FLAG_ENABLE_VERBOSE_JNI = 1 << 3; /** * This 'bit' indicates that we wish to enable OpenCL resource tracking by JNI layer to be written to stderr.
* * @see com.aparapi.annotations.UsedByJNICode * @see com.aparapi.annotations.Experimental * * @author gfrost */ // @UsedByJNICode @Annotations.Experimental protected static final int JNI_FLAG_ENABLE_VERBOSE_JNI_OPENCL_RESOURCE_TRACKING = 1 << 4; /** * This 'bit' indicates that we want to execute on the Acceleratr. * * Be careful changing final constants starting with JNI.
* * @see com.aparapi.internal.annotation.UsedByJNICode * * @author ekasit */ @UsedByJNICode protected static final int JNI_FLAG_USE_ACC = 1 << 5; /* * Native methods */ /** * TODO: * * synchronized to avoid race in clGetPlatformIDs() in OpenCL lib problem should fixed in some future OpenCL version * * @param _kernel * @param _device * @param _flags * @return */ @DocMe protected native synchronized long initJNI(Kernel _kernel, OpenCLDevice _device, int _flags); protected native int getJNI(long _jniContextHandle, Object _array); /** * @param _source The OpenCL source code to compile, which may be sent empty if the binary for that source code is known to be cached on the JNI side * under the key {@code _binaryKey}. * @param _binaryKey A key which embodies a Kernel class and a Device, under which the JNI side will cache the compiled binary corresponding to that Kernel/Device * pair. Once a certain _binaryKey has been passed to this method once, further calls to this method with that key will ignore the _source (which * can be passed empty) andused the cached binary. *

By passing an empty String as the _binaryKey, the entire JNI-side binary caching apparatus can be disabled. */ protected native long buildProgramJNI(long _jniContextHandle, String _source, String _binaryKey); protected native int setArgsJNI(long _jniContextHandle, KernelArgJNI[] _args, int argc); protected native int runKernelJNI(long _jniContextHandle, Range _range, boolean _needSync, int _passes, ByteBuffer _inBuffer, ByteBuffer _outBuffer); protected native int disposeJNI(long _jniContextHandle); protected native String getExtensionsJNI(long _jniContextHandle); protected native synchronized List getProfileInfoJNI(long _jniContextHandle); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy