xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/printf/test_printf.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
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