Mercurial > projects > cl4d
view opencl/platform.d @ 0:3cea44337083
initial commit
author | Trass3r |
---|---|
date | Wed, 02 Dec 2009 17:40:59 +0100 |
parents | |
children | c78ffc9a7434 |
line wrap: on
line source
/** * */ module opencl.platform; public import opencl.c.opencl; import opencl.device; import opencl.error; import opencl.wrapper; //! Platform class class CLPlatform : CLWrapper!(cl_platform_id, clGetPlatformInfo) { public: /// constructor this(cl_platform_id platform) { _object = platform; } /// get the platform name string name() { return getStringInfo(CL_PLATFORM_NAME); } /// get platform vendor string vendor() { return getStringInfo(CL_PLATFORM_VENDOR); } /// get platform version string clversion() { return getStringInfo(CL_PLATFORM_VERSION); } /// get platform profile string profile() { return getStringInfo(CL_PLATFORM_PROFILE); } /// get platform extensions string extensions() { return getStringInfo(CL_PLATFORM_EXTENSIONS); } /// returns a list of all devices available on the platform matching deviceType CLDevice[] getDevices(cl_device_type deviceType) { cl_uint numDevices; cl_int res; // get number of devices res = clGetDeviceIDs(_object, deviceType, 0, null, &numDevices); switch(res) { case CL_SUCCESS: break; case CL_INVALID_PLATFORM: throw new CLInvalidPlatformException(); break; case CL_INVALID_DEVICE_TYPE: throw new CLInvalidDeviceTypeException("There's no such device type"); break; case CL_DEVICE_NOT_FOUND: throw new CLDeviceNotFoundException("Couldn't find an OpenCL device matching the given type"); break; default: throw new CLException(res, "unexpected error while getting device count"); } // get device IDs auto deviceIDs = new cl_device_id[numDevices]; res = clGetDeviceIDs(_object, deviceType, deviceIDs.length, deviceIDs.ptr, null); if(res != CL_SUCCESS) throw new CLException(res); // create CLDevice array auto devices = new CLDevice[numDevices]; for(uint i=0; i<numDevices; i++) devices[i] = new CLDevice(this, deviceIDs[i]); return devices; } /// returns a list of all devices CLDevice[] allDevices() {return getDevices(CL_DEVICE_TYPE_ALL);} /// returns a list of all CPU devices CLDevice[] cpuDevices() {return getDevices(CL_DEVICE_TYPE_CPU);} /// returns a list of all GPU devices CLDevice[] gpuDevices() {return getDevices(CL_DEVICE_TYPE_GPU);} /// returns a list of all accelerator devices CLDevice[] accelDevices() {return getDevices(CL_DEVICE_TYPE_ACCELERATOR);} /// get an array of all available platforms static CLPlatform[] getPlatforms() { cl_uint numPlatforms; cl_int res; // get number of platforms res = clGetPlatformIDs(0, null, &numPlatforms); if(res != CL_SUCCESS) throw new CLInvalidValueException(); // get platform IDs auto platformIDs = new cl_platform_id[numPlatforms]; res = clGetPlatformIDs(platformIDs.length, platformIDs.ptr, null); if(res != CL_SUCCESS) throw new CLInvalidValueException(); // create CLPlatform array auto platforms = new CLPlatform[numPlatforms]; for(uint i=0; i<numPlatforms; i++) platforms[i] = new CLPlatform(platformIDs[i]); return platforms; } }