View Javadoc
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  }