/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.nativelibs4java.opencl;
import static com.nativelibs4java.util.NIOUtils.directBuffer;
import static com.nativelibs4java.util.NIOUtils.get;
import static com.nativelibs4java.util.NIOUtils.put;
import static org.junit.Assert.*;
import java.nio.*;
import org.junit.*;
import com.nativelibs4java.util.NIOUtils;
import org.bridj.*;
import java.nio.ByteOrder;
import static org.bridj.Pointer.*;
import java.nio.ByteOrder;
import java.util.*;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
/**
*
* @author ochafik
*/
@RunWith(Parameterized.class)
public class DeviceTest {
private final CLDevice device;
public DeviceTest(CLDevice device) {
this.device = device;
System.out.println(device);
System.out.println("\tmax sub-devices: " + device.getPartitionMaxSubDevices());
System.out.println("\tpartition properties: " + device.getPartitionProperties());
System.out.println("\tpartition domains: " + device.getPartitionAffinityDomains());
}
@Parameterized.Parameters
public static List<Object[]> getDeviceParameters() {
List<Object[]> ret = new ArrayList<Object[]>();
for (CLPlatform platform : JavaCL.listPlatforms()) {
for (CLDevice device : platform.listAllDevices(true)) {
ret.add(new Object[] { device });
}
}
return ret;
}
@Test
public void testSplitEqually() {
if (!device.getPartitionProperties().contains(CLDevice.PartitionType.Equally)) return;
int computeUnits = device.getMaxComputeUnits();
System.out.println("computeUnits = " + computeUnits);
int subComputeUnits = computeUnits / 2;
CLDevice[] subDevices = device.createSubDevicesEqually(subComputeUnits);
for (CLDevice subDevice : subDevices) {
assertEquals(subComputeUnits, subDevice.getMaxComputeUnits());
checkParent(device, subDevice);
}
}
@Test
public void testSplitByCounts() {
if (!device.getPartitionProperties().contains(CLDevice.PartitionType.ByCounts)) return;
long[] counts = new long[] { 2, 4, 8 };
CLDevice[] subDevices = device.createSubDevicesByCounts(counts);
assertEquals(counts.length, subDevices.length);
int i = 0;
long[] actualCounts = new long[counts.length];
for (CLDevice subDevice : subDevices) {
actualCounts[i] = subDevice.getMaxComputeUnits();
checkParent(device, subDevice);
i++;
}
Arrays.sort(actualCounts);
assertArrayEquals(counts, actualCounts);
}
public void checkSplitByAffinity(CLDevice.AffinityDomain domain) {
if (!device.getPartitionProperties().contains(CLDevice.PartitionType.ByAffinityDomain)) {
System.out.println("Split by affinity is not supported by device " + device);
return;
}
if (!device.getPartitionAffinityDomains().contains(domain)) {
System.out.println("Affinity domain " + domain + " not supported by device " + device);
return;
}
CLDevice[] subDevices = device.createSubDevicesByAffinity(domain);
assertTrue(subDevices.length > 1);
for (CLDevice subDevice : subDevices) {
checkParent(device, subDevice);
assertEquals(domain, subDevice.getPartitionAffinityDomain());
}
}
@Test
public void testSplitByAffinity_NUMA() {
checkSplitByAffinity(CLDevice.AffinityDomain.NUMA);
}
@Test
public void testSplitByAffinity_L4Cache() {
checkSplitByAffinity(CLDevice.AffinityDomain.L4Cache);
}
@Test
public void testSplitByAffinity_L3Cache() {
checkSplitByAffinity(CLDevice.AffinityDomain.L3Cache);
}
@Test
public void testSplitByAffinity_L2Cache() {
checkSplitByAffinity(CLDevice.AffinityDomain.L2Cache);
}
@Test
public void testSplitByAffinity_L1Cache() {
checkSplitByAffinity(CLDevice.AffinityDomain.L1Cache);
}
@Test
public void testSplitByAffinity_NextPartitionable() {
checkSplitByAffinity(CLDevice.AffinityDomain.NextPartitionable);
}
private void checkParent(CLDevice parent, CLDevice child) {
assertSame(parent, child.getParent());
// Force a get info CL_DEVICE_PARENT_DEVICE.
assertEquals(parent, new CLDevice(device.getPlatform(), null, child.getEntity(), false).getParent());
}
}