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 <stdio.h>
17*6467f958SSadaf Ebrahimi #include <stdlib.h>
18*6467f958SSadaf Ebrahimi #include <string.h>
19*6467f958SSadaf Ebrahimi
20*6467f958SSadaf Ebrahimi #if !defined (_WIN32)
21*6467f958SSadaf Ebrahimi #include <sys/resource.h>
22*6467f958SSadaf Ebrahimi #if defined(__APPLE__)
23*6467f958SSadaf Ebrahimi #include <sys/sysctl.h>
24*6467f958SSadaf Ebrahimi #endif
25*6467f958SSadaf Ebrahimi #include <libgen.h>
26*6467f958SSadaf Ebrahimi #include <sys/param.h>
27*6467f958SSadaf Ebrahimi #endif
28*6467f958SSadaf Ebrahimi
29*6467f958SSadaf Ebrahimi #include "harness/testHarness.h"
30*6467f958SSadaf Ebrahimi #include "harness/mingw_compat.h"
31*6467f958SSadaf Ebrahimi #include "harness/parseParameters.h"
32*6467f958SSadaf Ebrahimi #if defined (__MINGW32__)
33*6467f958SSadaf Ebrahimi #include <sys/param.h>
34*6467f958SSadaf Ebrahimi #endif
35*6467f958SSadaf Ebrahimi
36*6467f958SSadaf Ebrahimi #include "cl_utils.h"
37*6467f958SSadaf Ebrahimi #include "tests.h"
38*6467f958SSadaf Ebrahimi
39*6467f958SSadaf Ebrahimi const char ** argList = NULL;
40*6467f958SSadaf Ebrahimi size_t argCount = 0;
41*6467f958SSadaf Ebrahimi char appName[64] = "ctest";
42*6467f958SSadaf Ebrahimi const char *addressSpaceNames[AS_NumAddressSpaces] = {"global", "private", "local", "constant"};
43*6467f958SSadaf Ebrahimi
44*6467f958SSadaf Ebrahimi #pragma mark -
45*6467f958SSadaf Ebrahimi #pragma mark Declarations
46*6467f958SSadaf Ebrahimi
47*6467f958SSadaf Ebrahimi
48*6467f958SSadaf Ebrahimi static int ParseArgs( int argc, const char **argv );
49*6467f958SSadaf Ebrahimi static void PrintUsage( void );
50*6467f958SSadaf Ebrahimi
51*6467f958SSadaf Ebrahimi
52*6467f958SSadaf Ebrahimi int g_arrVecSizes[kVectorSizeCount+kStrangeVectorSizeCount];
53*6467f958SSadaf Ebrahimi int g_arrVecAligns[kLargestVectorSize+1];
54*6467f958SSadaf Ebrahimi static int arrStrangeVecSizes[kStrangeVectorSizeCount] = {3};
55*6467f958SSadaf Ebrahimi
56*6467f958SSadaf Ebrahimi test_definition test_list[] = {
57*6467f958SSadaf Ebrahimi ADD_TEST( vload_half ),
58*6467f958SSadaf Ebrahimi ADD_TEST( vloada_half ),
59*6467f958SSadaf Ebrahimi ADD_TEST( vstore_half ),
60*6467f958SSadaf Ebrahimi ADD_TEST( vstorea_half ),
61*6467f958SSadaf Ebrahimi ADD_TEST( vstore_half_rte ),
62*6467f958SSadaf Ebrahimi ADD_TEST( vstorea_half_rte ),
63*6467f958SSadaf Ebrahimi ADD_TEST( vstore_half_rtz ),
64*6467f958SSadaf Ebrahimi ADD_TEST( vstorea_half_rtz ),
65*6467f958SSadaf Ebrahimi ADD_TEST( vstore_half_rtp ),
66*6467f958SSadaf Ebrahimi ADD_TEST( vstorea_half_rtp ),
67*6467f958SSadaf Ebrahimi ADD_TEST( vstore_half_rtn ),
68*6467f958SSadaf Ebrahimi ADD_TEST( vstorea_half_rtn ),
69*6467f958SSadaf Ebrahimi ADD_TEST( roundTrip ),
70*6467f958SSadaf Ebrahimi };
71*6467f958SSadaf Ebrahimi
72*6467f958SSadaf Ebrahimi const int test_num = ARRAY_SIZE( test_list );
73*6467f958SSadaf Ebrahimi
main(int argc,const char ** argv)74*6467f958SSadaf Ebrahimi int main (int argc, const char **argv )
75*6467f958SSadaf Ebrahimi {
76*6467f958SSadaf Ebrahimi int error;
77*6467f958SSadaf Ebrahimi int i;
78*6467f958SSadaf Ebrahimi int alignbound;
79*6467f958SSadaf Ebrahimi
80*6467f958SSadaf Ebrahimi for(i = 0; i < kVectorSizeCount; ++i) {
81*6467f958SSadaf Ebrahimi g_arrVecSizes[i] = (1<<i);
82*6467f958SSadaf Ebrahimi }
83*6467f958SSadaf Ebrahimi for(i = 0; i < kStrangeVectorSizeCount; ++i) {
84*6467f958SSadaf Ebrahimi g_arrVecSizes[i+kVectorSizeCount] =
85*6467f958SSadaf Ebrahimi arrStrangeVecSizes[i];
86*6467f958SSadaf Ebrahimi }
87*6467f958SSadaf Ebrahimi
88*6467f958SSadaf Ebrahimi for(i = 0, alignbound=1; i <= kLargestVectorSize; ++i) {
89*6467f958SSadaf Ebrahimi while(alignbound < i) {
90*6467f958SSadaf Ebrahimi alignbound = alignbound<<1;
91*6467f958SSadaf Ebrahimi }
92*6467f958SSadaf Ebrahimi g_arrVecAligns[i] = alignbound;
93*6467f958SSadaf Ebrahimi }
94*6467f958SSadaf Ebrahimi
95*6467f958SSadaf Ebrahimi argc = parseCustomParam(argc, argv);
96*6467f958SSadaf Ebrahimi if (argc == -1)
97*6467f958SSadaf Ebrahimi {
98*6467f958SSadaf Ebrahimi return -1;
99*6467f958SSadaf Ebrahimi }
100*6467f958SSadaf Ebrahimi
101*6467f958SSadaf Ebrahimi if( (error = ParseArgs( argc, argv )) )
102*6467f958SSadaf Ebrahimi goto exit;
103*6467f958SSadaf Ebrahimi
104*6467f958SSadaf Ebrahimi if (gIsEmbedded) {
105*6467f958SSadaf Ebrahimi vlog( "\tProfile: Embedded\n" );
106*6467f958SSadaf Ebrahimi }else
107*6467f958SSadaf Ebrahimi {
108*6467f958SSadaf Ebrahimi vlog( "\tProfile: Full\n" );
109*6467f958SSadaf Ebrahimi }
110*6467f958SSadaf Ebrahimi
111*6467f958SSadaf Ebrahimi fflush( stdout );
112*6467f958SSadaf Ebrahimi error = runTestHarnessWithCheck( argCount, argList, test_num, test_list, true, 0, InitCL );
113*6467f958SSadaf Ebrahimi
114*6467f958SSadaf Ebrahimi exit:
115*6467f958SSadaf Ebrahimi if(gQueue)
116*6467f958SSadaf Ebrahimi {
117*6467f958SSadaf Ebrahimi int flush_error = clFinish(gQueue);
118*6467f958SSadaf Ebrahimi if(flush_error)
119*6467f958SSadaf Ebrahimi {
120*6467f958SSadaf Ebrahimi vlog_error("clFinish failed: %d\n", flush_error);
121*6467f958SSadaf Ebrahimi }
122*6467f958SSadaf Ebrahimi }
123*6467f958SSadaf Ebrahimi
124*6467f958SSadaf Ebrahimi ReleaseCL();
125*6467f958SSadaf Ebrahimi return error;
126*6467f958SSadaf Ebrahimi }
127*6467f958SSadaf Ebrahimi
128*6467f958SSadaf Ebrahimi #pragma mark -
129*6467f958SSadaf Ebrahimi #pragma mark setup
130*6467f958SSadaf Ebrahimi
ParseArgs(int argc,const char ** argv)131*6467f958SSadaf Ebrahimi static int ParseArgs( int argc, const char **argv )
132*6467f958SSadaf Ebrahimi {
133*6467f958SSadaf Ebrahimi int i;
134*6467f958SSadaf Ebrahimi argList = (const char **)calloc(argc, sizeof(char *));
135*6467f958SSadaf Ebrahimi if( NULL == argList )
136*6467f958SSadaf Ebrahimi {
137*6467f958SSadaf Ebrahimi vlog_error( "Failed to allocate memory for argList.\n" );
138*6467f958SSadaf Ebrahimi return 1;
139*6467f958SSadaf Ebrahimi }
140*6467f958SSadaf Ebrahimi
141*6467f958SSadaf Ebrahimi argList[0] = argv[0];
142*6467f958SSadaf Ebrahimi argCount = 1;
143*6467f958SSadaf Ebrahimi
144*6467f958SSadaf Ebrahimi #if (defined( __APPLE__ ) || defined(__linux__) || defined(__MINGW32__))
145*6467f958SSadaf Ebrahimi { // Extract the app name
146*6467f958SSadaf Ebrahimi char baseName[ MAXPATHLEN ];
147*6467f958SSadaf Ebrahimi strncpy( baseName, argv[0], MAXPATHLEN );
148*6467f958SSadaf Ebrahimi char *base = basename( baseName );
149*6467f958SSadaf Ebrahimi if( NULL != base )
150*6467f958SSadaf Ebrahimi {
151*6467f958SSadaf Ebrahimi strncpy( appName, base, sizeof( appName ) );
152*6467f958SSadaf Ebrahimi appName[ sizeof( appName ) -1 ] = '\0';
153*6467f958SSadaf Ebrahimi }
154*6467f958SSadaf Ebrahimi }
155*6467f958SSadaf Ebrahimi #elif defined (_WIN32)
156*6467f958SSadaf Ebrahimi {
157*6467f958SSadaf Ebrahimi char fname[_MAX_FNAME + _MAX_EXT + 1];
158*6467f958SSadaf Ebrahimi char ext[_MAX_EXT];
159*6467f958SSadaf Ebrahimi
160*6467f958SSadaf Ebrahimi errno_t err = _splitpath_s( argv[0], NULL, 0, NULL, 0,
161*6467f958SSadaf Ebrahimi fname, _MAX_FNAME, ext, _MAX_EXT );
162*6467f958SSadaf Ebrahimi if (err == 0) { // no error
163*6467f958SSadaf Ebrahimi strcat (fname, ext); //just cat them, size of frame can keep both
164*6467f958SSadaf Ebrahimi strncpy (appName, fname, sizeof(appName));
165*6467f958SSadaf Ebrahimi appName[ sizeof( appName ) -1 ] = '\0';
166*6467f958SSadaf Ebrahimi }
167*6467f958SSadaf Ebrahimi }
168*6467f958SSadaf Ebrahimi #endif
169*6467f958SSadaf Ebrahimi
170*6467f958SSadaf Ebrahimi vlog( "\n%s", appName );
171*6467f958SSadaf Ebrahimi for( i = 1; i < argc; i++ )
172*6467f958SSadaf Ebrahimi {
173*6467f958SSadaf Ebrahimi const char *arg = argv[i];
174*6467f958SSadaf Ebrahimi if( NULL == arg )
175*6467f958SSadaf Ebrahimi break;
176*6467f958SSadaf Ebrahimi
177*6467f958SSadaf Ebrahimi vlog( "\t%s", arg );
178*6467f958SSadaf Ebrahimi if( arg[0] == '-' )
179*6467f958SSadaf Ebrahimi {
180*6467f958SSadaf Ebrahimi arg++;
181*6467f958SSadaf Ebrahimi while( *arg != '\0' )
182*6467f958SSadaf Ebrahimi {
183*6467f958SSadaf Ebrahimi switch( *arg )
184*6467f958SSadaf Ebrahimi {
185*6467f958SSadaf Ebrahimi case 'd':
186*6467f958SSadaf Ebrahimi gTestDouble ^= 1;
187*6467f958SSadaf Ebrahimi break;
188*6467f958SSadaf Ebrahimi
189*6467f958SSadaf Ebrahimi case 'h':
190*6467f958SSadaf Ebrahimi PrintUsage();
191*6467f958SSadaf Ebrahimi return -1;
192*6467f958SSadaf Ebrahimi
193*6467f958SSadaf Ebrahimi case 't':
194*6467f958SSadaf Ebrahimi gReportTimes ^= 1;
195*6467f958SSadaf Ebrahimi break;
196*6467f958SSadaf Ebrahimi
197*6467f958SSadaf Ebrahimi case 'r': gHostReset = true; break;
198*6467f958SSadaf Ebrahimi
199*6467f958SSadaf Ebrahimi case 'w': // Wimpy mode
200*6467f958SSadaf Ebrahimi gWimpyMode = true;
201*6467f958SSadaf Ebrahimi break;
202*6467f958SSadaf Ebrahimi case '[':
203*6467f958SSadaf Ebrahimi parseWimpyReductionFactor( arg, gWimpyReductionFactor);
204*6467f958SSadaf Ebrahimi break;
205*6467f958SSadaf Ebrahimi default:
206*6467f958SSadaf Ebrahimi vlog_error( " <-- unknown flag: %c (0x%2.2x)\n)", *arg, *arg );
207*6467f958SSadaf Ebrahimi PrintUsage();
208*6467f958SSadaf Ebrahimi return -1;
209*6467f958SSadaf Ebrahimi }
210*6467f958SSadaf Ebrahimi arg++;
211*6467f958SSadaf Ebrahimi }
212*6467f958SSadaf Ebrahimi }
213*6467f958SSadaf Ebrahimi else
214*6467f958SSadaf Ebrahimi {
215*6467f958SSadaf Ebrahimi argList[ argCount ] = arg;
216*6467f958SSadaf Ebrahimi argCount++;
217*6467f958SSadaf Ebrahimi }
218*6467f958SSadaf Ebrahimi }
219*6467f958SSadaf Ebrahimi
220*6467f958SSadaf Ebrahimi if (getenv("CL_WIMPY_MODE")) {
221*6467f958SSadaf Ebrahimi vlog( "\n" );
222*6467f958SSadaf Ebrahimi vlog( "*** Detected CL_WIMPY_MODE env ***\n" );
223*6467f958SSadaf Ebrahimi gWimpyMode = 1;
224*6467f958SSadaf Ebrahimi }
225*6467f958SSadaf Ebrahimi
226*6467f958SSadaf Ebrahimi PrintArch();
227*6467f958SSadaf Ebrahimi if( gWimpyMode )
228*6467f958SSadaf Ebrahimi {
229*6467f958SSadaf Ebrahimi vlog( "\n" );
230*6467f958SSadaf Ebrahimi vlog( "*** WARNING: Testing in Wimpy mode! ***\n" );
231*6467f958SSadaf Ebrahimi vlog( "*** Wimpy mode is not sufficient to verify correctness. ***\n" );
232*6467f958SSadaf Ebrahimi vlog( "*** It gives warm fuzzy feelings and then nevers calls. ***\n\n" );
233*6467f958SSadaf Ebrahimi vlog( "*** Wimpy Reduction Factor: %-27u ***\n\n", gWimpyReductionFactor);
234*6467f958SSadaf Ebrahimi }
235*6467f958SSadaf Ebrahimi return 0;
236*6467f958SSadaf Ebrahimi }
237*6467f958SSadaf Ebrahimi
PrintUsage(void)238*6467f958SSadaf Ebrahimi static void PrintUsage( void )
239*6467f958SSadaf Ebrahimi {
240*6467f958SSadaf Ebrahimi vlog("%s [-dthw]: <optional: test names>\n", appName);
241*6467f958SSadaf Ebrahimi vlog("\t\t-d\tToggle double precision testing (default: on if double "
242*6467f958SSadaf Ebrahimi "supported)\n");
243*6467f958SSadaf Ebrahimi vlog("\t\t-t\tToggle reporting performance data.\n");
244*6467f958SSadaf Ebrahimi vlog("\t\t-r\tReset buffers on host instead of on device.\n");
245*6467f958SSadaf Ebrahimi vlog("\t\t-w\tRun in wimpy mode\n");
246*6467f958SSadaf Ebrahimi vlog("\t\t-[2^n]\tSet wimpy reduction factor, recommended range of n is "
247*6467f958SSadaf Ebrahimi "1-12, default factor(%u)\n",
248*6467f958SSadaf Ebrahimi gWimpyReductionFactor);
249*6467f958SSadaf Ebrahimi vlog("\t\t-h\tHelp\n");
250*6467f958SSadaf Ebrahimi for (int i = 0; i < test_num; i++)
251*6467f958SSadaf Ebrahimi {
252*6467f958SSadaf Ebrahimi vlog("\t\t%s\n", test_list[i].name );
253*6467f958SSadaf Ebrahimi }
254*6467f958SSadaf Ebrahimi }
255