Esempio n. 1
0
  @Test
  public void subBufferTest02FloatBuffer() {

    out.println(" - - - subBufferTest - - - ");

    @SuppressWarnings("unchecked")
    final CLPlatform platform = CLPlatform.getDefault(version(CL_1_1));
    if (platform == null) {
      out.println("aborting subBufferTest");
      return;
    }

    final CLContext context = CLContext.create(platform);
    try {
      final int subelements = 5;
      final long lMaxAlignment = context.getMaxMemBaseAddrAlign();
      final int iMaxAlignment = Bitstream.uint32LongToInt(lMaxAlignment);
      System.err.println(
          "XXX: maxAlignment "
              + lMaxAlignment
              + ", 0x"
              + Long.toHexString(lMaxAlignment)
              + ", (int)"
              + iMaxAlignment
              + ", (int)0x"
              + Integer.toHexString(iMaxAlignment));
      if (-1 == iMaxAlignment) {
        throw new RuntimeException(
            "Cannot handle MaxMemBaseAddrAlign > MAX_INT, has 0x"
                + Long.toHexString(lMaxAlignment));
      }
      // FIXME: See Bug 979: Offset/Alignment via offset calculation per element-count is faulty!
      final int floatsPerAlignment = iMaxAlignment / Buffers.SIZEOF_FLOAT;
      // device + direct buffer
      final CLBuffer<FloatBuffer> buffer =
          context.createFloatBuffer(floatsPerAlignment + subelements);
      assertFalse(buffer.isSubBuffer());
      assertNotNull(buffer.getSubBuffers());
      assertTrue(buffer.getSubBuffers().isEmpty());

      final CLSubBuffer<FloatBuffer> subBuffer =
          buffer.createSubBuffer(floatsPerAlignment, subelements);

      assertTrue(subBuffer.isSubBuffer());
      assertEquals(subelements, subBuffer.getBuffer().capacity());
      assertEquals(floatsPerAlignment, subBuffer.getOffset());
      assertEquals(iMaxAlignment, subBuffer.getCLOffset());
      assertEquals(buffer, subBuffer.getParent());
      assertEquals(1, buffer.getSubBuffers().size());

      assertEquals(subBuffer.getCLCapacity(), subBuffer.getBuffer().capacity());

      subBuffer.release();
      assertEquals(0, buffer.getSubBuffers().size());

    } finally {
      context.release();
    }
  }
Esempio n. 2
0
  @Test
  public void subBufferTest01ByteBuffer() {

    out.println(" - - - subBufferTest - - - ");

    @SuppressWarnings("unchecked")
    final CLPlatform platform = CLPlatform.getDefault(version(CL_1_1));
    if (platform == null) {
      out.println("aborting subBufferTest");
      return;
    }

    final CLContext context = CLContext.create(platform);
    try {
      final int subelements = 5;
      final long lMaxAlignment = context.getMaxMemBaseAddrAlign();
      final int iMaxAlignment = Bitstream.uint32LongToInt(lMaxAlignment);
      System.err.println(
          "XXX: maxAlignment "
              + lMaxAlignment
              + ", 0x"
              + Long.toHexString(lMaxAlignment)
              + ", (int)"
              + iMaxAlignment
              + ", (int)0x"
              + Integer.toHexString(iMaxAlignment));
      if (-1 == iMaxAlignment) {
        throw new RuntimeException(
            "Cannot handle MaxMemBaseAddrAlign > MAX_INT, has 0x"
                + Long.toHexString(lMaxAlignment));
      }
      // device only
      final CLBuffer<?> buffer = context.createBuffer(iMaxAlignment + subelements);

      assertFalse(buffer.isSubBuffer());
      assertNotNull(buffer.getSubBuffers());
      assertTrue(buffer.getSubBuffers().isEmpty());

      final CLSubBuffer<?> subBuffer = buffer.createSubBuffer(iMaxAlignment, subelements);

      assertTrue(subBuffer.isSubBuffer());
      assertEquals(subelements, subBuffer.getCLSize());
      assertEquals(iMaxAlignment, subBuffer.getOffset());
      assertEquals(iMaxAlignment, subBuffer.getCLOffset());
      assertEquals(buffer, subBuffer.getParent());
      assertEquals(1, buffer.getSubBuffers().size());

      subBuffer.release();
      assertEquals(0, buffer.getSubBuffers().size());
    } finally {
      context.release();
    }
  }
Esempio n. 3
0
  @Test
  public void createBufferTest() {

    out.println(" - - - highLevelTest; create buffer test - - - ");

    final CLContext context = CLContext.create();
    try {
      final int size = 6;

      final CLBuffer<ByteBuffer> bb = context.createByteBuffer(size);
      final CLBuffer<ShortBuffer> sb = context.createShortBuffer(size);
      final CLBuffer<IntBuffer> ib = context.createIntBuffer(size);
      final CLBuffer<LongBuffer> lb = context.createLongBuffer(size);
      final CLBuffer<FloatBuffer> fb = context.createFloatBuffer(size);
      final CLBuffer<DoubleBuffer> db = context.createDoubleBuffer(size);

      final List<CLMemory<? extends Buffer>> buffers = context.getMemoryObjects();
      assertEquals(6, buffers.size());

      assertEquals(1, bb.getElementSize());
      assertEquals(2, sb.getElementSize());
      assertEquals(4, ib.getElementSize());
      assertEquals(8, lb.getElementSize());
      assertEquals(4, fb.getElementSize());
      assertEquals(8, db.getElementSize());

      final ByteBuffer anotherNIO = newDirectByteBuffer(2);

      for (final CLMemory<? extends Buffer> memory : buffers) {

        final CLBuffer<? extends Buffer> buffer = (CLBuffer<? extends Buffer>) memory;
        final Buffer nio = buffer.getBuffer();

        assertEquals(nio.capacity(), buffer.getCLCapacity());
        assertEquals(buffer.getNIOSize(), buffer.getCLSize());
        assertEquals(sizeOfBufferElem(nio), buffer.getElementSize());
        assertEquals(nio.capacity() * sizeOfBufferElem(nio), buffer.getCLSize());

        final CLBuffer<ByteBuffer> clone = buffer.cloneWith(anotherNIO);

        assertEquals(buffer.ID, clone.ID);
        assertTrue(clone.equals(buffer));
        assertTrue(buffer.equals(clone));

        assertEquals(buffer.getCLSize(), clone.getCLCapacity());
        assertEquals(buffer.getCLSize(), clone.getCLSize());
        assertEquals(anotherNIO.capacity(), clone.getNIOCapacity());
      }

    } finally {
      context.release();
    }
  }
Esempio n. 4
0
  protected void setBinaries(Map<CLDevice, byte[]> binaries) {
    if (this.devices == null) {
      this.devices = new CLDevice[binaries.size()];
      int iDevice = 0;
      for (CLDevice device : binaries.keySet()) this.devices[iDevice++] = device;
    }
    int nDevices = this.devices.length;
    NativeSize[] lengths = new NativeSize[nDevices];
    cl_device_id[] deviceIds = new cl_device_id[nDevices];
    Memory binariesArray = new Memory(Pointer.SIZE * nDevices);
    Memory[] binariesMems = new Memory[nDevices];

    for (int iDevice = 0; iDevice < nDevices; iDevice++) {
      CLDevice device = devices[iDevice];
      byte[] binary = binaries.get(device);

      Memory binaryMem = binariesMems[iDevice] = new Memory(binary.length);
      binaryMem.write(0, binary, 0, binary.length);
      binariesArray.setPointer(iDevice * Pointer.SIZE, binaryMem);

      lengths[iDevice] = toNS(binary.length);
      deviceIds[iDevice] = device.getEntity();
    }
    PointerByReference binariesPtr = new PointerByReference();
    binariesPtr.setPointer(binariesArray);

    IntBuffer errBuff = NIOUtils.directInts(1, ByteOrder.nativeOrder());
    int previousAttempts = 0;
    IntBuffer statuses = NIOUtils.directInts(nDevices, ByteOrder.nativeOrder());
    do {
      entity =
          CL.clCreateProgramWithBinary(
              context.getEntity(), nDevices, deviceIds, lengths, binariesPtr, statuses, errBuff);
    } while (failedForLackOfMemory(errBuff.get(0), previousAttempts++));
  }
Esempio n. 5
0
  @Test
  public void cloneWithLimitedBufferTest() {
    final int elements = NUM_ELEMENTS;
    final int padding = 312; // Arbitrary number
    final CLContext context = CLContext.create();

    final IntBuffer hostBuffer =
        ByteBuffer.allocateDirect((elements + padding) * SIZEOF_INT).asIntBuffer();
    hostBuffer.limit(elements);

    final CLBuffer<?> deviceBuffer =
        context.createBuffer(elements * SIZEOF_INT).cloneWith(hostBuffer);
    assertEquals(elements, deviceBuffer.getCLCapacity());
    assertEquals(elements * SIZEOF_INT, deviceBuffer.getNIOSize());
    assertEquals(elements, deviceBuffer.getNIOCapacity());

    context.release();
  }
Esempio n. 6
0
  @Test
  public void bufferWithHostPointerTest() {

    out.println(" - - - highLevelTest; host pointer test - - - ");

    final int elements = NUM_ELEMENTS;

    final CLContext context = CLContext.create();

    final ByteBuffer buffer = Buffers.newDirectByteBuffer(elements * SIZEOF_INT);
    // fill only first read buffer -> we will copy the payload to the second later.
    fillBuffer(buffer, 12345);

    final CLCommandQueue queue = context.getDevices()[0].createCommandQueue();

    final Mem[] bufferConfig = new Mem[] {Mem.COPY_BUFFER, Mem.USE_BUFFER};

    for (int i = 0; i < bufferConfig.length; i++) {

      out.println("testing with " + bufferConfig[i] + " config");

      final CLBuffer<ByteBuffer> clBufferA =
          context.createBuffer(buffer, Mem.READ_ONLY, bufferConfig[i]);
      final CLBuffer<ByteBuffer> clBufferB =
          context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);

      // asynchronous write of data to GPU device, blocking read later to get the computed results
      // back.
      queue
          .putCopyBuffer(clBufferA, clBufferB, clBufferA.buffer.capacity()) // copy A -> B
          .putReadBuffer(clBufferB, true) // read B
          .finish();

      assertEquals(2, context.getMemoryObjects().size());
      clBufferA.release();
      assertEquals(1, context.getMemoryObjects().size());
      clBufferB.release();
      assertEquals(0, context.getMemoryObjects().size());

      // uploading worked when a==b.
      out.println("validating computed results...");
      checkIfEqual(clBufferA.buffer, clBufferB.buffer, elements);
      out.println("results are valid");
    }

    context.release();
  }
Esempio n. 7
0
 public static CLEvent clCreateUserEvent(CLContext context, IntBuffer errcode_ret) {
   long function_pointer = CLCapabilities.clCreateUserEvent;
   BufferChecks.checkFunctionAddress(function_pointer);
   if (errcode_ret != null) BufferChecks.checkBuffer(errcode_ret, 1);
   CLEvent __result =
       new CLEvent(
           nclCreateUserEvent(
               context.getPointer(), MemoryUtil.getAddressSafe(errcode_ret), function_pointer),
           context);
   return __result;
 }
Esempio n. 8
0
  @Test
  public void writeCopyReadBufferTest() {

    out.println(" - - - highLevelTest; copy buffer test - - - ");

    final int elements = NUM_ELEMENTS;

    final CLContext context = CLContext.create();

    // the CL.MEM_* flag is probably completely irrelevant in our case since we do not use a kernel
    // in this test
    final CLBuffer<ByteBuffer> clBufferA =
        context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
    final CLBuffer<ByteBuffer> clBufferB =
        context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);

    // fill only first read buffer -> we will copy the payload to the second later.
    fillBuffer(clBufferA.buffer, 12345);

    final CLCommandQueue queue = context.getDevices()[0].createCommandQueue();

    // asynchronous write of data to GPU device, blocking read later to get the computed results
    // back.
    queue
        .putWriteBuffer(clBufferA, false) // write A
        .putCopyBuffer(clBufferA, clBufferB, clBufferA.buffer.capacity()) // copy A -> B
        .putReadBuffer(clBufferB, true) // read B
        .finish();

    context.release();

    out.println("validating computed results...");
    checkIfEqual(clBufferA.buffer, clBufferB.buffer, elements);
    out.println("results are valid");
  }
Esempio n. 9
0
  @Test
  public void copyLimitedSlicedBuffersTest() {
    final int size = 4200 * SIZEOF_INT; // Arbitrary number that is a multiple of SIZEOF_INT;
    final int padding = 307; // Totally arbitrary number > 0
    final CLContext context = CLContext.create();
    final CLCommandQueue queue = context.getDevices()[0].createCommandQueue();

    // Make a buffer that is offset relative to the originally allocated position and has a limit
    // that is
    // not equal to the capacity to test whether all these attributes are correctly handled.
    ByteBuffer hostBuffer = ByteBuffer.allocateDirect(size + padding);
    hostBuffer.position(padding / 2); // Offset the original buffer
    hostBuffer = hostBuffer.slice(); // Slice it to have a new buffer that starts at the offset
    hostBuffer.limit(size);
    hostBuffer.order(ByteOrder.nativeOrder()); // Necessary for comparisons to work later on.
    fillBuffer(hostBuffer, 12345);

    final CLBuffer<ByteBuffer> bufferA = context.createBuffer(size).cloneWith(hostBuffer);
    final CLBuffer<ByteBuffer> bufferB = context.createByteBuffer(size);

    queue
        .putWriteBuffer(bufferA, false)
        .putCopyBuffer(bufferA, bufferB, bufferA.getNIOSize())
        .putReadBuffer(bufferB, true)
        .finish();

    hostBuffer.rewind();
    bufferB.buffer.rewind();
    checkIfEqual(hostBuffer, bufferB.buffer, size / SIZEOF_INT);
    context.release();
  }
Esempio n. 10
0
  @Test
  public void mapBufferTest() {

    out.println(" - - - highLevelTest; map buffer test - - - ");

    final int elements = NUM_ELEMENTS;
    final int sizeInBytes = elements * SIZEOF_INT;

    CLContext context;
    CLBuffer<?> clBufferA;
    CLBuffer<?> clBufferB;

    // We will have to allocate mappable NIO memory on non CPU contexts
    // since we can't map e.g GPU memory.
    if (CLPlatform.getDefault().listCLDevices(CLDevice.Type.CPU).length > 0) {

      context = CLContext.create(CLDevice.Type.CPU);

      clBufferA = context.createBuffer(sizeInBytes, Mem.READ_WRITE);
      clBufferB = context.createBuffer(sizeInBytes, Mem.READ_WRITE);
    } else {

      context = CLContext.create();

      clBufferA = context.createByteBuffer(sizeInBytes, Mem.READ_WRITE, Mem.USE_BUFFER);
      clBufferB = context.createByteBuffer(sizeInBytes, Mem.READ_WRITE, Mem.USE_BUFFER);
    }

    final CLCommandQueue queue = context.getDevices()[0].createCommandQueue();

    // fill only first buffer -> we will copy the payload to the second later.
    final ByteBuffer mappedBufferA = queue.putMapBuffer(clBufferA, Map.WRITE, true);
    assertEquals(sizeInBytes, mappedBufferA.capacity());

    fillBuffer(mappedBufferA, 12345); // write to A

    queue
        .putUnmapMemory(clBufferA, mappedBufferA) // unmap A
        .putCopyBuffer(clBufferA, clBufferB); // copy A -> B

    // map B for read operations
    final ByteBuffer mappedBufferB = queue.putMapBuffer(clBufferB, Map.READ, true);
    assertEquals(sizeInBytes, mappedBufferB.capacity());

    out.println("validating computed results...");
    checkIfEqual(mappedBufferA, mappedBufferB, elements); // A == B ?
    out.println("results are valid");

    queue.putUnmapMemory(clBufferB, mappedBufferB); // unmap B

    context.release();
  }
Esempio n. 11
0
  @Test
  public void createBufferFromLimitedBuffer() {
    final int elements = NUM_ELEMENTS;
    final int padding =
        19 * SIZEOF_INT * 2; // Totally arbitrary number > 0 divisible by 2*SIZEOF_INT
    final CLContext context = CLContext.create();

    // Make a buffer that is offset relative to the originally allocated position and has a
    // limit that is
    // not equal to the capacity to test whether all these attributes are correctly handled.
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(elements * SIZEOF_INT + padding);
    byteBuffer.position(padding / 2); // Offset the original buffer
    IntBuffer intBuffer =
        byteBuffer
            .slice()
            .order(ByteOrder.nativeOrder())
            .asIntBuffer(); // Slice it to have a new buffer that starts at the offset
    intBuffer.limit(elements);

    final CLBuffer<IntBuffer> deviceBuffer = context.createBuffer(intBuffer);
    assertEquals(elements, deviceBuffer.getCLCapacity());
    assertEquals(elements * SIZEOF_INT, deviceBuffer.getNIOSize());
    assertEquals(elements, deviceBuffer.getNIOCapacity());
  }
Esempio n. 12
0
  @Test
  public void destructorCallbackTest() throws InterruptedException {

    out.println(" - - - destructorCallbackTest - - - ");

    @SuppressWarnings("unchecked")
    final CLPlatform platform = CLPlatform.getDefault(version(CL_1_1));
    if (platform == null) {
      out.println("aborting destructorCallbackTest");
      return;
    }

    final CLContext context = CLContext.create(platform);

    try {

      final CLBuffer<?> buffer = context.createBuffer(32);
      final CountDownLatch countdown = new CountDownLatch(1);

      buffer.registerDestructorCallback(
          new CLMemObjectListener() {
            public void memoryDeallocated(final CLMemory<?> mem) {
              out.println("buffer released");
              assertEquals(mem, buffer);
              countdown.countDown();
            }
          });
      buffer.release();

      countdown.await(2, TimeUnit.SECONDS);
      assertEquals(countdown.getCount(), 0);

    } finally {
      context.release();
    }
  }
Esempio n. 13
0
  public synchronized void allocate() {
    if (entity != null) throw new IllegalThreadStateException("Program was already allocated !");

    if (passMacrosAsSources) {
      if (macros != null && !macros.isEmpty()) {
        StringBuilder b = new StringBuilder();
        for (Map.Entry<String, Object> m : macros.entrySet())
          b.append("#define " + m.getKey() + " " + m.getValue() + "\n");
        this.sources.add(0, b.toString());
      }
    }

    if (!"false".equals(System.getProperty("javacl.adjustDoubleExtension"))
        && !"0".equals(System.getenv("JAVACL_ADJUST_DOUBLE_EXTENSION"))) {
      for (int i = 0, len = sources.size(); i < len; i++) {
        String source = sources.get(i);
        for (CLDevice device : getDevices())
          source = device.replaceDoubleExtensionByExtensionActuallyAvailable(source);
        sources.set(i, source);
        // TODO keep different sources for each device !!!
      }
    }

    String[] sources = this.sources.toArray(new String[this.sources.size()]);
    NativeSize[] lengths = new NativeSize[sources.length];
    for (int i = 0; i < sources.length; i++) {
      lengths[i] = toNS(sources[i].length());
    }
    IntBuffer errBuff = NIOUtils.directInts(1, ByteOrder.nativeOrder());
    cl_program program;
    int previousAttempts = 0;
    do {
      program =
          CL.clCreateProgramWithSource(
              context.getEntity(), sources.length, sources, lengths, errBuff);
    } while (failedForLackOfMemory(errBuff.get(0), previousAttempts++));
    entity = program;
  }
Esempio n. 14
0
 public synchronized boolean isCached() {
   if (cached == null) cached = context.getCacheBinaries();
   return cached;
 }
Esempio n. 15
0
 CLProgram(CLContext context, CLDevice... devices) {
   super(null, true);
   this.context = context;
   this.devices = devices == null || devices.length == 0 ? context.getDevices() : devices;
 }
Esempio n. 16
0
 /*    */ CLSampler(long pointer, CLContext context) {
   /* 44 */ super(pointer, context);
   /* 45 */ if (isValid()) /* 46 */ context.getCLSamplerRegistry().registerObject(this);
   /*    */ }