1 package net.bmahe.genetics4j.gpu.opencl;
2
3 import java.util.Objects;
4
5 import org.apache.commons.lang3.Validate;
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_kernel;
11
12 import net.bmahe.genetics4j.gpu.opencl.model.KernelInfo;
13
14 public class KernelInfoReader {
15 public static final Logger logger = LogManager.getLogger(KernelInfoReader.class);
16
17 public KernelInfo read(final cl_device_id deviceId, final cl_kernel kernel, final String kernelName) {
18 Objects.requireNonNull(deviceId);
19 Objects.requireNonNull(kernel);
20 Validate.notBlank(kernelName);
21
22 final var kernelInfoBuilder = KernelInfo.builder();
23 kernelInfoBuilder.name(kernelName);
24
25 final long workGroupSize = KernelInfoUtils
26 .getKernelWorkGroupInfoLong(deviceId, kernel, CL.CL_KERNEL_WORK_GROUP_SIZE);
27 kernelInfoBuilder.workGroupSize(workGroupSize);
28
29 final long preferredWorkGroupSizeMultiple = KernelInfoUtils
30 .getKernelWorkGroupInfoLong(deviceId, kernel, CL.CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE);
31 kernelInfoBuilder.preferredWorkGroupSizeMultiple(preferredWorkGroupSizeMultiple);
32
33 final long localMemSize = KernelInfoUtils
34 .getKernelWorkGroupInfoLong(deviceId, kernel, CL.CL_KERNEL_LOCAL_MEM_SIZE);
35 kernelInfoBuilder.localMemSize(localMemSize);
36
37 final long privateMemSize = KernelInfoUtils
38 .getKernelWorkGroupInfoLong(deviceId, kernel, CL.CL_KERNEL_PRIVATE_MEM_SIZE);
39 kernelInfoBuilder.privateMemSize(privateMemSize);
40
41 return kernelInfoBuilder.build();
42 }
43 }