aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2014-02-21 08:37:26 +0100
committerSven Gothel <[email protected]>2014-02-21 08:37:26 +0100
commitd4f04ddd3ef3b65b7c31d3504cf55489153c60c1 (patch)
treee72294205d659cb1484c72a612f72f043634a648
parent84e5e16a4aaa206c39b04b980d8d63ffacb97dbb (diff)
Bug 979: Add 'CL_DEVICE_MEM_BASE_ADDR_ALIGN' to CLDevice and overal maximum to CLContext - Split CLBufferTest and use alignment.
See Bug 979 for remaining issues and discussion.
-rw-r--r--src/com/jogamp/opencl/CLContext.java11
-rw-r--r--src/com/jogamp/opencl/CLDevice.java13
-rw-r--r--src/com/jogamp/opencl/impl/CLTLInfoAccessor.java10
-rw-r--r--src/com/jogamp/opencl/spi/CLInfoAccessor.java8
-rw-r--r--test/com/jogamp/opencl/CLBufferTest.java94
-rw-r--r--test/com/jogamp/opencl/HighLevelBindingTest.java1
6 files changed, 101 insertions, 36 deletions
diff --git a/src/com/jogamp/opencl/CLContext.java b/src/com/jogamp/opencl/CLContext.java
index 163375e..378f42f 100644
--- a/src/com/jogamp/opencl/CLContext.java
+++ b/src/com/jogamp/opencl/CLContext.java
@@ -628,6 +628,17 @@ public class CLContext extends CLObjectResource {
}
/**
+ * Returns the maximum {@link CLDevice#getMemBaseAddrAlign()} of all devices.
+ */
+ public long getMaxMemBaseAddrAlign() {
+ long maxAlignment = 0;
+ for (CLDevice device : getDevices()) {
+ maxAlignment = Math.max(maxAlignment, device.getMemBaseAddrAlign());
+ }
+ return maxAlignment;
+ }
+
+ /**
* Returns all devices associated with this CLContext.
*/
public CLDevice[] getDevices() {
diff --git a/src/com/jogamp/opencl/CLDevice.java b/src/com/jogamp/opencl/CLDevice.java
index 25fb009..860fa1a 100644
--- a/src/com/jogamp/opencl/CLDevice.java
+++ b/src/com/jogamp/opencl/CLDevice.java
@@ -48,7 +48,7 @@ import static com.jogamp.opencl.llb.CL.*;
* @see CLPlatform#getMaxFlopsDevice(com.jogamp.opencl.CLDevice.Type...)
* @see CLContext#getDevices()
* @see CLContext#getMaxFlopsDevice(com.jogamp.opencl.CLDevice.Type)
- * @author Michael Bien
+ * @author Michael Bien, et al.
*/
public class CLDevice extends CLObject {
@@ -356,7 +356,16 @@ public class CLDevice extends CLObject {
*/
@CLProperty("CL_DEVICE_MAX_MEM_ALLOC_SIZE")
public long getMaxMemAllocSize() {
- return deviceInfo.getLong(CL_DEVICE_MAX_MEM_ALLOC_SIZE);
+ return deviceInfo.getLong(CL.CL_DEVICE_MAX_MEM_ALLOC_SIZE);
+ }
+
+ /**
+ * Returns the <code>uint32_t</code> memory base address alignment
+ * value reinterpreted as a <code>long</code> value.
+ */
+ @CLProperty("CL_DEVICE_MEM_BASE_ADDR_ALIGN")
+ public long getMemBaseAddrAlign() {
+ return deviceInfo.getUInt32Long(CL.CL_DEVICE_MEM_BASE_ADDR_ALIGN);
}
/**
diff --git a/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java b/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java
index c31b22a..2811530 100644
--- a/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java
+++ b/src/com/jogamp/opencl/impl/CLTLInfoAccessor.java
@@ -41,7 +41,7 @@ import static com.jogamp.opencl.CLException.*;
/**
* Internal utility for common OpenCL clGetFooInfo calls.
* Threadsafe, threadlocal implementation.
- * @author Michael Bien
+ * @author Michael Bien, et al.
*/
public abstract class CLTLInfoAccessor implements CLInfoAccessor {
@@ -65,6 +65,14 @@ public abstract class CLTLInfoAccessor implements CLInfoAccessor {
};
@Override
+ public final long getUInt32Long(int key) {
+ final ByteBuffer buffer = getBB(4).putInt(0, 0);
+ final int ret = getInfo(key, 4, buffer, null);
+ CLException.checkForError(ret, "error while asking for info value");
+ return Bitstream.toUInt32Long(buffer.getInt(0));
+ }
+
+ @Override
public final long getLong(int key) {
ByteBuffer buffer = getBB(8).putLong(0, 0);
diff --git a/src/com/jogamp/opencl/spi/CLInfoAccessor.java b/src/com/jogamp/opencl/spi/CLInfoAccessor.java
index 0ff0aea..a02a38e 100644
--- a/src/com/jogamp/opencl/spi/CLInfoAccessor.java
+++ b/src/com/jogamp/opencl/spi/CLInfoAccessor.java
@@ -6,13 +6,19 @@ package com.jogamp.opencl.spi;
/**
* Internal utility for common OpenCL clGetFooInfo calls.
* Provides common accessors to CL objects.
- * @author Michael Bien
+ * @author Michael Bien, et al.
*/
public interface CLInfoAccessor {
int[] getInts(int key, int n);
/**
+ * Returns the <code>uint32_t</code> value for the given key,
+ * reinterpreted as a <code>long</code> value.
+ */
+ long getUInt32Long(int key);
+
+ /**
* Returns the long value for the given key.
*/
long getLong(int key);
diff --git a/test/com/jogamp/opencl/CLBufferTest.java b/test/com/jogamp/opencl/CLBufferTest.java
index 0638844..5b5d0e3 100644
--- a/test/com/jogamp/opencl/CLBufferTest.java
+++ b/test/com/jogamp/opencl/CLBufferTest.java
@@ -32,6 +32,7 @@ import com.jogamp.opencl.CLMemory.Mem;
import com.jogamp.opencl.CLMemory.Map;
import com.jogamp.opencl.test.util.UITestCase;
import com.jogamp.common.nio.Buffers;
+import com.jogamp.common.util.Bitstream;
import java.io.IOException;
import java.nio.Buffer;
@@ -247,7 +248,7 @@ public class CLBufferTest extends UITestCase {
}
@Test
- public void subBufferTest() {
+ public void subBufferTest01ByteBuffer() {
out.println(" - - - subBufferTest - - - ");
@@ -260,48 +261,77 @@ public class CLBufferTest extends UITestCase {
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
- {
- CLBuffer<?> buffer = context.createBuffer(64);
+ CLBuffer<?> buffer = context.createBuffer(iMaxAlignment+subelements);
- assertFalse(buffer.isSubBuffer());
- assertNotNull(buffer.getSubBuffers());
- assertTrue(buffer.getSubBuffers().isEmpty());
+ assertFalse(buffer.isSubBuffer());
+ assertNotNull(buffer.getSubBuffers());
+ assertTrue(buffer.getSubBuffers().isEmpty());
- CLSubBuffer<?> subBuffer = buffer.createSubBuffer(10, subelements);
+ CLSubBuffer<?> subBuffer = buffer.createSubBuffer(iMaxAlignment, subelements);
- assertTrue(subBuffer.isSubBuffer());
- assertEquals(subelements, subBuffer.getCLSize());
- assertEquals(10, subBuffer.getOffset());
- assertEquals(10, subBuffer.getCLOffset());
- assertEquals(buffer, subBuffer.getParent());
- assertEquals(1, buffer.getSubBuffers().size());
+ 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());
- }
+ subBuffer.release();
+ assertEquals(0, buffer.getSubBuffers().size());
+ }finally{
+ context.release();
+ }
- // device + direct buffer
- {
- CLBuffer<FloatBuffer> buffer = context.createFloatBuffer(64);
- assertFalse(buffer.isSubBuffer());
- assertNotNull(buffer.getSubBuffers());
- assertTrue(buffer.getSubBuffers().isEmpty());
+ }
- CLSubBuffer<FloatBuffer> subBuffer = buffer.createSubBuffer(10, subelements);
+ @Test
+ public void subBufferTest02FloatBuffer() {
- assertTrue(subBuffer.isSubBuffer());
- assertEquals(subelements, subBuffer.getBuffer().capacity());
- assertEquals(10, subBuffer.getOffset());
- assertEquals(40, subBuffer.getCLOffset());
- assertEquals(buffer, subBuffer.getParent());
- assertEquals(1, buffer.getSubBuffers().size());
+ out.println(" - - - subBufferTest - - - ");
- assertEquals(subBuffer.getCLCapacity(), subBuffer.getBuffer().capacity());
+ CLPlatform platform = CLPlatform.getDefault(version(CL_1_1));
+ if(platform == null) {
+ out.println("aborting subBufferTest");
+ return;
+ }
- subBuffer.release();
- assertEquals(0, buffer.getSubBuffers().size());
+ 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
+ CLBuffer<FloatBuffer> buffer = context.createFloatBuffer(floatsPerAlignment+subelements);
+ assertFalse(buffer.isSubBuffer());
+ assertNotNull(buffer.getSubBuffers());
+ assertTrue(buffer.getSubBuffers().isEmpty());
+
+ 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();
diff --git a/test/com/jogamp/opencl/HighLevelBindingTest.java b/test/com/jogamp/opencl/HighLevelBindingTest.java
index 6dd6a73..40d2b9e 100644
--- a/test/com/jogamp/opencl/HighLevelBindingTest.java
+++ b/test/com/jogamp/opencl/HighLevelBindingTest.java
@@ -164,6 +164,7 @@ public class HighLevelBindingTest extends UITestCase {
// out.println(" C version: "+device.getCVersion()); //CL 1.1
out.println(" driver version: "+device.getDriverVersion());
out.println(" type: "+device.getType());
+ out.println(" mem base addr align: "+device.getMemBaseAddrAlign());
out.println(" global mem: "+device.getGlobalMemSize()/(1024*1024)+" MB");
out.println(" max alloc mem: "+device.getMaxMemAllocSize()/(1024*1024)+" MB");
out.println(" max param size: "+device.getMaxParameterSize()+" byte");