annotate opencl/platform.d @ 0:3cea44337083

initial commit
author Trass3r
date Wed, 02 Dec 2009 17:40:59 +0100
parents
children c78ffc9a7434
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3cea44337083 initial commit
Trass3r
parents:
diff changeset
1 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
2 *
3cea44337083 initial commit
Trass3r
parents:
diff changeset
3 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
4 module opencl.platform;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
5
3cea44337083 initial commit
Trass3r
parents:
diff changeset
6 public import opencl.c.opencl;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
7 import opencl.device;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
8 import opencl.error;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
9 import opencl.wrapper;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
10
3cea44337083 initial commit
Trass3r
parents:
diff changeset
11 //! Platform class
3cea44337083 initial commit
Trass3r
parents:
diff changeset
12 class CLPlatform : CLWrapper!(cl_platform_id, clGetPlatformInfo)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
13 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
14 public:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
15 /// constructor
3cea44337083 initial commit
Trass3r
parents:
diff changeset
16 this(cl_platform_id platform)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
17 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
18 _object = platform;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
19 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
20
3cea44337083 initial commit
Trass3r
parents:
diff changeset
21 /// get the platform name
3cea44337083 initial commit
Trass3r
parents:
diff changeset
22 string name()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
23 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
24 return getStringInfo(CL_PLATFORM_NAME);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
25 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
26
3cea44337083 initial commit
Trass3r
parents:
diff changeset
27 /// get platform vendor
3cea44337083 initial commit
Trass3r
parents:
diff changeset
28 string vendor()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
29 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
30 return getStringInfo(CL_PLATFORM_VENDOR);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
31 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
32
3cea44337083 initial commit
Trass3r
parents:
diff changeset
33 /// get platform version
3cea44337083 initial commit
Trass3r
parents:
diff changeset
34 string clversion()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
35 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
36 return getStringInfo(CL_PLATFORM_VERSION);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
37 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
38
3cea44337083 initial commit
Trass3r
parents:
diff changeset
39 /// get platform profile
3cea44337083 initial commit
Trass3r
parents:
diff changeset
40 string profile()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
41 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
42 return getStringInfo(CL_PLATFORM_PROFILE);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
43 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
44
3cea44337083 initial commit
Trass3r
parents:
diff changeset
45 /// get platform extensions
3cea44337083 initial commit
Trass3r
parents:
diff changeset
46 string extensions()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
47 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
48 return getStringInfo(CL_PLATFORM_EXTENSIONS);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
49 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
50
3cea44337083 initial commit
Trass3r
parents:
diff changeset
51 /// returns a list of all devices available on the platform matching deviceType
3cea44337083 initial commit
Trass3r
parents:
diff changeset
52 CLDevice[] getDevices(cl_device_type deviceType)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
53 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
54 cl_uint numDevices;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
55 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
56
3cea44337083 initial commit
Trass3r
parents:
diff changeset
57 // get number of devices
3cea44337083 initial commit
Trass3r
parents:
diff changeset
58 res = clGetDeviceIDs(_object, deviceType, 0, null, &numDevices);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
59 switch(res)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
60 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
61 case CL_SUCCESS:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
62 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
63 case CL_INVALID_PLATFORM:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
64 throw new CLInvalidPlatformException();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
65 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
66 case CL_INVALID_DEVICE_TYPE:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
67 throw new CLInvalidDeviceTypeException("There's no such device type");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
68 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
69 case CL_DEVICE_NOT_FOUND:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
70 throw new CLDeviceNotFoundException("Couldn't find an OpenCL device matching the given type");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
71 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
72 default:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
73 throw new CLException(res, "unexpected error while getting device count");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
74 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
75
3cea44337083 initial commit
Trass3r
parents:
diff changeset
76 // get device IDs
3cea44337083 initial commit
Trass3r
parents:
diff changeset
77 auto deviceIDs = new cl_device_id[numDevices];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
78 res = clGetDeviceIDs(_object, deviceType, deviceIDs.length, deviceIDs.ptr, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
79 if(res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
80 throw new CLException(res);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
81
3cea44337083 initial commit
Trass3r
parents:
diff changeset
82 // create CLDevice array
3cea44337083 initial commit
Trass3r
parents:
diff changeset
83 auto devices = new CLDevice[numDevices];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
84 for(uint i=0; i<numDevices; i++)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
85 devices[i] = new CLDevice(this, deviceIDs[i]);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
86
3cea44337083 initial commit
Trass3r
parents:
diff changeset
87 return devices;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
88 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
89
3cea44337083 initial commit
Trass3r
parents:
diff changeset
90 /// returns a list of all devices
3cea44337083 initial commit
Trass3r
parents:
diff changeset
91 CLDevice[] allDevices() {return getDevices(CL_DEVICE_TYPE_ALL);}
3cea44337083 initial commit
Trass3r
parents:
diff changeset
92
3cea44337083 initial commit
Trass3r
parents:
diff changeset
93 /// returns a list of all CPU devices
3cea44337083 initial commit
Trass3r
parents:
diff changeset
94 CLDevice[] cpuDevices() {return getDevices(CL_DEVICE_TYPE_CPU);}
3cea44337083 initial commit
Trass3r
parents:
diff changeset
95
3cea44337083 initial commit
Trass3r
parents:
diff changeset
96 /// returns a list of all GPU devices
3cea44337083 initial commit
Trass3r
parents:
diff changeset
97 CLDevice[] gpuDevices() {return getDevices(CL_DEVICE_TYPE_GPU);}
3cea44337083 initial commit
Trass3r
parents:
diff changeset
98
3cea44337083 initial commit
Trass3r
parents:
diff changeset
99 /// returns a list of all accelerator devices
3cea44337083 initial commit
Trass3r
parents:
diff changeset
100 CLDevice[] accelDevices() {return getDevices(CL_DEVICE_TYPE_ACCELERATOR);}
3cea44337083 initial commit
Trass3r
parents:
diff changeset
101
3cea44337083 initial commit
Trass3r
parents:
diff changeset
102 /// get an array of all available platforms
3cea44337083 initial commit
Trass3r
parents:
diff changeset
103 static CLPlatform[] getPlatforms()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
104 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
105 cl_uint numPlatforms;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
106 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
107
3cea44337083 initial commit
Trass3r
parents:
diff changeset
108 // get number of platforms
3cea44337083 initial commit
Trass3r
parents:
diff changeset
109 res = clGetPlatformIDs(0, null, &numPlatforms);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
110 if(res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
111 throw new CLInvalidValueException();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
112
3cea44337083 initial commit
Trass3r
parents:
diff changeset
113 // get platform IDs
3cea44337083 initial commit
Trass3r
parents:
diff changeset
114 auto platformIDs = new cl_platform_id[numPlatforms];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
115 res = clGetPlatformIDs(platformIDs.length, platformIDs.ptr, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
116 if(res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
117 throw new CLInvalidValueException();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
118
3cea44337083 initial commit
Trass3r
parents:
diff changeset
119 // create CLPlatform array
3cea44337083 initial commit
Trass3r
parents:
diff changeset
120 auto platforms = new CLPlatform[numPlatforms];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
121 for(uint i=0; i<numPlatforms; i++)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
122 platforms[i] = new CLPlatform(platformIDs[i]);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
123
3cea44337083 initial commit
Trass3r
parents:
diff changeset
124 return platforms;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
125 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
126 }