Commit db47aedc5292c153dca880a43d0c6556bb0c316c

Authored by glaville
1 parent 1b1e928cc6
Exists in master

Refactor MCMContext to allow overriding device types searched by default

using the MCM_CONTEXT_TYPE environement variable, to simply benchmarking

Showing 1 changed file with 66 additions and 17 deletions Inline Diff

src/mcmas/core/MCMContext.java View file @ db47aed
package mcmas.core; 1 1 package mcmas.core;
2 2
import java.nio.Buffer; 3 3 import java.nio.Buffer;
4 4
import mcmas.utils.Objects7; 5 5 import mcmas.utils.Objects7;
6 6
import org.jocl.CL; 7 7 import org.jocl.CL;
import org.jocl.Pointer; 8 8 import org.jocl.Pointer;
import org.jocl.cl_context; 9 9 import org.jocl.cl_context;
import org.jocl.cl_device_id; 10 10 import org.jocl.cl_device_id;
import org.jocl.cl_image_format; 11 11 import org.jocl.cl_image_format;
import org.jocl.cl_platform_id; 12 12 import org.jocl.cl_platform_id;
13 13
14 14
public class MCMContext extends MCMObject { 15 15 public class MCMContext extends MCMObject {
16 16
private final cl_context context; 17 17 private final cl_context context;
//private final static Logger logger = LoggerFactory.getLogger(OCLContext.class); 18 18 //private final static Logger logger = LoggerFactory.getLogger(OCLContext.class);
19 19
20 /**
21 * Create a new context using the first available hardware among
22 * default devices types.
23 */
public MCMContext() { 20 24 public MCMContext() {
MCMPlatform[] platforms = MCMPlatform.getPlatforms(); 21 25 this(getDefaultContextTypes());
22
if (platforms.length <= 0) { 23
throw new RuntimeException("No OpenCL plaform found"); 24
} 25
26
this.context = MCMHelpers.createContextFromType(platforms[0].getId(), 27
CL.CL_DEVICE_TYPE_GPU, CL.CL_DEVICE_TYPE_CPU); 28
29
if (context == null) { 30
throw new RuntimeException("No CPU or GPU device found"); 31
} 32
} 33 26 }
34 27
public MCMContext(MCMPlatform platform) { 35 28 /**
this(platform, CL.CL_DEVICE_TYPE_GPU, CL.CL_DEVICE_TYPE_CPU); 36 29 * Create a new context using the first available hardware among
} 37 30 * indicated device types.
38 31 *
32 * @param deviceTypes device types to search for
33 */
public MCMContext(long... deviceTypes) { 39 34 public MCMContext(long... deviceTypes) {
MCMPlatform[] platforms = MCMPlatform.getPlatforms(); 40 35 MCMPlatform[] platforms = MCMPlatform.getPlatforms();
41 36
if (platforms.length <= 0) { 42 37 if (platforms.length <= 0) {
throw new RuntimeException("No OpenCL plaform found"); 43 38 throw new RuntimeException("No OpenCL platform found");
} 44 39 }
45 40
this.context = MCMHelpers.createContextFromType(platforms[0].getId(), deviceTypes); 46 41 this.context = MCMHelpers.createContextFromType(platforms[0].getId(), deviceTypes);
47 42
if (context == null) { 48 43 if (context == null) {
throw new RuntimeException("No OpenCL device found"); 49 44 throw new RuntimeException("No OpenCL device found");
} 50 45 }
} 51 46 }
52 47
48 /**
49 * Create a new context using the indicated platform.
50 *
51 * @param platform platform to consider
52 */
53 public MCMContext(MCMPlatform platform) {
54 this(platform, getDefaultContextTypes());
55 }
56
57 /**
58 * Create a new context using the indicated platform and device types.
59 *
60 * @param platform platform to consider
61 * @param deviceTypes device types to search for
62 */
public MCMContext(MCMPlatform platform, long... deviceTypes) { 53 63 public MCMContext(MCMPlatform platform, long... deviceTypes) {
platform = Objects7.requireNonNull(platform, "Can't create an OpenCL context with a null platform"); 54 64 platform = Objects7.requireNonNull(platform, "Can't create an OpenCL context with a null platform");
55 65
System.out.println("platform vendor : " + platform.getInfoString(CL.CL_PLATFORM_VENDOR)); 56 66 System.out.println("platform vendor : " + platform.getInfoString(CL.CL_PLATFORM_VENDOR));
System.out.println("platform name : " + platform.getInfoString(CL.CL_PLATFORM_NAME)); 57 67 System.out.println("platform name : " + platform.getInfoString(CL.CL_PLATFORM_NAME));
58 68
this.context = MCMHelpers.createContextFromType(platform.getId(), deviceTypes); 59 69 this.context = MCMHelpers.createContextFromType(platform.getId(), deviceTypes);
60 70
if (context == null) { 61 71 if (context == null) {
throw new RuntimeException("No OpenCL device found"); 62 72 throw new RuntimeException("No OpenCL device found");
} 63 73 }
} 64 74 }
65 75
76 /**
77 * Return a list of default device types to test when nothing
78 * is indicated at the MCMContext creation.
79 *
80 * The default list indicates to use these kind of hardware in this order:
81 * GPU, Accelerators (such as Xeon Phi) and CPU.
82 *
83 * It can be overriden using the MCM_CONTEXT_TYPE environment variable,
84 * which admits the following values: "CPU", "GPU", "ACCELERATOR", "ALL".
85 *
86 * "ALL" considers all the devices available on the system, but the
87 * order is not garanteed (even for the same type of device) and depends
88 * of the installed runtimes.
89 *
90 * @return a list of context type to try.
91 */
92 public static long[] getDefaultContextTypes() {
93 String context_type = System.getenv("MCM_CONTEXT_TYPE");
94
95 if ("CPU".equals(context_type)) {
96 return new long[] { CL.CL_DEVICE_TYPE_CPU };
97 } else if ("GPU".equals(context_type)) {
98 return new long[] { CL.CL_DEVICE_TYPE_GPU };
99 } else if ("ACCELERATOR".equals(context_type)) {
100 return new long[] { CL.CL_DEVICE_TYPE_ACCELERATOR };
101 } else if ("ALL".equals(context_type)) {
102 return new long[] { CL.CL_DEVICE_TYPE_ALL };
103 } else {
104 return new long[] {
105 CL.CL_DEVICE_TYPE_GPU,
106 CL.CL_DEVICE_TYPE_ACCELERATOR,
107 CL.CL_DEVICE_TYPE_CPU
108 };
109 }
110 }
111
public cl_context getContext() { 66 112 public cl_context getContext() {
return context; 67 113 return context;
} 68 114 }
69 115
public MCMPlatform[] getPlatforms() { 70 116 public MCMPlatform[] getPlatforms() {
cl_platform_id[] platform_ids = MCMHelpers.getPlatforms(); 71 117 cl_platform_id[] platform_ids = MCMHelpers.getPlatforms();
MCMPlatform[] platforms = new MCMPlatform[platform_ids.length]; 72 118 MCMPlatform[] platforms = new MCMPlatform[platform_ids.length];
73 119
for (int i = 0; i < platform_ids.length; i++) { 74 120 for (int i = 0; i < platform_ids.length; i++) {
platforms[i] = new MCMPlatform(platform_ids[i]); 75 121 platforms[i] = new MCMPlatform(platform_ids[i]);
} 76 122 }
77 123
return platforms; 78 124 return platforms;
} 79 125 }
80 126
public MCMDevice[] getDevices() { 81 127 public MCMDevice[] getDevices() {
cl_device_id[] device_ids = MCMHelpers.getDevices(context); 82 128 cl_device_id[] device_ids = MCMHelpers.getDevices(context);
MCMDevice[] devices = new MCMDevice[device_ids.length]; 83 129 MCMDevice[] devices = new MCMDevice[device_ids.length];
for (int i = 0; i < device_ids.length; i++) { 84 130 for (int i = 0; i < device_ids.length; i++) {
devices[i] = new MCMDevice(device_ids[i]); 85 131 devices[i] = new MCMDevice(device_ids[i]);
} 86 132 }
return devices; 87 133 return devices;
} 88 134 }
89 135
public MCMCommandQueue createCommandQueue(MCMCommandQueueProperty... properties) { 90 136 public MCMCommandQueue createCommandQueue(MCMCommandQueueProperty... properties) {
MCMCommandQueue q = new MCMCommandQueue(this, properties); 91 137 MCMCommandQueue q = new MCMCommandQueue(this, properties);
this.register(q); 92 138 this.register(q);
return q; 93 139 return q;
} 94 140 }
95 141
public MCMCommandQueue createCommandQueue(MCMDevice device, MCMCommandQueueProperty... properties) { 96 142 public MCMCommandQueue createCommandQueue(MCMDevice device, MCMCommandQueueProperty... properties) {
MCMCommandQueue q = new MCMCommandQueue(this, device, properties); 97 143 MCMCommandQueue q = new MCMCommandQueue(this, device, properties);
this.register(q); 98 144 this.register(q);
return q; 99 145 return q;
} 100 146 }
101 147
public MCMProgram createProgram(String source, String... options) { 102 148 public MCMProgram createProgram(String source, String... options) {
MCMProgram p = new MCMProgram(this, source, options); 103 149 MCMProgram p = new MCMProgram(this, source, options);
this.register(p); 104 150 this.register(p);
return p; 105 151 return p;
} 106 152 }
107 153
public MCMProgram createProgram(String source, MCMProgramOptions options) { 108 154 public MCMProgram createProgram(String source, MCMProgramOptions options) {
MCMProgram p = new MCMProgram(this, source, options.toString()); 109 155 MCMProgram p = new MCMProgram(this, source, options.toString());
this.register(p); 110 156 this.register(p);
return p; 111 157 return p;
} 112 158 }
113 159
public MCMProgram createProgramFromFile(String file, String... options) { 114 160 public MCMProgram createProgramFromFile(String file, String... options) {
MCMProgram p = new MCMProgram(this, MCMUtils.readFileAsString(file), options); 115 161 MCMProgram p = new MCMProgram(this, MCMUtils.readFileAsString(file), options);
this.register(p); 116 162 this.register(p);
return p; 117 163 return p;
} 118 164 }
119 165
public MCMProgram createProgramFromFile(String file, MCMProgramOptions options) { 120 166 public MCMProgram createProgramFromFile(String file, MCMProgramOptions options) {
MCMProgram p = new MCMProgram(this, MCMUtils.readFileAsString(file), options.toString()); 121 167 MCMProgram p = new MCMProgram(this, MCMUtils.readFileAsString(file), options.toString());
this.register(p); 122 168 this.register(p);
return p; 123 169 return p;
} 124 170 }
125 171
public MCMMemBuilder newBuffer() { 126 172 public MCMMemBuilder newBuffer() {
return new MCMMemBuilder(this); 127 173 return new MCMMemBuilder(this);
} 128 174 }
129 175
public MCMBufferBuilder newBuffer2() { 130 176 public MCMBufferBuilder newBuffer2() {
return new MCMBufferBuilder(this); 131 177 return new MCMBufferBuilder(this);
} 132 178 }