annotate opencl/program.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.program;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
5
3cea44337083 initial commit
Trass3r
parents:
diff changeset
6 import opencl.c.opencl;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
7 import opencl.wrapper;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
8 import opencl.device;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
9 import opencl.context;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
10 import opencl.error;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
11
3cea44337083 initial commit
Trass3r
parents:
diff changeset
12 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
13 * An OpenCL program consists of a set of kernels that are identified as functions declared with
3cea44337083 initial commit
Trass3r
parents:
diff changeset
14 * the __kernel qualifier in the program source. OpenCL programs may also contain auxiliary
3cea44337083 initial commit
Trass3r
parents:
diff changeset
15 * functions and constant data that can be used by __kernel functions. The program executable
3cea44337083 initial commit
Trass3r
parents:
diff changeset
16 * can be generated online or offline by the OpenCL compiler for the appropriate target device(s).
3cea44337083 initial commit
Trass3r
parents:
diff changeset
17 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
18 class CLProgram : CLWrapper!(cl_program, clGetProgramInfo)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
19 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
20 private:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
21 CLContext _context; // the context that contains this program
3cea44337083 initial commit
Trass3r
parents:
diff changeset
22 // CLDevice[] _devices; // can be subset specified with CreateWithBinary
3cea44337083 initial commit
Trass3r
parents:
diff changeset
23 string _sourceCode; // the OpenCL C source code
3cea44337083 initial commit
Trass3r
parents:
diff changeset
24 public:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
25 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
26 * creates a program object for a context, and loads the source code specified by the text strings in
3cea44337083 initial commit
Trass3r
parents:
diff changeset
27 * the strings array into the program object. The devices associated with the program object are the
3cea44337083 initial commit
Trass3r
parents:
diff changeset
28 * devices associated with context.
3cea44337083 initial commit
Trass3r
parents:
diff changeset
29 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
30 this(CLContext context, string sourceCode)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
31 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
32 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
33 size_t* lengths = cast(size_t*) [sourceCode.length];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
34 char** ptrs = cast(char**) [sourceCode.ptr];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
35 super(clCreateProgramWithSource(context.getObject(), 1, ptrs, lengths, &res));
3cea44337083 initial commit
Trass3r
parents:
diff changeset
36
3cea44337083 initial commit
Trass3r
parents:
diff changeset
37 switch (res)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
38 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
39 case CL_SUCCESS:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
40 _context = context; // TODO: ok like that?
3cea44337083 initial commit
Trass3r
parents:
diff changeset
41 _sourceCode = sourceCode;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
42 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
43 case CL_INVALID_CONTEXT:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
44 throw new CLInvalidContextException();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
45 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
46 case CL_INVALID_VALUE:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
47 throw new CLInvalidValueException("source code string pointer is invalid");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
48 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
49 case CL_OUT_OF_HOST_MEMORY:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
50 throw new CLOutOfHostMemoryException();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
51 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
52 default:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
53 throw new CLUnrecognizedException(res);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
54 break;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
55 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
56 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
57
3cea44337083 initial commit
Trass3r
parents:
diff changeset
58 ~this()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
59 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
60 release();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
61 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
62
3cea44337083 initial commit
Trass3r
parents:
diff changeset
63 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
64 * builds (compiles & links) a program executable from the program source or binary for all the
3cea44337083 initial commit
Trass3r
parents:
diff changeset
65 * devices or a specific device(s) in the OpenCL context associated with program. OpenCL allows
3cea44337083 initial commit
Trass3r
parents:
diff changeset
66 * program executables to be built using the source or the binary.
3cea44337083 initial commit
Trass3r
parents:
diff changeset
67 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
68 CLProgram build()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
69 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
70 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
71 res = clBuildProgram(_object, 0, null, null, null, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
72
3cea44337083 initial commit
Trass3r
parents:
diff changeset
73 return this;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
74 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
75
3cea44337083 initial commit
Trass3r
parents:
diff changeset
76 CLProgram buildDebug()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
77 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
78 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
79 res = clBuildProgram(_object, 0, null, "-Werror", null, null);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
80 return this;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
81 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
82
3cea44337083 initial commit
Trass3r
parents:
diff changeset
83 /// increments the context reference count
3cea44337083 initial commit
Trass3r
parents:
diff changeset
84 void retain()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
85 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
86 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
87 res = clRetainProgram(_object);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
88 if(res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
89 throw new CLInvalidProgramException("internal program object is not a valid OpenCL context");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
90 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
91
3cea44337083 initial commit
Trass3r
parents:
diff changeset
92 /// decrements the context reference count
3cea44337083 initial commit
Trass3r
parents:
diff changeset
93 void release()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
94 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
95 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
96 res = clReleaseContext(_object);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
97 if(res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
98 throw new CLInvalidProgramException("internal program object is not a valid OpenCL context");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
99 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
100
3cea44337083 initial commit
Trass3r
parents:
diff changeset
101 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
102 * allows the implementation to release the resources allocated by the OpenCL compiler. This is a
3cea44337083 initial commit
Trass3r
parents:
diff changeset
103 * hint from the application and does not guarantee that the compiler will not be used in the future
3cea44337083 initial commit
Trass3r
parents:
diff changeset
104 * or that the compiler will actually be unloaded by the implementation. Calls to clBuildProgram
3cea44337083 initial commit
Trass3r
parents:
diff changeset
105 * after clUnloadCompiler will reload the compiler, if necessary, to build the appropriate program executable.
3cea44337083 initial commit
Trass3r
parents:
diff changeset
106 *
3cea44337083 initial commit
Trass3r
parents:
diff changeset
107 * TODO: should this stay in this class?
3cea44337083 initial commit
Trass3r
parents:
diff changeset
108 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
109 static void unloadCompiler()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
110 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
111 cl_int res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
112 res = clUnloadCompiler();
3cea44337083 initial commit
Trass3r
parents:
diff changeset
113 if(res != CL_SUCCESS)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
114 throw new CLException(res, "failed unloading compiler, this shouldn't happen in OpenCL 1.0");
3cea44337083 initial commit
Trass3r
parents:
diff changeset
115 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
116
3cea44337083 initial commit
Trass3r
parents:
diff changeset
117 /// returns the program reference count
3cea44337083 initial commit
Trass3r
parents:
diff changeset
118 // TODO: make it package?
3cea44337083 initial commit
Trass3r
parents:
diff changeset
119 cl_uint referenceCount()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
120 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
121 return getInfo!(cl_uint)(CL_PROGRAM_REFERENCE_COUNT);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
122 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
123
3cea44337083 initial commit
Trass3r
parents:
diff changeset
124 /// TODO: check those stuff for consistency with getInfo results
3cea44337083 initial commit
Trass3r
parents:
diff changeset
125 CLContext context()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
126 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
127 return _context;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
128 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
129
3cea44337083 initial commit
Trass3r
parents:
diff changeset
130 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
131 * Return the list of devices associated with the program object. This can be the devices associated with context on
3cea44337083 initial commit
Trass3r
parents:
diff changeset
132 * which the program object has been created or can be a subset of devices that are specified when a progam object
3cea44337083 initial commit
Trass3r
parents:
diff changeset
133 * is created using clCreateProgramWithBinary
3cea44337083 initial commit
Trass3r
parents:
diff changeset
134 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
135 CLDevice[] devices()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
136 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
137 cl_device_id[] ids = getArrayInfo!(cl_device_id)(CL_PROGRAM_DEVICES);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
138 CLDevice[] res = new CLDevice[ids.length];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
139 for(uint i=0; i<ids.length, i++)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
140 res[i] = new CLDevice(ids[i]);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
141 return res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
142 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
143
3cea44337083 initial commit
Trass3r
parents:
diff changeset
144 ///
3cea44337083 initial commit
Trass3r
parents:
diff changeset
145 string sourceCode()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
146 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
147 return _sourceCode;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
148 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
149
3cea44337083 initial commit
Trass3r
parents:
diff changeset
150 /**
3cea44337083 initial commit
Trass3r
parents:
diff changeset
151 * Return the program binaries for all devices associated with the program.
3cea44337083 initial commit
Trass3r
parents:
diff changeset
152 * Returns:
3cea44337083 initial commit
Trass3r
parents:
diff changeset
153 */
3cea44337083 initial commit
Trass3r
parents:
diff changeset
154 ubyte[][] binaries()
3cea44337083 initial commit
Trass3r
parents:
diff changeset
155 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
156 // TODO: make sure binaries are available?
3cea44337083 initial commit
Trass3r
parents:
diff changeset
157 size_t[] sizes = getArrayInfo!(size_t)(CL_PROGRAM_BINARY_SIZES);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
158
3cea44337083 initial commit
Trass3r
parents:
diff changeset
159 ubyte*[] ptrs = getArrayInfo!(ubyte*)(CL_PROGRAM_BINARIES);
3cea44337083 initial commit
Trass3r
parents:
diff changeset
160
3cea44337083 initial commit
Trass3r
parents:
diff changeset
161 ubyte[][] res = new ubyte[][ptrs.length];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
162 for (uint i=0; i<ptrs.length; i++)
3cea44337083 initial commit
Trass3r
parents:
diff changeset
163 {
3cea44337083 initial commit
Trass3r
parents:
diff changeset
164 res[i] = ptrs[i][0 .. sizes[i]];
3cea44337083 initial commit
Trass3r
parents:
diff changeset
165 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
166
3cea44337083 initial commit
Trass3r
parents:
diff changeset
167 return res;
3cea44337083 initial commit
Trass3r
parents:
diff changeset
168 }
3cea44337083 initial commit
Trass3r
parents:
diff changeset
169 }