// // Copyright (c) 2017 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include #include #include #if !defined (_WIN32) #include #if !defined(__ANDROID__) #include #endif #include #include #endif #include "../../test_common/harness/testHarness.h" #include "../../test_common/harness/mingw_compat.h" #include "../../test_common/harness/parseParameters.h" #if defined (__MINGW32__) #include #endif #include "cl_utils.h" #include "tests.h" const char ** argList = NULL; size_t argCount = 0; char appName[64] = "ctest"; const char *addressSpaceNames[] = {"global", "private", "local", "constant"}; #pragma mark - #pragma mark Declarations static int ParseArgs( int argc, const char **argv ); static void PrintUsage( void ); static void PrintArch(void); int g_arrVecSizes[kVectorSizeCount+kStrangeVectorSizeCount]; int g_arrVecAligns[kLargestVectorSize+1]; static int arrStrangeVecSizes[kStrangeVectorSizeCount] = {3}; test_definition test_list[] = { ADD_TEST( vload_half ), ADD_TEST( vloada_half ), ADD_TEST( vstore_half ), ADD_TEST( vstorea_half ), ADD_TEST( vstore_half_rte ), ADD_TEST( vstorea_half_rte ), ADD_TEST( vstore_half_rtz ), ADD_TEST( vstorea_half_rtz ), ADD_TEST( vstore_half_rtp ), ADD_TEST( vstorea_half_rtp ), ADD_TEST( vstore_half_rtn ), ADD_TEST( vstorea_half_rtn ), ADD_TEST( roundTrip ), }; const int test_num = ARRAY_SIZE( test_list ); int main (int argc, const char **argv ) { int error; int i; int alignbound; for(i = 0; i < kVectorSizeCount; ++i) { g_arrVecSizes[i] = (1< 0) { vlog_error("FAILED %d sub-tests.\n", gFailCount); } ReleaseCL(); return error; } #pragma mark - #pragma mark setup static int ParseArgs( int argc, const char **argv ) { int i; argList = (const char **)calloc( argc - 1, sizeof( char*) ); if( NULL == argList ) { vlog_error( "Failed to allocate memory for argList.\n" ); return 1; } argList[0] = argv[0]; argCount = 1; #if (defined( __APPLE__ ) || defined(__linux__) || defined(__MINGW32__)) { // Extract the app name char baseName[ MAXPATHLEN ]; strncpy( baseName, argv[0], MAXPATHLEN ); char *base = basename( baseName ); if( NULL != base ) { strncpy( appName, base, sizeof( appName ) ); appName[ sizeof( appName ) -1 ] = '\0'; } } #elif defined (_WIN32) { char fname[_MAX_FNAME + _MAX_EXT + 1]; char ext[_MAX_EXT]; errno_t err = _splitpath_s( argv[0], NULL, 0, NULL, 0, fname, _MAX_FNAME, ext, _MAX_EXT ); if (err == 0) { // no error strcat (fname, ext); //just cat them, size of frame can keep both strncpy (appName, fname, sizeof(appName)); appName[ sizeof( appName ) -1 ] = '\0'; } } #endif vlog( "\n%s", appName ); for( i = 1; i < argc; i++ ) { const char *arg = argv[i]; if( NULL == arg ) break; vlog( "\t%s", arg ); if( arg[0] == '-' ) { arg++; while( *arg != '\0' ) { switch( *arg ) { case 'd': gTestDouble ^= 1; break; case 'h': PrintUsage(); return -1; case 't': gReportTimes ^= 1; break; case 'w': // Wimpy mode gWimpyMode = true; break; case '[': parseWimpyReductionFactor( arg, gWimpyReductionFactor); break; default: vlog_error( " <-- unknown flag: %c (0x%2.2x)\n)", *arg, *arg ); PrintUsage(); return -1; } arg++; } } else { argList[ argCount ] = arg; argCount++; } } if (getenv("CL_WIMPY_MODE")) { vlog( "\n" ); vlog( "*** Detected CL_WIMPY_MODE env ***\n" ); gWimpyMode = 1; } vlog( "Test binary built %s %s\n", __DATE__, __TIME__ ); PrintArch(); if( gWimpyMode ) { vlog( "\n" ); vlog( "*** WARNING: Testing in Wimpy mode! ***\n" ); vlog( "*** Wimpy mode is not sufficient to verify correctness. ***\n" ); vlog( "*** It gives warm fuzzy feelings and then nevers calls. ***\n\n" ); vlog( "*** Wimpy Reduction Factor: %-27u ***\n\n", gWimpyReductionFactor); } return 0; } static void PrintUsage( void ) { vlog( "%s [-dthw]: \n", appName ); vlog( "\t\t-d\tToggle double precision testing (default: on if double supported)\n" ); vlog( "\t\t-t\tToggle reporting performance data.\n" ); vlog( "\t\t-w\tRun in wimpy mode\n" ); vlog( "\t\t-[2^n]\tSet wimpy reduction factor, recommended range of n is 1-12, default factor(%u)\n", gWimpyReductionFactor); vlog( "\t\t-h\tHelp\n" ); for( int i = 0; i < test_num; i++ ) { vlog("\t\t%s\n", test_list[i].name ); } } static void PrintArch( void ) { vlog( "sizeof( void*) = %ld\n", sizeof( void *) ); #if defined( __APPLE__ ) #if defined( __ppc__ ) vlog( "ARCH:\tppc\n" ); #elif defined( __ppc64__ ) vlog( "ARCH:\tppc64\n" ); #elif defined( __i386__ ) vlog( "ARCH:\ti386\n" ); #elif defined( __x86_64__ ) vlog( "ARCH:\tx86_64\n" ); #elif defined( __arm__ ) vlog( "ARCH:\tarm\n" ); #elif defined( __aarch64__ ) vlog( "\tARCH:\taarch64\n" ); #else #error unknown arch #endif int type = 0; size_t typeSize = sizeof( type ); sysctlbyname( "hw.cputype", &type, &typeSize, NULL, 0 ); vlog( "cpu type:\t%d\n", type ); typeSize = sizeof( type ); sysctlbyname( "hw.cpusubtype", &type, &typeSize, NULL, 0 ); vlog( "cpu subtype:\t%d\n", type ); #endif }