xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/allocations/main.cpp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1*6467f958SSadaf Ebrahimi //
2*6467f958SSadaf Ebrahimi // Copyright (c) 2017 The Khronos Group Inc.
3*6467f958SSadaf Ebrahimi //
4*6467f958SSadaf Ebrahimi // Licensed under the Apache License, Version 2.0 (the "License");
5*6467f958SSadaf Ebrahimi // you may not use this file except in compliance with the License.
6*6467f958SSadaf Ebrahimi // You may obtain a copy of the License at
7*6467f958SSadaf Ebrahimi //
8*6467f958SSadaf Ebrahimi //    http://www.apache.org/licenses/LICENSE-2.0
9*6467f958SSadaf Ebrahimi //
10*6467f958SSadaf Ebrahimi // Unless required by applicable law or agreed to in writing, software
11*6467f958SSadaf Ebrahimi // distributed under the License is distributed on an "AS IS" BASIS,
12*6467f958SSadaf Ebrahimi // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6467f958SSadaf Ebrahimi // See the License for the specific language governing permissions and
14*6467f958SSadaf Ebrahimi // limitations under the License.
15*6467f958SSadaf Ebrahimi //
16*6467f958SSadaf Ebrahimi #include "testBase.h"
17*6467f958SSadaf Ebrahimi 
18*6467f958SSadaf Ebrahimi #include "allocation_functions.h"
19*6467f958SSadaf Ebrahimi #include "allocation_fill.h"
20*6467f958SSadaf Ebrahimi #include "allocation_execute.h"
21*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
22*6467f958SSadaf Ebrahimi #include "harness/parseParameters.h"
23*6467f958SSadaf Ebrahimi #include <time.h>
24*6467f958SSadaf Ebrahimi 
25*6467f958SSadaf Ebrahimi typedef long long unsigned llu;
26*6467f958SSadaf Ebrahimi 
27*6467f958SSadaf Ebrahimi int g_repetition_count = 1;
28*6467f958SSadaf Ebrahimi int g_reduction_percentage = 100;
29*6467f958SSadaf Ebrahimi int g_write_allocations = 1;
30*6467f958SSadaf Ebrahimi int g_multiple_allocations = 0;
31*6467f958SSadaf Ebrahimi int g_execute_kernel = 1;
32*6467f958SSadaf Ebrahimi 
33*6467f958SSadaf Ebrahimi static size_t g_max_size;
34*6467f958SSadaf Ebrahimi static RandomSeed g_seed( gRandomSeed );
35*6467f958SSadaf Ebrahimi 
36*6467f958SSadaf Ebrahimi cl_long g_max_individual_allocation_size;
37*6467f958SSadaf Ebrahimi cl_long g_global_mem_size;
38*6467f958SSadaf Ebrahimi 
39*6467f958SSadaf Ebrahimi cl_uint checksum;
40*6467f958SSadaf Ebrahimi 
41*6467f958SSadaf Ebrahimi static void printUsage( const char *execName );
42*6467f958SSadaf Ebrahimi 
init_cl(cl_device_id device)43*6467f958SSadaf Ebrahimi test_status init_cl( cl_device_id device ) {
44*6467f958SSadaf Ebrahimi     int error;
45*6467f958SSadaf Ebrahimi 
46*6467f958SSadaf Ebrahimi     error = clGetDeviceInfo( device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(g_max_individual_allocation_size), &g_max_individual_allocation_size, NULL );
47*6467f958SSadaf Ebrahimi     if ( error ) {
48*6467f958SSadaf Ebrahimi         print_error( error, "clGetDeviceInfo failed for CL_DEVICE_MAX_MEM_ALLOC_SIZE");
49*6467f958SSadaf Ebrahimi         return TEST_FAIL;
50*6467f958SSadaf Ebrahimi     }
51*6467f958SSadaf Ebrahimi     error = clGetDeviceInfo( device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(g_global_mem_size), &g_global_mem_size, NULL );
52*6467f958SSadaf Ebrahimi     if ( error ) {
53*6467f958SSadaf Ebrahimi         print_error( error, "clGetDeviceInfo failed for CL_DEVICE_GLOBAL_MEM_SIZE");
54*6467f958SSadaf Ebrahimi         return TEST_FAIL;
55*6467f958SSadaf Ebrahimi     }
56*6467f958SSadaf Ebrahimi 
57*6467f958SSadaf Ebrahimi     log_info("Device reports CL_DEVICE_MAX_MEM_ALLOC_SIZE=%llu bytes (%gMB), CL_DEVICE_GLOBAL_MEM_SIZE=%llu bytes (%gMB).\n",
58*6467f958SSadaf Ebrahimi              llu( g_max_individual_allocation_size ), toMB( g_max_individual_allocation_size ),
59*6467f958SSadaf Ebrahimi              llu( g_global_mem_size ), toMB( g_global_mem_size ) );
60*6467f958SSadaf Ebrahimi 
61*6467f958SSadaf Ebrahimi     if( g_global_mem_size > (cl_ulong)SIZE_MAX )
62*6467f958SSadaf Ebrahimi     {
63*6467f958SSadaf Ebrahimi         g_global_mem_size = (cl_ulong)SIZE_MAX;
64*6467f958SSadaf Ebrahimi     }
65*6467f958SSadaf Ebrahimi 
66*6467f958SSadaf Ebrahimi     if( g_max_individual_allocation_size > g_global_mem_size )
67*6467f958SSadaf Ebrahimi     {
68*6467f958SSadaf Ebrahimi         log_error( "FAILURE:  CL_DEVICE_MAX_MEM_ALLOC_SIZE (%llu) is greater than the CL_DEVICE_GLOBAL_MEM_SIZE (%llu)\n",
69*6467f958SSadaf Ebrahimi                    llu( g_max_individual_allocation_size ), llu( g_global_mem_size ) );
70*6467f958SSadaf Ebrahimi         return TEST_FAIL;
71*6467f958SSadaf Ebrahimi     }
72*6467f958SSadaf Ebrahimi 
73*6467f958SSadaf Ebrahimi     // We may need to back off the global_mem_size on unified memory devices to leave room for application and operating system code
74*6467f958SSadaf Ebrahimi     // and associated data in the working set, so we dont start pathologically paging.
75*6467f958SSadaf Ebrahimi     // Check to see if we are a unified memory device
76*6467f958SSadaf Ebrahimi     cl_bool hasUnifiedMemory = CL_FALSE;
77*6467f958SSadaf Ebrahimi     if( ( error = clGetDeviceInfo( device, CL_DEVICE_HOST_UNIFIED_MEMORY, sizeof( hasUnifiedMemory ), &hasUnifiedMemory, NULL ) ) )
78*6467f958SSadaf Ebrahimi     {
79*6467f958SSadaf Ebrahimi         print_error( error, "clGetDeviceInfo failed for CL_DEVICE_HOST_UNIFIED_MEMORY");
80*6467f958SSadaf Ebrahimi         return TEST_FAIL;
81*6467f958SSadaf Ebrahimi     }
82*6467f958SSadaf Ebrahimi     // we share unified memory so back off to 1/2 the global memory size.
83*6467f958SSadaf Ebrahimi     if( CL_TRUE == hasUnifiedMemory )
84*6467f958SSadaf Ebrahimi     {
85*6467f958SSadaf Ebrahimi         g_global_mem_size -= g_global_mem_size /2;
86*6467f958SSadaf Ebrahimi         log_info( "Device shares memory with the host, so backing off the maximum combined allocation size to be %gMB to avoid rampant paging.\n",
87*6467f958SSadaf Ebrahimi                   toMB( g_global_mem_size ) );
88*6467f958SSadaf Ebrahimi     }
89*6467f958SSadaf Ebrahimi     else
90*6467f958SSadaf Ebrahimi     {
91*6467f958SSadaf Ebrahimi         // Lets just use 60% of total available memory as framework/driver may not allow using all of it
92*6467f958SSadaf Ebrahimi         // e.g. vram on GPU is used by window server and even for this test, we need some space for context,
93*6467f958SSadaf Ebrahimi         // queue, kernel code on GPU.
94*6467f958SSadaf Ebrahimi         g_global_mem_size *= 0.60;
95*6467f958SSadaf Ebrahimi     }
96*6467f958SSadaf Ebrahimi 
97*6467f958SSadaf Ebrahimi     if( gReSeed )
98*6467f958SSadaf Ebrahimi     {
99*6467f958SSadaf Ebrahimi         g_seed = RandomSeed( gRandomSeed );
100*6467f958SSadaf Ebrahimi     }
101*6467f958SSadaf Ebrahimi 
102*6467f958SSadaf Ebrahimi     return TEST_PASS;
103*6467f958SSadaf Ebrahimi }
104*6467f958SSadaf Ebrahimi 
doTest(cl_device_id device,cl_context context,cl_command_queue queue,AllocType alloc_type)105*6467f958SSadaf Ebrahimi int doTest( cl_device_id device, cl_context context, cl_command_queue queue, AllocType alloc_type )
106*6467f958SSadaf Ebrahimi {
107*6467f958SSadaf Ebrahimi     int error;
108*6467f958SSadaf Ebrahimi     int failure_counts = 0;
109*6467f958SSadaf Ebrahimi     size_t final_size;
110*6467f958SSadaf Ebrahimi     size_t current_test_size;
111*6467f958SSadaf Ebrahimi     cl_mem mems[MAX_NUMBER_TO_ALLOCATE];
112*6467f958SSadaf Ebrahimi     int number_of_mems_used;
113*6467f958SSadaf Ebrahimi     cl_ulong max_individual_allocation_size = g_max_individual_allocation_size;
114*6467f958SSadaf Ebrahimi     cl_ulong global_mem_size = g_global_mem_size ;
115*6467f958SSadaf Ebrahimi     const bool allocate_image =
116*6467f958SSadaf Ebrahimi         (alloc_type != BUFFER) && (alloc_type != BUFFER_NON_BLOCKING);
117*6467f958SSadaf Ebrahimi 
118*6467f958SSadaf Ebrahimi     static const char* alloc_description[] = {
119*6467f958SSadaf Ebrahimi         "buffer(s)",
120*6467f958SSadaf Ebrahimi         "read-only image(s)",
121*6467f958SSadaf Ebrahimi         "write-only image(s)",
122*6467f958SSadaf Ebrahimi         "buffer(s)",
123*6467f958SSadaf Ebrahimi         "read-only image(s)",
124*6467f958SSadaf Ebrahimi         "write-only image(s)",
125*6467f958SSadaf Ebrahimi     };
126*6467f958SSadaf Ebrahimi 
127*6467f958SSadaf Ebrahimi     // Skip image tests if we don't support images on the device
128*6467f958SSadaf Ebrahimi     if (allocate_image && checkForImageSupport(device))
129*6467f958SSadaf Ebrahimi     {
130*6467f958SSadaf Ebrahimi         log_info( "Can not test image allocation because device does not support images.\n" );
131*6467f958SSadaf Ebrahimi         return 0;
132*6467f958SSadaf Ebrahimi     }
133*6467f958SSadaf Ebrahimi 
134*6467f958SSadaf Ebrahimi     // This section was added in order to fix a bug in the test
135*6467f958SSadaf Ebrahimi     // If CL_DEVICE_MAX_MEM_ALLOC_SIZE is much grater than CL_DEVICE_IMAGE2D_MAX_WIDTH * CL_DEVICE_IMAGE2D_MAX_HEIGHT
136*6467f958SSadaf Ebrahimi     // The test will fail in image allocations as the size requested for the allocation will be much grater than the maximum size allowed for image
137*6467f958SSadaf Ebrahimi     if (allocate_image)
138*6467f958SSadaf Ebrahimi     {
139*6467f958SSadaf Ebrahimi         size_t max_width, max_height;
140*6467f958SSadaf Ebrahimi 
141*6467f958SSadaf Ebrahimi         error = clGetDeviceInfo( device, CL_DEVICE_IMAGE2D_MAX_WIDTH, sizeof( max_width ), &max_width, NULL );
142*6467f958SSadaf Ebrahimi         test_error_abort( error, "clGetDeviceInfo failed for CL_DEVICE_IMAGE2D_MAX_WIDTH" );
143*6467f958SSadaf Ebrahimi 
144*6467f958SSadaf Ebrahimi         error = clGetDeviceInfo( device, CL_DEVICE_IMAGE2D_MAX_HEIGHT, sizeof( max_height ), &max_height, NULL );
145*6467f958SSadaf Ebrahimi         test_error_abort( error, "clGetDeviceInfo failed for CL_DEVICE_IMAGE2D_MAX_HEIGHT" );
146*6467f958SSadaf Ebrahimi 
147*6467f958SSadaf Ebrahimi         cl_ulong max_image2d_size = (cl_ulong)max_height * max_width * 4 * sizeof(cl_uint);
148*6467f958SSadaf Ebrahimi 
149*6467f958SSadaf Ebrahimi         if( max_individual_allocation_size > max_image2d_size )
150*6467f958SSadaf Ebrahimi         {
151*6467f958SSadaf Ebrahimi             max_individual_allocation_size = max_image2d_size;
152*6467f958SSadaf Ebrahimi         }
153*6467f958SSadaf Ebrahimi     }
154*6467f958SSadaf Ebrahimi 
155*6467f958SSadaf Ebrahimi     // Pick the baseline size based on whether we are doing a single large or multiple allocations
156*6467f958SSadaf Ebrahimi     g_max_size = g_multiple_allocations ? (size_t)global_mem_size : (size_t)max_individual_allocation_size;
157*6467f958SSadaf Ebrahimi 
158*6467f958SSadaf Ebrahimi     // Adjust based on the percentage
159*6467f958SSadaf Ebrahimi     if( g_reduction_percentage != 100 )
160*6467f958SSadaf Ebrahimi     {
161*6467f958SSadaf Ebrahimi         log_info( "NOTE: reducing max allocations to %d%%.\n", g_reduction_percentage );
162*6467f958SSadaf Ebrahimi         g_max_size = (size_t)( (double)g_max_size * (double)g_reduction_percentage / 100.0 );
163*6467f958SSadaf Ebrahimi     }
164*6467f958SSadaf Ebrahimi 
165*6467f958SSadaf Ebrahimi     // Round to nearest MB.
166*6467f958SSadaf Ebrahimi     g_max_size &= (size_t)(0xFFFFFFFFFF00000ULL);
167*6467f958SSadaf Ebrahimi 
168*6467f958SSadaf Ebrahimi     log_info( "** Target allocation size (rounded to nearest MB) is: %llu bytes (%gMB).\n", llu( g_max_size ), toMB( g_max_size ) );
169*6467f958SSadaf Ebrahimi     log_info( "** Allocating %s to size %gMB.\n", alloc_description[alloc_type], toMB( g_max_size ) );
170*6467f958SSadaf Ebrahimi 
171*6467f958SSadaf Ebrahimi     for( int count = 0; count < g_repetition_count; count++ )
172*6467f958SSadaf Ebrahimi     {
173*6467f958SSadaf Ebrahimi         current_test_size = g_max_size;
174*6467f958SSadaf Ebrahimi         error = FAILED_TOO_BIG;
175*6467f958SSadaf Ebrahimi         log_info( "  => Allocation %d\n", count + 1 );
176*6467f958SSadaf Ebrahimi 
177*6467f958SSadaf Ebrahimi         while( ( error == FAILED_TOO_BIG ) && ( current_test_size > g_max_size / 8 ) )
178*6467f958SSadaf Ebrahimi         {
179*6467f958SSadaf Ebrahimi             // Reset our checksum for each allocation
180*6467f958SSadaf Ebrahimi             checksum = 0;
181*6467f958SSadaf Ebrahimi 
182*6467f958SSadaf Ebrahimi             // Do the allocation
183*6467f958SSadaf Ebrahimi             error = allocate_size( context, &queue, device, g_multiple_allocations, current_test_size, alloc_type,
184*6467f958SSadaf Ebrahimi                                    mems, &number_of_mems_used, &final_size, g_write_allocations, g_seed );
185*6467f958SSadaf Ebrahimi 
186*6467f958SSadaf Ebrahimi             // If we succeeded and we're supposed to execute a kernel, do so.
187*6467f958SSadaf Ebrahimi             if( error == SUCCEEDED && g_execute_kernel )
188*6467f958SSadaf Ebrahimi             {
189*6467f958SSadaf Ebrahimi                 log_info( "\tExecuting kernel with memory objects.\n" );
190*6467f958SSadaf Ebrahimi                 error = execute_kernel( context, &queue, device, alloc_type, mems, number_of_mems_used,
191*6467f958SSadaf Ebrahimi                                         g_write_allocations );
192*6467f958SSadaf Ebrahimi             }
193*6467f958SSadaf Ebrahimi 
194*6467f958SSadaf Ebrahimi             // If we failed to allocate more than 1/8th of the requested amount return a failure.
195*6467f958SSadaf Ebrahimi             if( final_size < (size_t)g_max_size / 8 )
196*6467f958SSadaf Ebrahimi             {
197*6467f958SSadaf Ebrahimi                 log_error( "===> Allocation %d failed to allocate more than 1/8th of the requested size.\n", count + 1 );
198*6467f958SSadaf Ebrahimi                 failure_counts++;
199*6467f958SSadaf Ebrahimi             }
200*6467f958SSadaf Ebrahimi 
201*6467f958SSadaf Ebrahimi             // Clean up.
202*6467f958SSadaf Ebrahimi             for( int i = 0; i < number_of_mems_used; i++ )
203*6467f958SSadaf Ebrahimi             {
204*6467f958SSadaf Ebrahimi                 clReleaseMemObject( mems[i] );
205*6467f958SSadaf Ebrahimi             }
206*6467f958SSadaf Ebrahimi 
207*6467f958SSadaf Ebrahimi             if( error == FAILED_ABORT )
208*6467f958SSadaf Ebrahimi             {
209*6467f958SSadaf Ebrahimi                 log_error( "  => Allocation %d failed.\n", count + 1 );
210*6467f958SSadaf Ebrahimi                 failure_counts++;
211*6467f958SSadaf Ebrahimi             }
212*6467f958SSadaf Ebrahimi 
213*6467f958SSadaf Ebrahimi             if( error == FAILED_TOO_BIG )
214*6467f958SSadaf Ebrahimi             {
215*6467f958SSadaf Ebrahimi                 current_test_size -= g_max_size / 16;
216*6467f958SSadaf Ebrahimi                 log_info( "\tFailed at this size; trying a smaller size of %gMB.\n", toMB( current_test_size ) );
217*6467f958SSadaf Ebrahimi             }
218*6467f958SSadaf Ebrahimi         }
219*6467f958SSadaf Ebrahimi 
220*6467f958SSadaf Ebrahimi         if( error == SUCCEEDED && current_test_size == g_max_size )
221*6467f958SSadaf Ebrahimi         {
222*6467f958SSadaf Ebrahimi             log_info("\tPASS: Allocation succeeded.\n");
223*6467f958SSadaf Ebrahimi         }
224*6467f958SSadaf Ebrahimi         else if( error == SUCCEEDED && current_test_size > g_max_size / 8 )
225*6467f958SSadaf Ebrahimi         {
226*6467f958SSadaf Ebrahimi             log_info("\tPASS: Allocation succeeded at reduced size.\n");
227*6467f958SSadaf Ebrahimi         }
228*6467f958SSadaf Ebrahimi         else
229*6467f958SSadaf Ebrahimi         {
230*6467f958SSadaf Ebrahimi             log_error("\tFAIL: Allocation failed.\n");
231*6467f958SSadaf Ebrahimi             failure_counts++;
232*6467f958SSadaf Ebrahimi         }
233*6467f958SSadaf Ebrahimi     }
234*6467f958SSadaf Ebrahimi 
235*6467f958SSadaf Ebrahimi     return failure_counts;
236*6467f958SSadaf Ebrahimi }
237*6467f958SSadaf Ebrahimi 
test_buffer(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)238*6467f958SSadaf Ebrahimi int test_buffer(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
239*6467f958SSadaf Ebrahimi {
240*6467f958SSadaf Ebrahimi     return doTest( device, context, queue, BUFFER );
241*6467f958SSadaf Ebrahimi }
test_image2d_read(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)242*6467f958SSadaf Ebrahimi int test_image2d_read(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
243*6467f958SSadaf Ebrahimi {
244*6467f958SSadaf Ebrahimi     return doTest( device, context, queue, IMAGE_READ );
245*6467f958SSadaf Ebrahimi }
test_image2d_write(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)246*6467f958SSadaf Ebrahimi int test_image2d_write(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
247*6467f958SSadaf Ebrahimi {
248*6467f958SSadaf Ebrahimi     return doTest( device, context, queue, IMAGE_WRITE );
249*6467f958SSadaf Ebrahimi }
test_buffer_non_blocking(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)250*6467f958SSadaf Ebrahimi int test_buffer_non_blocking(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
251*6467f958SSadaf Ebrahimi {
252*6467f958SSadaf Ebrahimi     return doTest( device, context, queue, BUFFER_NON_BLOCKING );
253*6467f958SSadaf Ebrahimi }
test_image2d_read_non_blocking(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)254*6467f958SSadaf Ebrahimi int test_image2d_read_non_blocking(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
255*6467f958SSadaf Ebrahimi {
256*6467f958SSadaf Ebrahimi     return doTest( device, context, queue, IMAGE_READ_NON_BLOCKING );
257*6467f958SSadaf Ebrahimi }
test_image2d_write_non_blocking(cl_device_id device,cl_context context,cl_command_queue queue,int num_elements)258*6467f958SSadaf Ebrahimi int test_image2d_write_non_blocking(cl_device_id device, cl_context context, cl_command_queue queue, int num_elements)
259*6467f958SSadaf Ebrahimi {
260*6467f958SSadaf Ebrahimi     return doTest( device, context, queue, IMAGE_WRITE_NON_BLOCKING );
261*6467f958SSadaf Ebrahimi }
262*6467f958SSadaf Ebrahimi 
263*6467f958SSadaf Ebrahimi test_definition test_list[] = {
264*6467f958SSadaf Ebrahimi     ADD_TEST( buffer ),
265*6467f958SSadaf Ebrahimi     ADD_TEST( image2d_read ),
266*6467f958SSadaf Ebrahimi     ADD_TEST( image2d_write ),
267*6467f958SSadaf Ebrahimi     ADD_TEST( buffer_non_blocking ),
268*6467f958SSadaf Ebrahimi     ADD_TEST( image2d_read_non_blocking ),
269*6467f958SSadaf Ebrahimi     ADD_TEST( image2d_write_non_blocking ),
270*6467f958SSadaf Ebrahimi };
271*6467f958SSadaf Ebrahimi 
272*6467f958SSadaf Ebrahimi const int test_num = ARRAY_SIZE( test_list );
273*6467f958SSadaf Ebrahimi 
main(int argc,const char * argv[])274*6467f958SSadaf Ebrahimi int main(int argc, const char *argv[])
275*6467f958SSadaf Ebrahimi {
276*6467f958SSadaf Ebrahimi     char *endPtr;
277*6467f958SSadaf Ebrahimi     int r;
278*6467f958SSadaf Ebrahimi 
279*6467f958SSadaf Ebrahimi     argc = parseCustomParam(argc, argv);
280*6467f958SSadaf Ebrahimi     if (argc == -1)
281*6467f958SSadaf Ebrahimi     {
282*6467f958SSadaf Ebrahimi         return 1;
283*6467f958SSadaf Ebrahimi     }
284*6467f958SSadaf Ebrahimi 
285*6467f958SSadaf Ebrahimi     const char ** argList = (const char **)calloc( argc, sizeof( char*) );
286*6467f958SSadaf Ebrahimi 
287*6467f958SSadaf Ebrahimi     if( NULL == argList )
288*6467f958SSadaf Ebrahimi     {
289*6467f958SSadaf Ebrahimi         log_error( "Failed to allocate memory for argList array.\n" );
290*6467f958SSadaf Ebrahimi         return 1;
291*6467f958SSadaf Ebrahimi     }
292*6467f958SSadaf Ebrahimi 
293*6467f958SSadaf Ebrahimi     argList[0] = argv[0];
294*6467f958SSadaf Ebrahimi     size_t argCount = 1;
295*6467f958SSadaf Ebrahimi 
296*6467f958SSadaf Ebrahimi     // Parse arguments
297*6467f958SSadaf Ebrahimi     for( int i = 1; i < argc; i++ )
298*6467f958SSadaf Ebrahimi     {
299*6467f958SSadaf Ebrahimi         if( strcmp( argv[i], "multiple" ) == 0 )
300*6467f958SSadaf Ebrahimi             g_multiple_allocations = 1;
301*6467f958SSadaf Ebrahimi         else if( strcmp( argv[i], "single" ) == 0 )
302*6467f958SSadaf Ebrahimi             g_multiple_allocations = 0;
303*6467f958SSadaf Ebrahimi 
304*6467f958SSadaf Ebrahimi         else if( ( r = (int)strtol( argv[i], &endPtr, 10 ) ) && ( endPtr != argv[i] ) && ( *endPtr == 0 ) )
305*6467f958SSadaf Ebrahimi         {
306*6467f958SSadaf Ebrahimi             // By spec, that means the entire string was an integer, so take it as a repetition count
307*6467f958SSadaf Ebrahimi             g_repetition_count = r;
308*6467f958SSadaf Ebrahimi         }
309*6467f958SSadaf Ebrahimi 
310*6467f958SSadaf Ebrahimi         else if( strchr( argv[i], '%' ) != NULL )
311*6467f958SSadaf Ebrahimi         {
312*6467f958SSadaf Ebrahimi             // Reduction percentage (let strtol ignore the percentage)
313*6467f958SSadaf Ebrahimi             g_reduction_percentage = (int)strtol( argv[i], NULL, 10 );
314*6467f958SSadaf Ebrahimi         }
315*6467f958SSadaf Ebrahimi 
316*6467f958SSadaf Ebrahimi         else if( strcmp( argv[i], "do_not_force_fill" ) == 0 )
317*6467f958SSadaf Ebrahimi         {
318*6467f958SSadaf Ebrahimi             g_write_allocations = 0;
319*6467f958SSadaf Ebrahimi         }
320*6467f958SSadaf Ebrahimi 
321*6467f958SSadaf Ebrahimi         else if( strcmp( argv[i], "do_not_execute" ) == 0 )
322*6467f958SSadaf Ebrahimi         {
323*6467f958SSadaf Ebrahimi             g_execute_kernel = 0;
324*6467f958SSadaf Ebrahimi         }
325*6467f958SSadaf Ebrahimi 
326*6467f958SSadaf Ebrahimi         else if ( strcmp( argv[i], "--help" ) == 0 || strcmp( argv[i], "-h" ) == 0 )
327*6467f958SSadaf Ebrahimi         {
328*6467f958SSadaf Ebrahimi             printUsage( argv[0] );
329*6467f958SSadaf Ebrahimi             free(argList);
330*6467f958SSadaf Ebrahimi             return -1;
331*6467f958SSadaf Ebrahimi         }
332*6467f958SSadaf Ebrahimi 
333*6467f958SSadaf Ebrahimi         else
334*6467f958SSadaf Ebrahimi         {
335*6467f958SSadaf Ebrahimi             argList[argCount] = argv[i];
336*6467f958SSadaf Ebrahimi             argCount++;
337*6467f958SSadaf Ebrahimi         }
338*6467f958SSadaf Ebrahimi     }
339*6467f958SSadaf Ebrahimi 
340*6467f958SSadaf Ebrahimi     int ret = runTestHarnessWithCheck( argCount, argList, test_num, test_list, false, 0, init_cl );
341*6467f958SSadaf Ebrahimi 
342*6467f958SSadaf Ebrahimi     free(argList);
343*6467f958SSadaf Ebrahimi     return ret;
344*6467f958SSadaf Ebrahimi }
345*6467f958SSadaf Ebrahimi 
printUsage(const char * execName)346*6467f958SSadaf Ebrahimi void printUsage( const char *execName )
347*6467f958SSadaf Ebrahimi {
348*6467f958SSadaf Ebrahimi     const char *p = strrchr( execName, '/' );
349*6467f958SSadaf Ebrahimi     if( p != NULL )
350*6467f958SSadaf Ebrahimi         execName = p + 1;
351*6467f958SSadaf Ebrahimi 
352*6467f958SSadaf Ebrahimi     log_info( "Usage: %s [options] [test_names]\n", execName );
353*6467f958SSadaf Ebrahimi     log_info( "Options:\n" );
354*6467f958SSadaf Ebrahimi     log_info( "\trandomize - Uses random seed\n" );
355*6467f958SSadaf Ebrahimi     log_info( "\tsingle - Tests using a single allocation as large as possible\n" );
356*6467f958SSadaf Ebrahimi     log_info( "\tmultiple - Tests using as many allocations as possible\n" );
357*6467f958SSadaf Ebrahimi     log_info( "\n" );
358*6467f958SSadaf Ebrahimi     log_info( "\tnumReps - Optional integer specifying the number of repetitions to run and average the result (defaults to 1)\n" );
359*6467f958SSadaf Ebrahimi     log_info( "\treduction%% - Optional integer, followed by a %% sign, that acts as a multiplier for the target amount of memory.\n" );
360*6467f958SSadaf Ebrahimi     log_info( "\t             Example: target amount of 512MB and a reduction of 75%% will result in a target of 384MB.\n" );
361*6467f958SSadaf Ebrahimi     log_info( "\n" );
362*6467f958SSadaf Ebrahimi     log_info( "\tdo_not_force_fill - Disable explicitly write data to all memory objects after creating them.\n" );
363*6467f958SSadaf Ebrahimi     log_info( "\t                    Without this, the kernel execution can not verify its checksum.\n" );
364*6467f958SSadaf Ebrahimi     log_info( "\tdo_not_execute - Disable executing a kernel that accesses all of the memory objects.\n" );
365*6467f958SSadaf Ebrahimi     log_info( "\n" );
366*6467f958SSadaf Ebrahimi     log_info( "Test names (Allocation Types):\n" );
367*6467f958SSadaf Ebrahimi     for( int i = 0; i < test_num; i++ )
368*6467f958SSadaf Ebrahimi     {
369*6467f958SSadaf Ebrahimi         log_info( "\t%s\n", test_list[i].name );
370*6467f958SSadaf Ebrahimi     }
371*6467f958SSadaf Ebrahimi }
372