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