@@ -133,16 +133,21 @@ BENCHMARK_REGISTER_F(Device, clGetDeviceInfo);
133133
134134struct Kernel : public benchmark ::Fixture
135135{
136+ cl::CommandQueue queue;
136137 cl::Program program;
137138 cl::Kernel kernel;
138139
139140 virtual void SetUp (benchmark::State& state) override {
141+ queue = env.ioq ;
142+
140143 static const char kernelString[] = R"CLC( kernel void Empty(int a) {} )CLC" ;
141144
142145 program = cl::Program{env.context , kernelString};
143146
144147 program.build ();
145148 kernel = cl::Kernel{program, " Empty" };
149+
150+ kernel.setArg (0 , 0 );
146151 }
147152 virtual void TearDown (benchmark::State& state) override {
148153 program = NULL ;
@@ -163,6 +168,112 @@ BENCHMARK_DEFINE_F(Kernel, clSetKernelArg)(benchmark::State& state)
163168}
164169BENCHMARK_REGISTER_F (Kernel, clSetKernelArg);
165170
171+ BENCHMARK_DEFINE_F (Kernel, clEnqueueNDRangeKernel_NullQueueError)(benchmark::State& state)
172+ {
173+ const size_t work_dim = 1 ;
174+ const size_t global_work_size[work_dim] = { 1 };
175+ const size_t local_work_size[work_dim] = { 1 };
176+ const size_t global_work_offset[work_dim] = { 0 };
177+ while (state.KeepRunning ()) {
178+ clEnqueueNDRangeKernel (
179+ NULL ,
180+ kernel (),
181+ work_dim,
182+ NULL ,
183+ global_work_size,
184+ NULL ,
185+ 0 ,
186+ NULL ,
187+ NULL );
188+ }
189+ }
190+ BENCHMARK_REGISTER_F (Kernel, clEnqueueNDRangeKernel_NullQueueError);
191+
192+ BENCHMARK_DEFINE_F (Kernel, clEnqueueNDRangeKernel_NullKernelError)(benchmark::State& state)
193+ {
194+ const size_t work_dim = 1 ;
195+ const size_t global_work_size[work_dim] = { 1 };
196+ const size_t local_work_size[work_dim] = { 1 };
197+ const size_t global_work_offset[work_dim] = { 0 };
198+ while (state.KeepRunning ()) {
199+ clEnqueueNDRangeKernel (
200+ queue (),
201+ NULL ,
202+ work_dim,
203+ NULL ,
204+ global_work_size,
205+ NULL ,
206+ 0 ,
207+ NULL ,
208+ NULL );
209+ }
210+ }
211+ BENCHMARK_REGISTER_F (Kernel, clEnqueueNDRangeKernel_NullKernelError);
212+
213+ BENCHMARK_DEFINE_F (Kernel, clEnqueueNDRangeKernel_1x1_NoEvent)(benchmark::State& state)
214+ {
215+ const int flushFrequency = (int )state.range (0 );
216+
217+ const size_t work_dim = 1 ;
218+ const size_t global_work_size[work_dim] = { 1 };
219+ const size_t local_work_size[work_dim] = { 1 };
220+ const size_t global_work_offset[work_dim] = { 0 };
221+
222+ size_t count = 0 ;
223+
224+ while (state.KeepRunning ()) {
225+ clEnqueueNDRangeKernel (
226+ queue (),
227+ kernel (),
228+ work_dim,
229+ NULL ,
230+ global_work_size,
231+ local_work_size,
232+ 0 ,
233+ NULL ,
234+ NULL );
235+ if (++count % flushFrequency) {
236+ clFlush (queue ());
237+ }
238+ }
239+
240+ clFinish (queue ());
241+ }
242+ BENCHMARK_REGISTER_F (Kernel, clEnqueueNDRangeKernel_1x1_NoEvent)->Arg(1 )->Arg(32 )->Arg(512 )->Arg(2048 );
243+
244+ BENCHMARK_DEFINE_F (Kernel, clEnqueueNDRangeKernel_1x1_Event)(benchmark::State& state)
245+ {
246+ const int flushFrequency = (int )state.range (0 );
247+
248+ const size_t work_dim = 1 ;
249+ const size_t global_work_size[work_dim] = { 1 };
250+ const size_t local_work_size[work_dim] = { 1 };
251+ const size_t global_work_offset[work_dim] = { 0 };
252+
253+ size_t count = 0 ;
254+
255+ while (state.KeepRunning ()) {
256+ cl_event event = NULL ;
257+ clEnqueueNDRangeKernel (
258+ queue (),
259+ kernel (),
260+ work_dim,
261+ NULL ,
262+ global_work_size,
263+ local_work_size,
264+ 0 ,
265+ NULL ,
266+ &event );
267+ clReleaseEvent (event);
268+ if (++count % flushFrequency) {
269+ clFlush (queue ());
270+ }
271+ }
272+
273+ clFinish (queue ());
274+ }
275+ BENCHMARK_REGISTER_F (Kernel, clEnqueueNDRangeKernel_1x1_Event)->Arg(1 )->Arg(32 )->Arg(512 )->Arg(2048 );
276+
166277struct SVMKernel : public benchmark ::Fixture
167278{
168279 cl::Program program;
0 commit comments