1*1cd03ba3SJeremy Kemp #include <clpeak.h>
2*1cd03ba3SJeremy Kemp
runTransferBandwidthTest(cl::CommandQueue & queue,cl::Program & prog,device_info_t & devInfo)3*1cd03ba3SJeremy Kemp int clPeak::runTransferBandwidthTest(cl::CommandQueue &queue, cl::Program &prog, device_info_t &devInfo)
4*1cd03ba3SJeremy Kemp {
5*1cd03ba3SJeremy Kemp if (!isTransferBW)
6*1cd03ba3SJeremy Kemp return 0;
7*1cd03ba3SJeremy Kemp
8*1cd03ba3SJeremy Kemp float timed, gbps;
9*1cd03ba3SJeremy Kemp cl::NDRange globalSize, localSize;
10*1cd03ba3SJeremy Kemp cl::Context ctx = queue.getInfo<CL_QUEUE_CONTEXT>();
11*1cd03ba3SJeremy Kemp uint iters = devInfo.transferBWIters;
12*1cd03ba3SJeremy Kemp Timer timer;
13*1cd03ba3SJeremy Kemp float *arr = NULL;
14*1cd03ba3SJeremy Kemp
15*1cd03ba3SJeremy Kemp uint64_t maxItems = devInfo.maxAllocSize / sizeof(float) / 2;
16*1cd03ba3SJeremy Kemp uint64_t numItems = roundToMultipleOf(maxItems, devInfo.maxWGSize, devInfo.transferBWMaxSize);
17*1cd03ba3SJeremy Kemp
18*1cd03ba3SJeremy Kemp try
19*1cd03ba3SJeremy Kemp {
20*1cd03ba3SJeremy Kemp arr = new float[numItems];
21*1cd03ba3SJeremy Kemp memset(arr, 0, numItems * sizeof(float));
22*1cd03ba3SJeremy Kemp cl::Buffer clBuffer = cl::Buffer(ctx, (CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR), (numItems * sizeof(float)));
23*1cd03ba3SJeremy Kemp
24*1cd03ba3SJeremy Kemp log->print(NEWLINE TAB TAB "Transfer bandwidth (GBPS)" NEWLINE);
25*1cd03ba3SJeremy Kemp log->xmlOpenTag("transfer_bandwidth");
26*1cd03ba3SJeremy Kemp log->xmlAppendAttribs("unit", "gbps");
27*1cd03ba3SJeremy Kemp
28*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
29*1cd03ba3SJeremy Kemp // enqueueWriteBuffer
30*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB "enqueueWriteBuffer : ");
31*1cd03ba3SJeremy Kemp
32*1cd03ba3SJeremy Kemp // Dummy warm-up
33*1cd03ba3SJeremy Kemp queue.enqueueWriteBuffer(clBuffer, CL_TRUE, 0, (numItems * sizeof(float)), arr);
34*1cd03ba3SJeremy Kemp queue.finish();
35*1cd03ba3SJeremy Kemp
36*1cd03ba3SJeremy Kemp timed = 0;
37*1cd03ba3SJeremy Kemp
38*1cd03ba3SJeremy Kemp if (useEventTimer)
39*1cd03ba3SJeremy Kemp {
40*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
41*1cd03ba3SJeremy Kemp {
42*1cd03ba3SJeremy Kemp cl::Event timeEvent;
43*1cd03ba3SJeremy Kemp queue.enqueueWriteBuffer(clBuffer, CL_TRUE, 0, (numItems * sizeof(float)), arr, NULL, &timeEvent);
44*1cd03ba3SJeremy Kemp queue.finish();
45*1cd03ba3SJeremy Kemp timed += timeInUS(timeEvent);
46*1cd03ba3SJeremy Kemp }
47*1cd03ba3SJeremy Kemp }
48*1cd03ba3SJeremy Kemp else
49*1cd03ba3SJeremy Kemp {
50*1cd03ba3SJeremy Kemp Timer timer;
51*1cd03ba3SJeremy Kemp
52*1cd03ba3SJeremy Kemp timer.start();
53*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
54*1cd03ba3SJeremy Kemp {
55*1cd03ba3SJeremy Kemp queue.enqueueWriteBuffer(clBuffer, CL_TRUE, 0, (numItems * sizeof(float)), arr);
56*1cd03ba3SJeremy Kemp }
57*1cd03ba3SJeremy Kemp queue.finish();
58*1cd03ba3SJeremy Kemp timed = timer.stopAndTime();
59*1cd03ba3SJeremy Kemp }
60*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
61*1cd03ba3SJeremy Kemp
62*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
63*1cd03ba3SJeremy Kemp log->print(gbps);
64*1cd03ba3SJeremy Kemp log->print(NEWLINE);
65*1cd03ba3SJeremy Kemp log->xmlRecord("enqueuewritebuffer", gbps);
66*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
67*1cd03ba3SJeremy Kemp // enqueueReadBuffer
68*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB "enqueueReadBuffer : ");
69*1cd03ba3SJeremy Kemp
70*1cd03ba3SJeremy Kemp // Dummy warm-up
71*1cd03ba3SJeremy Kemp queue.enqueueReadBuffer(clBuffer, CL_TRUE, 0, (numItems * sizeof(float)), arr);
72*1cd03ba3SJeremy Kemp queue.finish();
73*1cd03ba3SJeremy Kemp
74*1cd03ba3SJeremy Kemp timed = 0;
75*1cd03ba3SJeremy Kemp if (useEventTimer)
76*1cd03ba3SJeremy Kemp {
77*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
78*1cd03ba3SJeremy Kemp {
79*1cd03ba3SJeremy Kemp cl::Event timeEvent;
80*1cd03ba3SJeremy Kemp queue.enqueueReadBuffer(clBuffer, CL_TRUE, 0, (numItems * sizeof(float)), arr, NULL, &timeEvent);
81*1cd03ba3SJeremy Kemp queue.finish();
82*1cd03ba3SJeremy Kemp timed += timeInUS(timeEvent);
83*1cd03ba3SJeremy Kemp }
84*1cd03ba3SJeremy Kemp }
85*1cd03ba3SJeremy Kemp else
86*1cd03ba3SJeremy Kemp {
87*1cd03ba3SJeremy Kemp Timer timer;
88*1cd03ba3SJeremy Kemp
89*1cd03ba3SJeremy Kemp timer.start();
90*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
91*1cd03ba3SJeremy Kemp {
92*1cd03ba3SJeremy Kemp queue.enqueueReadBuffer(clBuffer, CL_TRUE, 0, (numItems * sizeof(float)), arr);
93*1cd03ba3SJeremy Kemp }
94*1cd03ba3SJeremy Kemp queue.finish();
95*1cd03ba3SJeremy Kemp timed = timer.stopAndTime();
96*1cd03ba3SJeremy Kemp }
97*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
98*1cd03ba3SJeremy Kemp
99*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
100*1cd03ba3SJeremy Kemp log->print(gbps);
101*1cd03ba3SJeremy Kemp log->print(NEWLINE);
102*1cd03ba3SJeremy Kemp log->xmlRecord("enqueuereadbuffer", gbps);
103*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
104*1cd03ba3SJeremy Kemp // enqueueWriteBuffer non-blocking
105*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB "enqueueWriteBuffer non-blocking : ");
106*1cd03ba3SJeremy Kemp
107*1cd03ba3SJeremy Kemp // Dummy warm-up
108*1cd03ba3SJeremy Kemp queue.enqueueWriteBuffer(clBuffer, CL_FALSE, 0, (numItems * sizeof(float)), arr);
109*1cd03ba3SJeremy Kemp queue.finish();
110*1cd03ba3SJeremy Kemp
111*1cd03ba3SJeremy Kemp timed = 0;
112*1cd03ba3SJeremy Kemp
113*1cd03ba3SJeremy Kemp if (useEventTimer)
114*1cd03ba3SJeremy Kemp {
115*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
116*1cd03ba3SJeremy Kemp {
117*1cd03ba3SJeremy Kemp cl::Event timeEvent;
118*1cd03ba3SJeremy Kemp queue.enqueueWriteBuffer(clBuffer, CL_FALSE, 0, (numItems * sizeof(float)), arr, NULL, &timeEvent);
119*1cd03ba3SJeremy Kemp queue.finish();
120*1cd03ba3SJeremy Kemp timed += timeInUS(timeEvent);
121*1cd03ba3SJeremy Kemp }
122*1cd03ba3SJeremy Kemp }
123*1cd03ba3SJeremy Kemp else
124*1cd03ba3SJeremy Kemp {
125*1cd03ba3SJeremy Kemp Timer timer;
126*1cd03ba3SJeremy Kemp
127*1cd03ba3SJeremy Kemp timer.start();
128*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
129*1cd03ba3SJeremy Kemp {
130*1cd03ba3SJeremy Kemp queue.enqueueWriteBuffer(clBuffer, CL_FALSE, 0, (numItems * sizeof(float)), arr);
131*1cd03ba3SJeremy Kemp }
132*1cd03ba3SJeremy Kemp queue.finish();
133*1cd03ba3SJeremy Kemp timed = timer.stopAndTime();
134*1cd03ba3SJeremy Kemp }
135*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
136*1cd03ba3SJeremy Kemp
137*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
138*1cd03ba3SJeremy Kemp log->print(gbps);
139*1cd03ba3SJeremy Kemp log->print(NEWLINE);
140*1cd03ba3SJeremy Kemp log->xmlRecord("enqueuewritebuffer_nonblocking", gbps);
141*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
142*1cd03ba3SJeremy Kemp // enqueueReadBuffer non-blocking
143*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB "enqueueReadBuffer non-blocking : ");
144*1cd03ba3SJeremy Kemp
145*1cd03ba3SJeremy Kemp // Dummy warm-up
146*1cd03ba3SJeremy Kemp queue.enqueueReadBuffer(clBuffer, CL_FALSE, 0, (numItems * sizeof(float)), arr);
147*1cd03ba3SJeremy Kemp queue.finish();
148*1cd03ba3SJeremy Kemp
149*1cd03ba3SJeremy Kemp timed = 0;
150*1cd03ba3SJeremy Kemp if (useEventTimer)
151*1cd03ba3SJeremy Kemp {
152*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
153*1cd03ba3SJeremy Kemp {
154*1cd03ba3SJeremy Kemp cl::Event timeEvent;
155*1cd03ba3SJeremy Kemp queue.enqueueReadBuffer(clBuffer, CL_FALSE, 0, (numItems * sizeof(float)), arr, NULL, &timeEvent);
156*1cd03ba3SJeremy Kemp queue.finish();
157*1cd03ba3SJeremy Kemp timed += timeInUS(timeEvent);
158*1cd03ba3SJeremy Kemp }
159*1cd03ba3SJeremy Kemp }
160*1cd03ba3SJeremy Kemp else
161*1cd03ba3SJeremy Kemp {
162*1cd03ba3SJeremy Kemp Timer timer;
163*1cd03ba3SJeremy Kemp
164*1cd03ba3SJeremy Kemp timer.start();
165*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
166*1cd03ba3SJeremy Kemp {
167*1cd03ba3SJeremy Kemp queue.enqueueReadBuffer(clBuffer, CL_FALSE, 0, (numItems * sizeof(float)), arr);
168*1cd03ba3SJeremy Kemp }
169*1cd03ba3SJeremy Kemp queue.finish();
170*1cd03ba3SJeremy Kemp timed = timer.stopAndTime();
171*1cd03ba3SJeremy Kemp }
172*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
173*1cd03ba3SJeremy Kemp
174*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
175*1cd03ba3SJeremy Kemp log->print(gbps);
176*1cd03ba3SJeremy Kemp log->print(NEWLINE);
177*1cd03ba3SJeremy Kemp log->xmlRecord("enqueuereadbuffer_nonblocking", gbps);
178*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
179*1cd03ba3SJeremy Kemp // enqueueMapBuffer
180*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB "enqueueMapBuffer(for read) : ");
181*1cd03ba3SJeremy Kemp
182*1cd03ba3SJeremy Kemp queue.finish();
183*1cd03ba3SJeremy Kemp
184*1cd03ba3SJeremy Kemp timed = 0;
185*1cd03ba3SJeremy Kemp if (useEventTimer)
186*1cd03ba3SJeremy Kemp {
187*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
188*1cd03ba3SJeremy Kemp {
189*1cd03ba3SJeremy Kemp cl::Event timeEvent;
190*1cd03ba3SJeremy Kemp void *mapPtr;
191*1cd03ba3SJeremy Kemp
192*1cd03ba3SJeremy Kemp mapPtr = queue.enqueueMapBuffer(clBuffer, CL_TRUE, CL_MAP_READ, 0, (numItems * sizeof(float)), NULL, &timeEvent);
193*1cd03ba3SJeremy Kemp queue.finish();
194*1cd03ba3SJeremy Kemp queue.enqueueUnmapMemObject(clBuffer, mapPtr);
195*1cd03ba3SJeremy Kemp queue.finish();
196*1cd03ba3SJeremy Kemp timed += timeInUS(timeEvent);
197*1cd03ba3SJeremy Kemp }
198*1cd03ba3SJeremy Kemp }
199*1cd03ba3SJeremy Kemp else
200*1cd03ba3SJeremy Kemp {
201*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
202*1cd03ba3SJeremy Kemp {
203*1cd03ba3SJeremy Kemp Timer timer;
204*1cd03ba3SJeremy Kemp void *mapPtr;
205*1cd03ba3SJeremy Kemp
206*1cd03ba3SJeremy Kemp timer.start();
207*1cd03ba3SJeremy Kemp mapPtr = queue.enqueueMapBuffer(clBuffer, CL_TRUE, CL_MAP_READ, 0, (numItems * sizeof(float)));
208*1cd03ba3SJeremy Kemp queue.finish();
209*1cd03ba3SJeremy Kemp timed += timer.stopAndTime();
210*1cd03ba3SJeremy Kemp
211*1cd03ba3SJeremy Kemp queue.enqueueUnmapMemObject(clBuffer, mapPtr);
212*1cd03ba3SJeremy Kemp queue.finish();
213*1cd03ba3SJeremy Kemp }
214*1cd03ba3SJeremy Kemp }
215*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
216*1cd03ba3SJeremy Kemp
217*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
218*1cd03ba3SJeremy Kemp log->print(gbps);
219*1cd03ba3SJeremy Kemp log->print(NEWLINE);
220*1cd03ba3SJeremy Kemp log->xmlRecord("enqueuemapbuffer", gbps);
221*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
222*1cd03ba3SJeremy Kemp
223*1cd03ba3SJeremy Kemp // memcpy from mapped ptr
224*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB TAB "memcpy from mapped ptr : ");
225*1cd03ba3SJeremy Kemp queue.finish();
226*1cd03ba3SJeremy Kemp
227*1cd03ba3SJeremy Kemp timed = 0;
228*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
229*1cd03ba3SJeremy Kemp {
230*1cd03ba3SJeremy Kemp cl::Event timeEvent;
231*1cd03ba3SJeremy Kemp void *mapPtr;
232*1cd03ba3SJeremy Kemp
233*1cd03ba3SJeremy Kemp mapPtr = queue.enqueueMapBuffer(clBuffer, CL_TRUE, CL_MAP_READ, 0, (numItems * sizeof(float)));
234*1cd03ba3SJeremy Kemp queue.finish();
235*1cd03ba3SJeremy Kemp
236*1cd03ba3SJeremy Kemp timer.start();
237*1cd03ba3SJeremy Kemp memcpy(arr, mapPtr, (numItems * sizeof(float)));
238*1cd03ba3SJeremy Kemp timed += timer.stopAndTime();
239*1cd03ba3SJeremy Kemp
240*1cd03ba3SJeremy Kemp queue.enqueueUnmapMemObject(clBuffer, mapPtr);
241*1cd03ba3SJeremy Kemp queue.finish();
242*1cd03ba3SJeremy Kemp }
243*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
244*1cd03ba3SJeremy Kemp
245*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
246*1cd03ba3SJeremy Kemp log->print(gbps);
247*1cd03ba3SJeremy Kemp log->print(NEWLINE);
248*1cd03ba3SJeremy Kemp log->xmlRecord("memcpy_from_mapped_ptr", gbps);
249*1cd03ba3SJeremy Kemp
250*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
251*1cd03ba3SJeremy Kemp
252*1cd03ba3SJeremy Kemp // enqueueUnmap
253*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB "enqueueUnmap(after write) : ");
254*1cd03ba3SJeremy Kemp
255*1cd03ba3SJeremy Kemp queue.finish();
256*1cd03ba3SJeremy Kemp
257*1cd03ba3SJeremy Kemp timed = 0;
258*1cd03ba3SJeremy Kemp if (useEventTimer)
259*1cd03ba3SJeremy Kemp {
260*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
261*1cd03ba3SJeremy Kemp {
262*1cd03ba3SJeremy Kemp cl::Event timeEvent;
263*1cd03ba3SJeremy Kemp void *mapPtr;
264*1cd03ba3SJeremy Kemp
265*1cd03ba3SJeremy Kemp mapPtr = queue.enqueueMapBuffer(clBuffer, CL_TRUE, CL_MAP_WRITE, 0, (numItems * sizeof(float)));
266*1cd03ba3SJeremy Kemp queue.finish();
267*1cd03ba3SJeremy Kemp queue.enqueueUnmapMemObject(clBuffer, mapPtr, NULL, &timeEvent);
268*1cd03ba3SJeremy Kemp queue.finish();
269*1cd03ba3SJeremy Kemp timed += timeInUS(timeEvent);
270*1cd03ba3SJeremy Kemp }
271*1cd03ba3SJeremy Kemp }
272*1cd03ba3SJeremy Kemp else
273*1cd03ba3SJeremy Kemp {
274*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
275*1cd03ba3SJeremy Kemp {
276*1cd03ba3SJeremy Kemp Timer timer;
277*1cd03ba3SJeremy Kemp void *mapPtr;
278*1cd03ba3SJeremy Kemp
279*1cd03ba3SJeremy Kemp mapPtr = queue.enqueueMapBuffer(clBuffer, CL_TRUE, CL_MAP_WRITE, 0, (numItems * sizeof(float)));
280*1cd03ba3SJeremy Kemp queue.finish();
281*1cd03ba3SJeremy Kemp
282*1cd03ba3SJeremy Kemp timer.start();
283*1cd03ba3SJeremy Kemp queue.enqueueUnmapMemObject(clBuffer, mapPtr);
284*1cd03ba3SJeremy Kemp queue.finish();
285*1cd03ba3SJeremy Kemp timed += timer.stopAndTime();
286*1cd03ba3SJeremy Kemp }
287*1cd03ba3SJeremy Kemp }
288*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
289*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
290*1cd03ba3SJeremy Kemp
291*1cd03ba3SJeremy Kemp log->print(gbps);
292*1cd03ba3SJeremy Kemp log->print(NEWLINE);
293*1cd03ba3SJeremy Kemp log->xmlRecord("enqueueunmap", gbps);
294*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
295*1cd03ba3SJeremy Kemp
296*1cd03ba3SJeremy Kemp // memcpy to mapped ptr
297*1cd03ba3SJeremy Kemp log->print(TAB TAB TAB TAB "memcpy to mapped ptr : ");
298*1cd03ba3SJeremy Kemp queue.finish();
299*1cd03ba3SJeremy Kemp
300*1cd03ba3SJeremy Kemp timed = 0;
301*1cd03ba3SJeremy Kemp for (uint i = 0; i < iters; i++)
302*1cd03ba3SJeremy Kemp {
303*1cd03ba3SJeremy Kemp cl::Event timeEvent;
304*1cd03ba3SJeremy Kemp void *mapPtr;
305*1cd03ba3SJeremy Kemp
306*1cd03ba3SJeremy Kemp mapPtr = queue.enqueueMapBuffer(clBuffer, CL_TRUE, CL_MAP_WRITE, 0, (numItems * sizeof(float)));
307*1cd03ba3SJeremy Kemp queue.finish();
308*1cd03ba3SJeremy Kemp
309*1cd03ba3SJeremy Kemp timer.start();
310*1cd03ba3SJeremy Kemp memcpy(mapPtr, arr, (numItems * sizeof(float)));
311*1cd03ba3SJeremy Kemp timed += timer.stopAndTime();
312*1cd03ba3SJeremy Kemp
313*1cd03ba3SJeremy Kemp queue.enqueueUnmapMemObject(clBuffer, mapPtr);
314*1cd03ba3SJeremy Kemp queue.finish();
315*1cd03ba3SJeremy Kemp }
316*1cd03ba3SJeremy Kemp timed /= static_cast<float>(iters);
317*1cd03ba3SJeremy Kemp
318*1cd03ba3SJeremy Kemp gbps = ((float)numItems * sizeof(float)) / timed / 1e3f;
319*1cd03ba3SJeremy Kemp log->print(gbps);
320*1cd03ba3SJeremy Kemp log->print(NEWLINE);
321*1cd03ba3SJeremy Kemp log->xmlRecord("memcpy_to_mapped_ptr", gbps);
322*1cd03ba3SJeremy Kemp
323*1cd03ba3SJeremy Kemp ///////////////////////////////////////////////////////////////////////////
324*1cd03ba3SJeremy Kemp log->xmlCloseTag(); // transfer_bandwidth
325*1cd03ba3SJeremy Kemp
326*1cd03ba3SJeremy Kemp if (arr)
327*1cd03ba3SJeremy Kemp delete[] arr;
328*1cd03ba3SJeremy Kemp }
329*1cd03ba3SJeremy Kemp catch (cl::Error &error)
330*1cd03ba3SJeremy Kemp {
331*1cd03ba3SJeremy Kemp stringstream ss;
332*1cd03ba3SJeremy Kemp ss << error.what() << " (" << error.err() << ")" NEWLINE
333*1cd03ba3SJeremy Kemp << TAB TAB TAB "Tests skipped" NEWLINE;
334*1cd03ba3SJeremy Kemp log->print(ss.str());
335*1cd03ba3SJeremy Kemp
336*1cd03ba3SJeremy Kemp if (arr)
337*1cd03ba3SJeremy Kemp {
338*1cd03ba3SJeremy Kemp delete[] arr;
339*1cd03ba3SJeremy Kemp }
340*1cd03ba3SJeremy Kemp return -1;
341*1cd03ba3SJeremy Kemp }
342*1cd03ba3SJeremy Kemp
343*1cd03ba3SJeremy Kemp return 0;
344*1cd03ba3SJeremy Kemp }
345