1 //
2 // Copyright (c) 2017 The Khronos Group Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 #include "harness/os_helpers.h"
17
18 #include <string.h>
19 #include <errno.h>
20 #include <memory>
21
22 #if ! defined( _WIN32)
23 #if defined(__APPLE__)
24 #include <sys/sysctl.h>
25 #endif
26 #include <unistd.h>
27 #define streamDup(fd1) dup(fd1)
28 #define streamDup2(fd1,fd2) dup2(fd1,fd2)
29 #endif
30 #include <limits.h>
31 #include <time.h>
32 #include "test_printf.h"
33
34 #if defined(_WIN32)
35 #include <io.h>
36 #define streamDup(fd1) _dup(fd1)
37 #define streamDup2(fd1,fd2) _dup2(fd1,fd2)
38 #endif
39
40 #include "harness/testHarness.h"
41 #include "harness/errorHelpers.h"
42 #include "harness/kernelHelpers.h"
43 #include "harness/parseParameters.h"
44
45 #include <CL/cl_ext.h>
46
47 typedef unsigned int uint32_t;
48
49
50 test_status InitCL( cl_device_id device );
51
52 //-----------------------------------------
53 // Static helper functions declaration
54 //-----------------------------------------
55
56 static void printUsage( void );
57
58 //Stream helper functions
59
60 //Associate stdout stream with the file(gFileName):i.e redirect stdout stream to the specific files (gFileName)
61 static int acquireOutputStream(int* error);
62
63 //Close the file(gFileName) associated with the stdout stream and disassociates it.
64 static void releaseOutputStream(int fd);
65
66 //Get analysis buffer to verify the correctess of printed data
67 static void getAnalysisBuffer(char* analysisBuffer);
68
69 //Kernel builder helper functions
70
71 //Check if the test case is for kernel that has argument
72 static int isKernelArgument(testCase* pTestCase,size_t testId);
73
74 //Check if the test case treats %p format for void*
75 static int isKernelPFormat(testCase* pTestCase,size_t testId);
76
77 //-----------------------------------------
78 // Static functions declarations
79 //-----------------------------------------
80 // Make a program that uses printf for the given type/format,
81 static cl_program makePrintfProgram(cl_kernel *kernel_ptr, const cl_context context,const unsigned int testId,const unsigned int testNum,bool isLongSupport = true,bool is64bAddrSpace = false);
82
83 // Creates and execute the printf test for the given device, context, type/format
84 static int doTest(cl_command_queue queue, cl_context context, const unsigned int testId, const unsigned int testNum, cl_device_id device);
85
86 // Check if device supports long
87 static bool isLongSupported(cl_device_id device_id);
88
89 // Check if device address space is 64 bits
90 static bool is64bAddressSpace(cl_device_id device_id);
91
92 //Wait until event status is CL_COMPLETE
93 int waitForEvent(cl_event* event);
94
95 //-----------------------------------------
96 // Definitions and initializations
97 //-----------------------------------------
98
99 // Tests are broken into the major test which is based on the
100 // src and cmp type and their corresponding vector types and
101 // sub tests which is for each individual test. The following
102 // tracks the subtests
103 int s_test_cnt = 0;
104 int s_test_fail = 0;
105
106
107 static cl_context gContext;
108 static cl_command_queue gQueue;
109 static int gFd;
110
111 static char gFileName[256];
112
113 //-----------------------------------------
114 // Static helper functions definition
115 //-----------------------------------------
116
117 //-----------------------------------------
118 // acquireOutputStream
119 //-----------------------------------------
acquireOutputStream(int * error)120 static int acquireOutputStream(int* error)
121 {
122 int fd = streamDup(fileno(stdout));
123 *error = 0;
124 if (!freopen(gFileName, "w", stdout))
125 {
126 releaseOutputStream(fd);
127 *error = -1;
128 }
129 return fd;
130 }
131
132 //-----------------------------------------
133 // releaseOutputStream
134 //-----------------------------------------
releaseOutputStream(int fd)135 static void releaseOutputStream(int fd)
136 {
137 fflush(stdout);
138 streamDup2(fd,fileno(stdout));
139 close(fd);
140 }
141
142 //-----------------------------------------
143 // printfCallBack
144 //-----------------------------------------
printfCallBack(const char * printf_data,size_t len,size_t final,void * user_data)145 static void CL_CALLBACK printfCallBack(const char *printf_data, size_t len, size_t final, void *user_data)
146 {
147 fwrite(printf_data, 1, len, stdout);
148 }
149
150 //-----------------------------------------
151 // getAnalysisBuffer
152 //-----------------------------------------
getAnalysisBuffer(char * analysisBuffer)153 static void getAnalysisBuffer(char* analysisBuffer)
154 {
155 FILE *fp;
156 memset(analysisBuffer,0,ANALYSIS_BUFFER_SIZE);
157
158 fp = fopen(gFileName,"r");
159 if(NULL == fp)
160 log_error("Failed to open analysis buffer ('%s')\n", strerror(errno));
161 else
162 while(fgets(analysisBuffer, ANALYSIS_BUFFER_SIZE, fp) != NULL );
163 fclose(fp);
164 }
165
166 //-----------------------------------------
167 // isKernelArgument
168 //-----------------------------------------
isKernelArgument(testCase * pTestCase,size_t testId)169 static int isKernelArgument(testCase* pTestCase,size_t testId)
170 {
171 return strcmp(pTestCase->_genParameters[testId].addrSpaceArgumentTypeQualifier,"");
172 }
173 //-----------------------------------------
174 // isKernelPFormat
175 //-----------------------------------------
isKernelPFormat(testCase * pTestCase,size_t testId)176 static int isKernelPFormat(testCase* pTestCase,size_t testId)
177 {
178 return strcmp(pTestCase->_genParameters[testId].addrSpacePAdd,"");
179 }
180
181 //-----------------------------------------
182 // waitForEvent
183 //-----------------------------------------
waitForEvent(cl_event * event)184 int waitForEvent(cl_event* event)
185 {
186 cl_int status = clWaitForEvents(1, event);
187 if(status != CL_SUCCESS)
188 {
189 log_error("clWaitForEvents failed");
190 return status;
191 }
192
193 status = clReleaseEvent(*event);
194 if(status != CL_SUCCESS)
195 {
196 log_error("clReleaseEvent failed. (*event)");
197 return status;
198 }
199 return CL_SUCCESS;
200 }
201
202 //-----------------------------------------
203 // Static helper functions definition
204 //-----------------------------------------
205
206 //-----------------------------------------
207 // makePrintfProgram
208 //-----------------------------------------
makePrintfProgram(cl_kernel * kernel_ptr,const cl_context context,const unsigned int testId,const unsigned int testNum,bool isLongSupport,bool is64bAddrSpace)209 static cl_program makePrintfProgram(cl_kernel *kernel_ptr, const cl_context context,const unsigned int testId,const unsigned int testNum,bool isLongSupport,bool is64bAddrSpace)
210 {
211 int err;
212 cl_program program;
213 char testname[256] = {0};
214 char addrSpaceArgument[256] = {0};
215 char addrSpacePAddArgument[256] = {0};
216 char extension[128] = { 0 };
217
218 //Program Source code for int,float,octal,hexadecimal,char,string
219 const char* sourceGen[] = {
220 extension,
221 "__kernel void ",
222 testname,
223 "(void)\n",
224 "{\n"
225 " printf(\"",
226 allTestCase[testId]->_genParameters[testNum].genericFormat,
227 "\\n\",",
228 allTestCase[testId]->_genParameters[testNum].dataRepresentation,
229 ");",
230 "}\n"
231 };
232 //Program Source code for vector
233 const char* sourceVec[] = {
234 extension,
235 "__kernel void ",
236 testname,
237 "(void)\n",
238 "{\n",
239 allTestCase[testId]->_genParameters[testNum].dataType,
240 allTestCase[testId]->_genParameters[testNum].vectorSize,
241 " tmp = (",
242 allTestCase[testId]->_genParameters[testNum].dataType,
243 allTestCase[testId]->_genParameters[testNum].vectorSize,
244 ")",
245 allTestCase[testId]->_genParameters[testNum].dataRepresentation,
246 ";",
247 " printf(\"",
248 allTestCase[testId]->_genParameters[testNum].vectorFormatFlag,
249 "v",
250 allTestCase[testId]->_genParameters[testNum].vectorSize,
251 allTestCase[testId]->_genParameters[testNum].vectorFormatSpecifier,
252 "\\n\",",
253 "tmp);",
254 "}\n"
255 };
256 //Program Source code for address space
257 const char *sourceAddrSpace[] = {
258 "__kernel void ", testname,"(",addrSpaceArgument,
259 ")\n{\n",
260 allTestCase[testId]->_genParameters[testNum].addrSpaceVariableTypeQualifier,
261 "printf(",
262 allTestCase[testId]->_genParameters[testNum].genericFormat,
263 ",",
264 allTestCase[testId]->_genParameters[testNum].addrSpaceParameter,
265 "); ",
266 addrSpacePAddArgument,
267 "\n}\n"
268 };
269
270 //Update testname
271 std::snprintf(testname, sizeof(testname), "%s%d", "test", testId);
272
273 if (allTestCase[testId]->_type == TYPE_HALF
274 || allTestCase[testId]->_type == TYPE_HALF_LIMITS)
275 strcpy(extension, "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n");
276
277
278 //Update addrSpaceArgument and addrSpacePAddArgument types, based on FULL_PROFILE/EMBEDDED_PROFILE
279 if(allTestCase[testId]->_type == TYPE_ADDRESS_SPACE)
280 {
281 std::snprintf(addrSpaceArgument, sizeof(addrSpaceArgument), "%s",
282 allTestCase[testId]
283 ->_genParameters[testNum]
284 .addrSpaceArgumentTypeQualifier);
285
286 std::snprintf(
287 addrSpacePAddArgument, sizeof(addrSpacePAddArgument), "%s",
288 allTestCase[testId]->_genParameters[testNum].addrSpacePAdd);
289 }
290
291 if (strlen(addrSpaceArgument) == 0)
292 std::snprintf(addrSpaceArgument, sizeof(addrSpaceArgument), "void");
293
294 // create program based on its type
295
296 if(allTestCase[testId]->_type == TYPE_VECTOR)
297 {
298 if (strcmp(allTestCase[testId]->_genParameters[testNum].dataType,
299 "half")
300 == 0)
301 strcpy(extension,
302 "#pragma OPENCL EXTENSION cl_khr_fp16 : enable\n");
303
304 err = create_single_kernel_helper(
305 context, &program, kernel_ptr,
306 sizeof(sourceVec) / sizeof(sourceVec[0]), sourceVec, testname);
307 }
308 else if(allTestCase[testId]->_type == TYPE_ADDRESS_SPACE)
309 {
310 err = create_single_kernel_helper(context, &program, kernel_ptr,
311 sizeof(sourceAddrSpace)
312 / sizeof(sourceAddrSpace[0]),
313 sourceAddrSpace, testname);
314 }
315 else
316 {
317 err = create_single_kernel_helper(
318 context, &program, kernel_ptr,
319 sizeof(sourceGen) / sizeof(sourceGen[0]), sourceGen, testname);
320 }
321
322 if (!program || err) {
323 log_error("create_single_kernel_helper failed\n");
324 return NULL;
325 }
326
327 return program;
328 }
329
330 //-----------------------------------------
331 // isLongSupported
332 //-----------------------------------------
isLongSupported(cl_device_id device_id)333 static bool isLongSupported(cl_device_id device_id)
334 {
335 size_t tempSize = 0;
336 cl_int status;
337 bool extSupport = true;
338
339 // Device profile
340 status = clGetDeviceInfo(
341 device_id,
342 CL_DEVICE_PROFILE,
343 0,
344 NULL,
345 &tempSize);
346
347 if(status != CL_SUCCESS)
348 {
349 log_error("*** clGetDeviceInfo FAILED ***\n\n");
350 return false;
351 }
352
353 std::unique_ptr<char[]> profileType(new char[tempSize]);
354 if(profileType == NULL)
355 {
356 log_error("Failed to allocate memory(profileType)");
357 return false;
358 }
359
360 status = clGetDeviceInfo(
361 device_id,
362 CL_DEVICE_PROFILE,
363 sizeof(char) * tempSize,
364 profileType.get(),
365 NULL);
366
367
368 if(!strcmp("EMBEDDED_PROFILE",profileType.get()))
369 {
370 extSupport = is_extension_available(device_id, "cles_khr_int64");
371 }
372 return extSupport;
373 }
374 //-----------------------------------------
375 // is64bAddressSpace
376 //-----------------------------------------
is64bAddressSpace(cl_device_id device_id)377 static bool is64bAddressSpace(cl_device_id device_id)
378 {
379 cl_int status;
380 cl_uint addrSpaceB;
381
382 // Device profile
383 status = clGetDeviceInfo(
384 device_id,
385 CL_DEVICE_ADDRESS_BITS,
386 sizeof(cl_uint),
387 &addrSpaceB,
388 NULL);
389 if(status != CL_SUCCESS)
390 {
391 log_error("*** clGetDeviceInfo FAILED ***\n\n");
392 return false;
393 }
394 if(addrSpaceB == 64)
395 return true;
396 else
397 return false;
398 }
399 //-----------------------------------------
400 // doTest
401 //-----------------------------------------
doTest(cl_command_queue queue,cl_context context,const unsigned int testId,const unsigned int testNum,cl_device_id device)402 static int doTest(cl_command_queue queue, cl_context context, const unsigned int testId, const unsigned int testNum, cl_device_id device)
403 {
404 if ((allTestCase[testId]->_type == TYPE_HALF
405 || allTestCase[testId]->_type == TYPE_HALF_LIMITS)
406 && !is_extension_available(device, "cl_khr_fp16"))
407 {
408 log_info(
409 "Skipping half because cl_khr_fp16 extension is not supported.\n");
410 return TEST_SKIPPED_ITSELF;
411 }
412
413 if(allTestCase[testId]->_type == TYPE_VECTOR)
414 {
415 if ((strcmp(allTestCase[testId]->_genParameters[testNum].dataType,
416 "half")
417 == 0)
418 && !is_extension_available(device, "cl_khr_fp16"))
419 {
420 log_info("Skipping half because cl_khr_fp16 extension is not "
421 "supported.\n");
422 return TEST_SKIPPED_ITSELF;
423 }
424
425 log_info("%d)testing printf(\"%sv%s%s\",%s)\n",testNum,allTestCase[testId]->_genParameters[testNum].vectorFormatFlag,allTestCase[testId]->_genParameters[testNum].vectorSize,
426 allTestCase[testId]->_genParameters[testNum].vectorFormatSpecifier,allTestCase[testId]->_genParameters[testNum].dataRepresentation);
427 }
428 else if(allTestCase[testId]->_type == TYPE_ADDRESS_SPACE)
429 {
430 if(isKernelArgument(allTestCase[testId], testNum))
431 {
432 log_info("%d)testing kernel //argument %s \n printf(%s,%s)\n",testNum,allTestCase[testId]->_genParameters[testNum].addrSpaceArgumentTypeQualifier,
433 allTestCase[testId]->_genParameters[testNum].genericFormat,allTestCase[testId]->_genParameters[testNum].addrSpaceParameter);
434 }
435 else
436 {
437 log_info("%d)testing kernel //variable %s \n printf(%s,%s)\n",testNum,allTestCase[testId]->_genParameters[testNum].addrSpaceVariableTypeQualifier,
438 allTestCase[testId]->_genParameters[testNum].genericFormat,allTestCase[testId]->_genParameters[testNum].addrSpaceParameter);
439 }
440 }
441 else
442 {
443 log_info("%d)testing printf(\"%s\",%s)\n",testNum,allTestCase[testId]->_genParameters[testNum].genericFormat,allTestCase[testId]->_genParameters[testNum].dataRepresentation);
444 }
445
446 // Long support for varible type
447 if(allTestCase[testId]->_type == TYPE_VECTOR && !strcmp(allTestCase[testId]->_genParameters[testNum].dataType,"long") && !isLongSupported(device))
448 {
449 log_info( "Long is not supported, test not run.\n" );
450 return 0;
451 }
452
453 // Long support for address in FULL_PROFILE/EMBEDDED_PROFILE
454 bool isLongSupport = true;
455 if(allTestCase[testId]->_type == TYPE_ADDRESS_SPACE && isKernelPFormat(allTestCase[testId],testNum) && !isLongSupported(device))
456 {
457 isLongSupport = false;
458 }
459
460 int err;
461 cl_program program;
462 cl_kernel kernel;
463 cl_mem d_out = NULL;
464 cl_mem d_a = NULL;
465 char _analysisBuffer[ANALYSIS_BUFFER_SIZE];
466 cl_uint out32 = 0;
467 cl_ulong out64 = 0;
468 int fd = -1;
469
470 // Define an index space (global work size) of threads for execution.
471 size_t globalWorkSize[1];
472
473 program = makePrintfProgram(&kernel, context,testId,testNum,isLongSupport,is64bAddressSpace(device));
474 if (!program || !kernel) {
475 ++s_test_fail;
476 ++s_test_cnt;
477 return -1;
478 }
479
480 //For address space test if there is kernel argument - set it
481 if(allTestCase[testId]->_type == TYPE_ADDRESS_SPACE )
482 {
483 if(isKernelArgument(allTestCase[testId],testNum))
484 {
485 int a = 2;
486 d_a = clCreateBuffer(context, CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR,
487 sizeof(int), &a, &err);
488 if(err!= CL_SUCCESS || d_a == NULL) {
489 log_error("clCreateBuffer failed\n");
490 goto exit;
491 }
492 err = clSetKernelArg(kernel, 0, sizeof(cl_mem), &d_a);
493 if(err!= CL_SUCCESS) {
494 log_error("clSetKernelArg failed\n");
495 goto exit;
496 }
497 }
498 //For address space test if %p is tested
499 if(isKernelPFormat(allTestCase[testId],testNum))
500 {
501 d_out = clCreateBuffer(context, CL_MEM_READ_WRITE,
502 sizeof(cl_ulong), NULL, &err);
503 if(err!= CL_SUCCESS || d_out == NULL) {
504 log_error("clCreateBuffer failed\n");
505 goto exit;
506 }
507 err = clSetKernelArg(kernel, 1, sizeof(cl_mem), &d_out);
508 if(err!= CL_SUCCESS) {
509 log_error("clSetKernelArg failed\n");
510 goto exit;
511 }
512 }
513 }
514
515 fd = acquireOutputStream(&err);
516 if (err != 0)
517 {
518 log_error("Error while redirection stdout to file");
519 goto exit;
520 }
521 globalWorkSize[0] = 1;
522 cl_event ndrEvt;
523 err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, globalWorkSize, NULL, 0, NULL,&ndrEvt);
524 if (err != CL_SUCCESS) {
525 releaseOutputStream(fd);
526 log_error("\n clEnqueueNDRangeKernel failed errcode:%d\n", err);
527 ++s_test_fail;
528 goto exit;
529 }
530
531 fflush(stdout);
532 err = clFlush(queue);
533 if(err != CL_SUCCESS)
534 {
535 releaseOutputStream(fd);
536 log_error("clFlush failed\n");
537 goto exit;
538 }
539 //Wait until kernel finishes its execution and (thus) the output printed from the kernel
540 //is immediately printed
541 err = waitForEvent(&ndrEvt);
542
543 releaseOutputStream(fd);
544
545 if(err != CL_SUCCESS)
546 {
547 log_error("waitforEvent failed\n");
548 goto exit;
549 }
550 fflush(stdout);
551
552 if(allTestCase[testId]->_type == TYPE_ADDRESS_SPACE && isKernelPFormat(allTestCase[testId],testNum))
553 {
554 // Read the OpenCL output buffer (d_out) to the host output array (out)
555 if(!is64bAddressSpace(device))//32-bit address space
556 {
557 clEnqueueReadBuffer(queue, d_out, CL_TRUE, 0, sizeof(cl_int),&out32,
558 0, NULL, NULL);
559 }
560 else //64-bit address space
561 {
562 clEnqueueReadBuffer(queue, d_out, CL_TRUE, 0, sizeof(cl_ulong),&out64,
563 0, NULL, NULL);
564 }
565 }
566
567 //
568 //Get the output printed from the kernel to _analysisBuffer
569 //and verify its correctness
570 getAnalysisBuffer(_analysisBuffer);
571 if(!is64bAddressSpace(device)) //32-bit address space
572 {
573 if(0 != verifyOutputBuffer(_analysisBuffer,allTestCase[testId],testNum,(cl_ulong) out32))
574 err = ++s_test_fail;
575 }
576 else //64-bit address space
577 {
578 if(0 != verifyOutputBuffer(_analysisBuffer,allTestCase[testId],testNum,out64))
579 err = ++s_test_fail;
580 }
581 exit:
582 if(clReleaseKernel(kernel) != CL_SUCCESS)
583 log_error("clReleaseKernel failed\n");
584 if(clReleaseProgram(program) != CL_SUCCESS)
585 log_error("clReleaseProgram failed\n");
586 if(d_out)
587 clReleaseMemObject(d_out);
588 if(d_a)
589 clReleaseMemObject(d_a);
590 ++s_test_cnt;
591 return err;
592 }
593
594
test_int_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)595 int test_int_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
596 {
597 return doTest(gQueue, gContext, TYPE_INT, 0, deviceID);
598 }
test_int_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)599 int test_int_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
600 {
601 return doTest(gQueue, gContext, TYPE_INT, 1, deviceID);
602 }
test_int_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)603 int test_int_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
604 {
605 return doTest(gQueue, gContext, TYPE_INT, 2, deviceID);
606 }
test_int_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)607 int test_int_3(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
608 {
609 return doTest(gQueue, gContext, TYPE_INT, 3, deviceID);
610 }
test_int_4(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)611 int test_int_4(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
612 {
613 return doTest(gQueue, gContext, TYPE_INT, 4, deviceID);
614 }
test_int_5(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)615 int test_int_5(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
616 {
617 return doTest(gQueue, gContext, TYPE_INT, 5, deviceID);
618 }
test_int_6(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)619 int test_int_6(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
620 {
621 return doTest(gQueue, gContext, TYPE_INT, 6, deviceID);
622 }
test_int_7(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)623 int test_int_7(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
624 {
625 return doTest(gQueue, gContext, TYPE_INT, 7, deviceID);
626 }
test_int_8(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)627 int test_int_8(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
628 {
629 return doTest(gQueue, gContext, TYPE_INT, 8, deviceID);
630 }
631
632
test_half_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)633 int test_half_0(cl_device_id deviceID, cl_context context,
634 cl_command_queue queue, int num_elements)
635 {
636 return doTest(gQueue, gContext, TYPE_HALF, 0, deviceID);
637 }
test_half_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)638 int test_half_1(cl_device_id deviceID, cl_context context,
639 cl_command_queue queue, int num_elements)
640 {
641 return doTest(gQueue, gContext, TYPE_HALF, 1, deviceID);
642 }
test_half_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)643 int test_half_2(cl_device_id deviceID, cl_context context,
644 cl_command_queue queue, int num_elements)
645 {
646 return doTest(gQueue, gContext, TYPE_HALF, 2, deviceID);
647 }
test_half_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)648 int test_half_3(cl_device_id deviceID, cl_context context,
649 cl_command_queue queue, int num_elements)
650 {
651 return doTest(gQueue, gContext, TYPE_HALF, 3, deviceID);
652 }
test_half_4(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)653 int test_half_4(cl_device_id deviceID, cl_context context,
654 cl_command_queue queue, int num_elements)
655 {
656 return doTest(gQueue, gContext, TYPE_HALF, 4, deviceID);
657 }
test_half_5(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)658 int test_half_5(cl_device_id deviceID, cl_context context,
659 cl_command_queue queue, int num_elements)
660 {
661 return doTest(gQueue, gContext, TYPE_HALF, 5, deviceID);
662 }
test_half_6(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)663 int test_half_6(cl_device_id deviceID, cl_context context,
664 cl_command_queue queue, int num_elements)
665 {
666 return doTest(gQueue, gContext, TYPE_HALF, 6, deviceID);
667 }
test_half_7(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)668 int test_half_7(cl_device_id deviceID, cl_context context,
669 cl_command_queue queue, int num_elements)
670 {
671 return doTest(gQueue, gContext, TYPE_HALF, 7, deviceID);
672 }
test_half_8(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)673 int test_half_8(cl_device_id deviceID, cl_context context,
674 cl_command_queue queue, int num_elements)
675 {
676 return doTest(gQueue, gContext, TYPE_HALF, 8, deviceID);
677 }
test_half_9(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)678 int test_half_9(cl_device_id deviceID, cl_context context,
679 cl_command_queue queue, int num_elements)
680 {
681 return doTest(gQueue, gContext, TYPE_HALF, 9, deviceID);
682 }
683
684
test_half_limits_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)685 int test_half_limits_0(cl_device_id deviceID, cl_context context,
686 cl_command_queue queue, int num_elements)
687 {
688 return doTest(gQueue, gContext, TYPE_HALF_LIMITS, 0, deviceID);
689 }
test_half_limits_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)690 int test_half_limits_1(cl_device_id deviceID, cl_context context,
691 cl_command_queue queue, int num_elements)
692 {
693 return doTest(gQueue, gContext, TYPE_HALF_LIMITS, 1, deviceID);
694 }
test_half_limits_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)695 int test_half_limits_2(cl_device_id deviceID, cl_context context,
696 cl_command_queue queue, int num_elements)
697 {
698 return doTest(gQueue, gContext, TYPE_HALF_LIMITS, 2, deviceID);
699 }
700
701
test_float_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)702 int test_float_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
703 {
704 return doTest(gQueue, gContext, TYPE_FLOAT, 0, deviceID);
705 }
test_float_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)706 int test_float_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
707 {
708 return doTest(gQueue, gContext, TYPE_FLOAT, 1, deviceID);
709 }
test_float_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)710 int test_float_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
711 {
712 return doTest(gQueue, gContext, TYPE_FLOAT, 2, deviceID);
713 }
test_float_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)714 int test_float_3(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
715 {
716 return doTest(gQueue, gContext, TYPE_FLOAT, 3, deviceID);
717 }
test_float_4(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)718 int test_float_4(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
719 {
720 return doTest(gQueue, gContext, TYPE_FLOAT, 4, deviceID);
721 }
test_float_5(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)722 int test_float_5(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
723 {
724 return doTest(gQueue, gContext, TYPE_FLOAT, 5, deviceID);
725 }
test_float_6(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)726 int test_float_6(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
727 {
728 return doTest(gQueue, gContext, TYPE_FLOAT, 6, deviceID);
729 }
test_float_7(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)730 int test_float_7(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
731 {
732 return doTest(gQueue, gContext, TYPE_FLOAT, 7, deviceID);
733 }
test_float_8(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)734 int test_float_8(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
735 {
736 return doTest(gQueue, gContext, TYPE_FLOAT, 8, deviceID);
737 }
test_float_9(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)738 int test_float_9(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
739 {
740 return doTest(gQueue, gContext, TYPE_FLOAT, 9, deviceID);
741 }
test_float_10(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)742 int test_float_10(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
743 {
744 return doTest(gQueue, gContext, TYPE_FLOAT, 10, deviceID);
745 }
test_float_11(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)746 int test_float_11(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
747 {
748 return doTest(gQueue, gContext, TYPE_FLOAT, 11, deviceID);
749 }
test_float_12(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)750 int test_float_12(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
751 {
752 return doTest(gQueue, gContext, TYPE_FLOAT, 12, deviceID);
753 }
test_float_13(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)754 int test_float_13(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
755 {
756 return doTest(gQueue, gContext, TYPE_FLOAT, 13, deviceID);
757 }
test_float_14(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)758 int test_float_14(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
759 {
760 return doTest(gQueue, gContext, TYPE_FLOAT, 14, deviceID);
761 }
test_float_15(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)762 int test_float_15(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
763 {
764 return doTest(gQueue, gContext, TYPE_FLOAT, 15, deviceID);
765 }
test_float_16(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)766 int test_float_16(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
767 {
768 return doTest(gQueue, gContext, TYPE_FLOAT, 16, deviceID);
769 }
test_float_17(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)770 int test_float_17(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
771 {
772 return doTest(gQueue, gContext, TYPE_FLOAT, 17, deviceID);
773 }
774
775
test_float_limits_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)776 int test_float_limits_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
777 {
778 return doTest(gQueue, gContext, TYPE_FLOAT_LIMITS, 0, deviceID);
779 }
test_float_limits_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)780 int test_float_limits_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
781 {
782 return doTest(gQueue, gContext, TYPE_FLOAT_LIMITS, 1, deviceID);
783 }
test_float_limits_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)784 int test_float_limits_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
785 {
786 return doTest(gQueue, gContext, TYPE_FLOAT_LIMITS, 2, deviceID);
787 }
788
789
test_octal_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)790 int test_octal_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
791 {
792 return doTest(gQueue, gContext, TYPE_OCTAL, 0, deviceID);
793 }
test_octal_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)794 int test_octal_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
795 {
796 return doTest(gQueue, gContext, TYPE_OCTAL, 1, deviceID);
797 }
test_octal_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)798 int test_octal_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
799 {
800 return doTest(gQueue, gContext, TYPE_OCTAL, 2, deviceID);
801 }
test_octal_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)802 int test_octal_3(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
803 {
804 return doTest(gQueue, gContext, TYPE_OCTAL, 3, deviceID);
805 }
806
807
test_unsigned_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)808 int test_unsigned_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
809 {
810 return doTest(gQueue, gContext, TYPE_UNSIGNED, 0, deviceID);
811 }
test_unsigned_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)812 int test_unsigned_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
813 {
814 return doTest(gQueue, gContext, TYPE_UNSIGNED, 1, deviceID);
815 }
816
817
test_hexadecimal_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)818 int test_hexadecimal_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
819 {
820 return doTest(gQueue, gContext, TYPE_HEXADEC, 0, deviceID);
821 }
test_hexadecimal_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)822 int test_hexadecimal_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
823 {
824 return doTest(gQueue, gContext, TYPE_HEXADEC, 1, deviceID);
825 }
test_hexadecimal_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)826 int test_hexadecimal_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
827 {
828 return doTest(gQueue, gContext, TYPE_HEXADEC, 2, deviceID);
829 }
test_hexadecimal_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)830 int test_hexadecimal_3(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
831 {
832 return doTest(gQueue, gContext, TYPE_HEXADEC, 3, deviceID);
833 }
test_hexadecimal_4(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)834 int test_hexadecimal_4(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
835 {
836 return doTest(gQueue, gContext, TYPE_HEXADEC, 4, deviceID);
837 }
838
839
test_char_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)840 int test_char_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
841 {
842 return doTest(gQueue, gContext, TYPE_CHAR, 0, deviceID);
843 }
test_char_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)844 int test_char_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
845 {
846 return doTest(gQueue, gContext, TYPE_CHAR, 1, deviceID);
847 }
test_char_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)848 int test_char_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
849 {
850 return doTest(gQueue, gContext, TYPE_CHAR, 2, deviceID);
851 }
852
853
test_string_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)854 int test_string_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
855 {
856 return doTest(gQueue, gContext, TYPE_STRING, 0, deviceID);
857 }
test_string_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)858 int test_string_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
859 {
860 return doTest(gQueue, gContext, TYPE_STRING, 1, deviceID);
861 }
test_string_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)862 int test_string_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
863 {
864 return doTest(gQueue, gContext, TYPE_STRING, 2, deviceID);
865 }
866
867
test_vector_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)868 int test_vector_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
869 {
870 return doTest(gQueue, gContext, TYPE_VECTOR, 0, deviceID);
871 }
test_vector_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)872 int test_vector_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
873 {
874 return doTest(gQueue, gContext, TYPE_VECTOR, 1, deviceID);
875 }
test_vector_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)876 int test_vector_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
877 {
878 return doTest(gQueue, gContext, TYPE_VECTOR, 2, deviceID);
879 }
test_vector_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)880 int test_vector_3(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
881 {
882 return doTest(gQueue, gContext, TYPE_VECTOR, 3, deviceID);
883 }
test_vector_4(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)884 int test_vector_4(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
885 {
886 return doTest(gQueue, gContext, TYPE_VECTOR, 4, deviceID);
887 }
test_vector_5(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)888 int test_vector_5(cl_device_id deviceID, cl_context context,
889 cl_command_queue queue, int num_elements)
890 {
891 return doTest(gQueue, gContext, TYPE_VECTOR, 5, deviceID);
892 }
893
894
test_address_space_0(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)895 int test_address_space_0(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
896 {
897 return doTest(gQueue, gContext, TYPE_ADDRESS_SPACE, 0, deviceID);
898 }
test_address_space_1(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)899 int test_address_space_1(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
900 {
901 return doTest(gQueue, gContext, TYPE_ADDRESS_SPACE, 1, deviceID);
902 }
test_address_space_2(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)903 int test_address_space_2(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
904 {
905 return doTest(gQueue, gContext, TYPE_ADDRESS_SPACE, 2, deviceID);
906 }
test_address_space_3(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)907 int test_address_space_3(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
908 {
909 return doTest(gQueue, gContext, TYPE_ADDRESS_SPACE, 3, deviceID);
910 }
test_address_space_4(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)911 int test_address_space_4(cl_device_id deviceID, cl_context context, cl_command_queue queue, int num_elements)
912 {
913 return doTest(gQueue, gContext, TYPE_ADDRESS_SPACE, 4, deviceID);
914 }
915
test_buffer_size(cl_device_id deviceID,cl_context context,cl_command_queue queue,int num_elements)916 int test_buffer_size(cl_device_id deviceID, cl_context context,
917 cl_command_queue queue, int num_elements)
918 {
919 size_t printf_buff_size = 0;
920 const size_t printf_buff_size_req = !gIsEmbedded ? (1024 * 1024UL) : 1024UL;
921 const size_t config_size = sizeof(printf_buff_size);
922 cl_int err = CL_SUCCESS;
923
924 err = clGetDeviceInfo(deviceID, CL_DEVICE_PRINTF_BUFFER_SIZE, config_size,
925 &printf_buff_size, NULL);
926 if (err != CL_SUCCESS)
927 {
928 log_error("Unable to query CL_DEVICE_PRINTF_BUFFER_SIZE");
929 return TEST_FAIL;
930 }
931
932 if (printf_buff_size < printf_buff_size_req)
933 {
934 log_error("CL_DEVICE_PRINTF_BUFFER_SIZE does not meet requirements");
935 return TEST_FAIL;
936 }
937
938 return TEST_PASS;
939 }
940
941 test_definition test_list[] = {
942 ADD_TEST(int_0), ADD_TEST(int_1),
943 ADD_TEST(int_2), ADD_TEST(int_3),
944 ADD_TEST(int_4), ADD_TEST(int_5),
945 ADD_TEST(int_6), ADD_TEST(int_7),
946 ADD_TEST(int_8),
947
948 ADD_TEST(half_0), ADD_TEST(half_1),
949 ADD_TEST(half_2), ADD_TEST(half_3),
950 ADD_TEST(half_4), ADD_TEST(half_5),
951 ADD_TEST(half_6), ADD_TEST(half_7),
952 ADD_TEST(half_8), ADD_TEST(half_9),
953
954 ADD_TEST(half_limits_0), ADD_TEST(half_limits_1),
955 ADD_TEST(half_limits_2),
956
957 ADD_TEST(float_0), ADD_TEST(float_1),
958 ADD_TEST(float_2), ADD_TEST(float_3),
959 ADD_TEST(float_4), ADD_TEST(float_5),
960 ADD_TEST(float_6), ADD_TEST(float_7),
961 ADD_TEST(float_8), ADD_TEST(float_9),
962 ADD_TEST(float_10), ADD_TEST(float_11),
963 ADD_TEST(float_12), ADD_TEST(float_13),
964 ADD_TEST(float_14), ADD_TEST(float_15),
965 ADD_TEST(float_16), ADD_TEST(float_17),
966
967 ADD_TEST(float_limits_0), ADD_TEST(float_limits_1),
968 ADD_TEST(float_limits_2),
969
970 ADD_TEST(octal_0), ADD_TEST(octal_1),
971 ADD_TEST(octal_2), ADD_TEST(octal_3),
972
973 ADD_TEST(unsigned_0), ADD_TEST(unsigned_1),
974
975 ADD_TEST(hexadecimal_0), ADD_TEST(hexadecimal_1),
976 ADD_TEST(hexadecimal_2), ADD_TEST(hexadecimal_3),
977 ADD_TEST(hexadecimal_4),
978
979 ADD_TEST(char_0), ADD_TEST(char_1),
980 ADD_TEST(char_2),
981
982 ADD_TEST(string_0), ADD_TEST(string_1),
983 ADD_TEST(string_2),
984
985 ADD_TEST(vector_0), ADD_TEST(vector_1),
986 ADD_TEST(vector_2), ADD_TEST(vector_3),
987 ADD_TEST(vector_4), ADD_TEST(vector_5),
988
989 ADD_TEST(address_space_0), ADD_TEST(address_space_1),
990 ADD_TEST(address_space_2), ADD_TEST(address_space_3),
991 ADD_TEST(address_space_4),
992
993 ADD_TEST(buffer_size),
994 };
995
996 const int test_num = ARRAY_SIZE( test_list );
997
998 //-----------------------------------------
999 // main
1000 //-----------------------------------------
main(int argc,const char * argv[])1001 int main(int argc, const char* argv[])
1002 {
1003 argc = parseCustomParam(argc, argv);
1004 if (argc == -1)
1005 {
1006 return -1;
1007 }
1008
1009 const char ** argList = (const char **)calloc( argc, sizeof( char*) );
1010
1011 if( NULL == argList )
1012 {
1013 log_error( "Failed to allocate memory for argList array.\n" );
1014 return 1;
1015 }
1016
1017 argList[0] = argv[0];
1018 size_t argCount = 1;
1019
1020 for (int i=1; i < argc; ++i) {
1021 const char *arg = argv[i];
1022 if (arg == NULL)
1023 break;
1024
1025 if (arg[0] == '-')
1026 {
1027 arg++;
1028 while(*arg != '\0')
1029 {
1030 switch(*arg) {
1031 case 'h':
1032 printUsage();
1033 return 0;
1034 default:
1035 log_error( " <-- unknown flag: %c (0x%2.2x)\n)", *arg, *arg );
1036 printUsage();
1037 return 0;
1038 }
1039 arg++;
1040 }
1041 }
1042 else {
1043 argList[argCount] = arg;
1044 argCount++;
1045 }
1046 }
1047
1048 char* pcTempFname = get_temp_filename();
1049 if (pcTempFname != nullptr)
1050 {
1051 strncpy(gFileName, pcTempFname, sizeof(gFileName));
1052 }
1053
1054 free(pcTempFname);
1055
1056 if (strlen(gFileName) == 0)
1057 {
1058 log_error("get_temp_filename failed\n");
1059 return -1;
1060 }
1061
1062 int err = runTestHarnessWithCheck( argCount, argList, test_num, test_list, true, 0, InitCL );
1063
1064 if(gQueue)
1065 {
1066 int error = clFinish(gQueue);
1067 if (error) {
1068 log_error("clFinish failed: %d\n", error);
1069 }
1070 }
1071
1072 if(clReleaseCommandQueue(gQueue)!=CL_SUCCESS)
1073 log_error("clReleaseCommandQueue\n");
1074 if(clReleaseContext(gContext)!= CL_SUCCESS)
1075 log_error("clReleaseContext\n");
1076
1077
1078 free(argList);
1079 remove(gFileName);
1080 return err;
1081 }
1082
1083 //-----------------------------------------
1084 // printUsage
1085 //-----------------------------------------
printUsage(void)1086 static void printUsage( void )
1087 {
1088 log_info("test_printf: <optional: testnames> \n");
1089 log_info("\tdefault is to run the full test on the default device\n");
1090 log_info("\n");
1091 for( int i = 0; i < test_num; i++ )
1092 {
1093 log_info( "\t%s\n", test_list[i].name );
1094 }
1095 }
1096
InitCL(cl_device_id device)1097 test_status InitCL( cl_device_id device )
1098 {
1099 uint32_t device_frequency = 0;
1100 uint32_t compute_devices = 0;
1101
1102 int err;
1103 gFd = acquireOutputStream(&err);
1104 if (err != 0)
1105 {
1106 log_error("Error while redirection stdout to file");
1107 return TEST_FAIL;
1108 }
1109
1110 size_t config_size = sizeof( device_frequency );
1111 #if MULTITHREAD
1112 if( (err = clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, config_size, &compute_devices, NULL )) )
1113 #endif
1114 compute_devices = 1;
1115
1116 config_size = sizeof(device_frequency);
1117 if((err = clGetDeviceInfo(device, CL_DEVICE_MAX_CLOCK_FREQUENCY, config_size, &device_frequency, NULL )))
1118 device_frequency = 1;
1119
1120 releaseOutputStream(gFd);
1121
1122 log_info( "\nCompute Device info:\n" );
1123 log_info( "\tProcessing with %d devices\n", compute_devices );
1124 log_info( "\tDevice Frequency: %d MHz\n", device_frequency );
1125
1126 printDeviceHeader( device );
1127
1128 PrintArch();
1129
1130 auto version = get_device_cl_version(device);
1131 auto expected_min_version = Version(1, 2);
1132 if (version < expected_min_version)
1133 {
1134 version_expected_info("Test", "OpenCL",
1135 expected_min_version.to_string().c_str(),
1136 version.to_string().c_str());
1137 return TEST_SKIP;
1138 }
1139
1140 gFd = acquireOutputStream(&err);
1141 if (err != 0)
1142 {
1143 log_error("Error while redirection stdout to file");
1144 return TEST_FAIL;
1145 }
1146 cl_context_properties printf_properties[] = {
1147 CL_PRINTF_CALLBACK_ARM, (cl_context_properties)printfCallBack,
1148 CL_PRINTF_BUFFERSIZE_ARM, ANALYSIS_BUFFER_SIZE, 0
1149 };
1150
1151 cl_context_properties* props = NULL;
1152
1153 if(is_extension_available(device, "cl_arm_printf"))
1154 {
1155 props = printf_properties;
1156 }
1157
1158 gContext = clCreateContext(props, 1, &device, notify_callback, NULL, NULL);
1159 checkNull(gContext, "clCreateContext");
1160
1161 gQueue = clCreateCommandQueue(gContext, device, 0, NULL);
1162 checkNull(gQueue, "clCreateCommandQueue");
1163
1164 releaseOutputStream(gFd);
1165
1166 if (is_extension_available(device, "cl_khr_fp16"))
1167 {
1168 const cl_device_fp_config fpConfigHalf =
1169 get_default_rounding_mode(device, CL_DEVICE_HALF_FP_CONFIG);
1170 if (fpConfigHalf == CL_FP_ROUND_TO_NEAREST)
1171 {
1172 half_rounding_mode = CL_HALF_RTE;
1173 }
1174 else if (fpConfigHalf == CL_FP_ROUND_TO_ZERO)
1175 {
1176 half_rounding_mode = CL_HALF_RTZ;
1177 }
1178 else
1179 {
1180 log_error("Error while acquiring half rounding mode");
1181 }
1182 }
1183
1184 // Generate reference results
1185 generateRef(device);
1186
1187 return TEST_PASS;
1188 }
1189