/*
* Encog(tm) Core v2.5 - Java Version
* http://www.heatonresearch.com/encog/
* http://code.google.com/p/encog-java/
* Copyright 2008-2010 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.engine.opencl;
import java.util.ArrayList;
import java.util.List;
import org.jocl.CL;
import org.jocl.Pointer;
import org.jocl.Sizeof;
import org.jocl.cl_context;
import org.jocl.cl_context_properties;
import org.jocl.cl_device_id;
import org.jocl.cl_platform_id;
/**
* An Encog CL platform.
*
*/
public class EncogCLPlatform extends EncogCLItem {
/**
* The OpenCL platform.
*/
private final cl_platform_id platform;
/**
* The OpenCL context for this platform. One context is created for each
* platform.W
*/
private final cl_context context;
/**
* All of the devices on this platform.
*/
private final List<EncogCLDevice> devices = new ArrayList<EncogCLDevice>();
/**
* Construct an OpenCL platform.
*
* @param platform
* The OpenCL platform.
*/
public EncogCLPlatform(final cl_platform_id platform) {
final long[] numBytes = new long[1];
this.platform = platform;
final cl_context_properties contextProperties
= new cl_context_properties();
contextProperties.addProperty(CL.CL_CONTEXT_PLATFORM, platform);
this.context = CL.clCreateContextFromType(contextProperties,
CL.CL_DEVICE_TYPE_ALL, null, null, null);
setName(getPlatformString(CL.CL_PLATFORM_NAME).trim());
setVender(getPlatformString(CL.CL_PLATFORM_VENDOR));
setEnabled(true);
CL.clGetContextInfo(this.context, CL.CL_CONTEXT_DEVICES, 0, null,
numBytes);
final int numDevices = (int) numBytes[0] / Sizeof.cl_device_id;
final cl_device_id[] devicesList = new cl_device_id[numDevices];
CL.clGetContextInfo(this.context, CL.CL_CONTEXT_DEVICES, numBytes[0],
Pointer.to(devicesList), null);
for (final cl_device_id deviceID : devicesList) {
final EncogCLDevice adapter = new EncogCLDevice(this, deviceID);
this.devices.add(adapter);
}
}
/**
* @return The context for this platform.
*/
public cl_context getContext() {
return this.context;
}
/**
* @return All devices on this platform.
*/
public List<EncogCLDevice> getDevices() {
return this.devices;
}
/**
* @return The OpenCL platform.
*/
public cl_platform_id getPlatform() {
return this.platform;
}
/**
* Get a config string from the platform.
*
* @param param
* The param to get.
* @return The config string.
*/
public String getPlatformString(final int param) {
final byte[] buffer = new byte[255];
final long[] len = new long[1];
CL.clGetPlatformInfo(this.platform, param, buffer.length, Pointer
.to(buffer), len);
final String name = new String(buffer, 0, (int) len[0]);
return name;
}
}