/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Byte></code> OpenCL buffer big enough to hold 'length' values of type byte. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Byte></code> of length 10 will actually contain 10 * 1 bytes, as bytes are 1-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Byte> createByteBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Byte.class, elementCount); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Double></code> OpenCL buffer big enough to hold 'length' values of type double. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Double></code> of length 10 will actually contain 10 * 8 bytes, as doubles are 8-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Double> createDoubleBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Double.class, elementCount); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Short></code> OpenCL buffer big enough to hold 'length' values of type short. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Short></code> of length 10 will actually contain 10 * 2 bytes, as shorts are 2-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Short> createShortBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Short.class, elementCount); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Character></code> OpenCL buffer big enough to hold 'length' values of type char. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Character></code> of length 10 will actually contain 10 * 2 bytes, as chars are 2-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Character> createCharBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Character.class, elementCount); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create an OpenCL buffer with the provided initial values, in copy mode (see <a href="http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateBuffer.html">CL_MEM_COPY_HOST_PTR</a>). * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param data Pointer to the initial values, must have known bounds (see {@link Pointer#getValidElements()}) */ public <T> CLBuffer<T> createBuffer(CLMem.Usage usage, Pointer<T> data) { return createBuffer(usage, data, true); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Short></code> OpenCL buffer big enough to hold 'length' values of type short. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Short></code> of length 10 will actually contain 10 * 2 bytes, as shorts are 2-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Short> createShortBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Short.class, elementCount); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Float></code> OpenCL buffer big enough to hold 'length' values of type float. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Float></code> of length 10 will actually contain 10 * 4 bytes, as floats are 4-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Float> createFloatBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Float.class, elementCount); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create an OpenCL buffer with the provided initial values, in copy mode (see <a href="http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clCreateBuffer.html">CL_MEM_COPY_HOST_PTR</a>). * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param data Pointer to the initial values, must have known bounds (see {@link Pointer#getValidElements()}) */ public <T> CLBuffer<T> createBuffer(CLMem.Usage usage, Pointer<T> data) { return createBuffer(usage, data, true); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create a <code>CLBuffer<Float></code> OpenCL buffer big enough to hold 'length' values of type float. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param elementCount Length of the buffer expressed in elements (for instance, a <code>CLBuffer<Float></code> of length 10 will actually contain 10 * 4 bytes, as floats are 4-bytes-long) * @return A new buffer allocated on this context. */ public CLBuffer<Float> createFloatBuffer(CLMem.Usage usage, long elementCount) { return createBuffer(usage, Float.class, elementCount); }
protected synchronized CLBuffer<T> getTwiddleFactorsBuf(CLQueue queue, int N) throws CLException { CLBuffer<T> buf = cachedTwiddleFactors.get(N); if (buf == null) { int halfN = N / 2; buf = context.createBuffer(CLMem.Usage.InputOutput, primitiveClass, N); CLEvent.waitFor(cooleyTukeyFFTTwiddleFactors(queue, N, buf)); cachedTwiddleFactors.put(N, buf); } return buf; } private void fft_compute_offsetsX(int[] offsetsX, int N, int s, int offsetX, int offsetY) {
protected synchronized CLBuffer<Integer> getOffsetsBuf(int length) { CLBuffer<Integer> offsetsBuf = cachedOffsetsBufs.get(length); if (offsetsBuf == null) { int[] offsets = new int[length]; fft_compute_offsetsX(offsets, length, 1, 0, 0); offsetsBuf = context.createBuffer(CLMem.Usage.InputOutput, pointerToInts(offsets), true); cachedOffsetsBufs.put(length, offsetsBuf); } return offsetsBuf; } protected abstract CLEvent cooleyTukeyFFTTwiddleFactors(CLQueue queue, int N, CLBuffer<T> buf, CLEvent... evts) throws CLException ;
protected synchronized CLBuffer<Integer> getOffsetsBuf(int length) { CLBuffer<Integer> offsetsBuf = cachedOffsetsBufs.get(length); if (offsetsBuf == null) { int[] offsets = new int[length]; fft_compute_offsetsX(offsets, length, 1, 0, 0); offsetsBuf = context.createBuffer(CLMem.Usage.InputOutput, pointerToInts(offsets), true); cachedOffsetsBufs.put(length, offsetsBuf); } return offsetsBuf; } protected abstract CLEvent cooleyTukeyFFTTwiddleFactors(CLQueue queue, int N, CLBuffer<T> buf, CLEvent... evts) throws CLException ;
protected synchronized CLBuffer<T> getTwiddleFactorsBuf(CLQueue queue, int N) throws CLException { CLBuffer<T> buf = cachedTwiddleFactors.get(N); if (buf == null) { int halfN = N / 2; buf = context.createBuffer(CLMem.Usage.InputOutput, primitiveClass, N); CLEvent.waitFor(cooleyTukeyFFTTwiddleFactors(queue, N, buf)); cachedTwiddleFactors.put(N, buf); } return buf; } private void fft_compute_offsetsX(int[] offsetsX, int N, int s, int offsetX, int offsetY) {
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create an OpenCL buffer big enough to hold the provided amount of values of the specified type. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param io Delegate responsible for reading and writing values. * @param elementCount Length of the buffer expressed in elements (for instance, a CLBuffer<Integer> of length 4 will actually contain 4 * 4 bytes, as ints are 4-bytes-long) * @deprecated Intended for advanced uses in conjunction with BridJ. */ @Deprecated public <T> CLBuffer<T> createBuffer(CLMem.Usage usage, PointerIO<T> io, long elementCount) { return createBuffer(io, null, io.getTargetSize() * elementCount, usage.getIntFlags(), false); }
/** * Calls <a href="http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/clCreateBuffer.html">clCreateBuffer</a>.<br> * Create an OpenCL buffer big enough to hold the provided amount of values of the specified type. * @param usage Usage intended for the pointer in OpenCL kernels : a pointer created with {@link CLMem.Usage#Input} cannot be written to in a kernel. * @param io Delegate responsible for reading and writing values. * @param elementCount Length of the buffer expressed in elements (for instance, a CLBuffer<Integer> of length 4 will actually contain 4 * 4 bytes, as ints are 4-bytes-long) * @deprecated Intended for advanced uses in conjunction with BridJ. */ @Deprecated public <T> CLBuffer<T> createBuffer(CLMem.Usage usage, PointerIO<T> io, long elementCount) { return createBuffer(io, null, io.getTargetSize() * elementCount, usage.getIntFlags(), false); }
public Pointer<T> transform(CLQueue queue, Pointer<T> in, boolean inverse) { long inputSize = (int)in.getValidElements(); long length = inputSize / 2; CLBuffer<T> inBuf = context.createBuffer(CLMem.Usage.Input, in, true); // true = copy CLBuffer<T> outBuf = context.createBuffer(CLMem.Usage.Output, primitiveClass, computeOutputSize(inputSize)); CLEvent dftEvt = transform(queue, inBuf, outBuf, inverse); inBuf.release(); Pointer<T> out = outBuf.read(queue, dftEvt); outBuf.release(); return out; }
public Pointer<T> transform(CLQueue queue, Pointer<T> in, boolean inverse) { long inputSize = (int)in.getValidElements(); long length = inputSize / 2; CLBuffer<T> inBuf = context.createBuffer(CLMem.Usage.Input, in, true); // true = copy CLBuffer<T> outBuf = context.createBuffer(CLMem.Usage.Output, primitiveClass, computeOutputSize(inputSize)); CLEvent dftEvt = transform(queue, inBuf, outBuf, inverse); inBuf.release(); Pointer<T> out = outBuf.read(queue, dftEvt); outBuf.release(); return out; }
@org.junit.Test public void CLMemGetters() { testGetters(createContext().createBuffer(CLMem.Usage.Input, Byte.class, 10)); testGetters(createContext().createBuffer(CLMem.Usage.Output, Byte.class, 10)); }
@Test(expected = IllegalArgumentException.class) public void testMismatchingOrder() { context.createBuffer(CLMem.Usage.InputOutput, allocateFloats(10).order(otherOrder(context.getByteOrder()))); } @Test
public <T> void testMap(Class<T> bufferClass) { int size = 10; Pointer<Byte> data = allocateBytes(size).order(context.getByteOrder()); CLBuffer<T> buf = context.createBuffer(CLMem.Usage.Input, data, false).as(bufferClass); Pointer<T> mapped = buf.map(queue, CLMem.MapFlags.Read); assertEquals(data, mapped); }