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 }