View Javadoc
1   package net.bmahe.genetics4j.gpu.opencl;
2   
3   import java.util.Objects;
4   
5   import org.apache.commons.lang3.StringUtils;
6   import org.apache.logging.log4j.LogManager;
7   import org.apache.logging.log4j.Logger;
8   import org.jocl.CL;
9   import org.jocl.cl_device_id;
10  import org.jocl.cl_platform_id;
11  
12  import net.bmahe.genetics4j.gpu.opencl.model.Device;
13  import net.bmahe.genetics4j.gpu.opencl.model.DeviceType;
14  
15  public class DeviceReader {
16  	public static final Logger logger = LogManager.getLogger(DeviceReader.class);
17  
18  	public Device read(final cl_platform_id platformId, final cl_device_id deviceId) {
19  		Objects.requireNonNull(platformId);
20  		Objects.requireNonNull(deviceId);
21  
22  		final var deviceBuilder = Device.builder();
23  		deviceBuilder.deviceId(deviceId);
24  
25  		final String name = DeviceUtils.getDeviceInfoString(deviceId, CL.CL_DEVICE_NAME);
26  		deviceBuilder.name(name);
27  
28  		final String vendor = DeviceUtils.getDeviceInfoString(deviceId, CL.CL_DEVICE_VENDOR);
29  		deviceBuilder.vendor(vendor);
30  
31  		final String deviceVersion = DeviceUtils.getDeviceInfoString(deviceId, CL.CL_DEVICE_VERSION);
32  		deviceBuilder.deviceVersion(deviceVersion);
33  
34  		final String driverVersion = DeviceUtils.getDeviceInfoString(deviceId, CL.CL_DRIVER_VERSION);
35  		deviceBuilder.driverVersion(driverVersion);
36  
37  		final String builtInKernelsStr = DeviceUtils.getDeviceInfoString(deviceId, CL.CL_DEVICE_BUILT_IN_KERNELS);
38  		if (StringUtils.isNotBlank(builtInKernelsStr)) {
39  			final String[] builtInKernelsArr = builtInKernelsStr.split(";");
40  			if (builtInKernelsArr.length > 0) {
41  				deviceBuilder.addBuiltInKernels(builtInKernelsArr);
42  			}
43  		}
44  
45  		final long deviceTypeLong = DeviceUtils.getDeviceInfoLong(deviceId, CL.CL_DEVICE_TYPE);
46  		if (deviceTypeLong == CL.CL_DEVICE_TYPE_ALL) {
47  			deviceBuilder.addDeviceType(DeviceType.ALL);
48  		} else {
49  
50  			if ((deviceTypeLong & CL.CL_DEVICE_TYPE_DEFAULT) != 0) {
51  				deviceBuilder.addDeviceType(DeviceType.DEFAULT);
52  			}
53  			if ((deviceTypeLong & CL.CL_DEVICE_TYPE_CPU) != 0) {
54  				deviceBuilder.addDeviceType(DeviceType.CPU);
55  			}
56  			if ((deviceTypeLong & CL.CL_DEVICE_TYPE_GPU) != 0) {
57  				deviceBuilder.addDeviceType(DeviceType.GPU);
58  			}
59  			if ((deviceTypeLong & CL.CL_DEVICE_TYPE_ACCELERATOR) != 0) {
60  				deviceBuilder.addDeviceType(DeviceType.ACCELERATOR);
61  			}
62  			if ((deviceTypeLong & CL.CL_DEVICE_TYPE_CUSTOM) != 0) {
63  				deviceBuilder.addDeviceType(DeviceType.CUSTOM);
64  			}
65  		}
66  
67  		final int maxComputeUnits = DeviceUtils.getDeviceInfoInt(deviceId, CL.CL_DEVICE_MAX_COMPUTE_UNITS);
68  		deviceBuilder.maxComputeUnits(maxComputeUnits);
69  
70  		final int maxWorkItemDimensions = DeviceUtils.getDeviceInfoInt(deviceId, CL.CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS);
71  		deviceBuilder.maxWorkItemDimensions(maxWorkItemDimensions);
72  
73  		final int maxClockFrequency = DeviceUtils.getDeviceInfoInt(deviceId, CL.CL_DEVICE_MAX_CLOCK_FREQUENCY);
74  		deviceBuilder.maxClockFrequency(maxClockFrequency);
75  
76  		final int hasImageSupport = DeviceUtils.getDeviceInfoInt(deviceId, CL.CL_DEVICE_IMAGE_SUPPORT);
77  		deviceBuilder.imageSupport(hasImageSupport != 0);
78  
79  		final long maxWorkGroupSize = DeviceUtils.getDeviceInfoLong(deviceId, CL.CL_DEVICE_MAX_WORK_GROUP_SIZE);
80  		deviceBuilder.maxWorkGroupSize(maxWorkGroupSize);
81  
82  		final int preferredVectorWidthFloat = DeviceUtils
83  				.getDeviceInfoInt(deviceId, CL.CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT);
84  		deviceBuilder.preferredVectorWidthFloat(preferredVectorWidthFloat);
85  
86  		final long[] maxWorkItemSizes = DeviceUtils
87  				.getDeviceInfoLongArray(deviceId, CL.CL_DEVICE_MAX_WORK_ITEM_SIZES, maxWorkItemDimensions);
88  		deviceBuilder.maxWorkItemSizes(maxWorkItemSizes);
89  
90  		return deviceBuilder.build();
91  	}
92  }