Port framework changes from master

Now requiring the headers to be configured for OpenCL > 2.1.
This commit is contained in:
Kevin Petit
2019-07-31 12:01:00 +01:00
committed by Kévin Petit
parent e535e0aa21
commit 59e2da3b4e
75 changed files with 1418 additions and 196 deletions

View File

@@ -19,7 +19,7 @@ set(CLConform_VERSION "${CLConform_VERSION_MAJOR}.${CLConform_VERSION_MINOR}")
set(CLConform_VERSION_FULL set(CLConform_VERSION_FULL
"${CLConform_VERSION}.${CLConform_VERSION_MICRO}${CLConform_VERSION_EXTRA}") "${CLConform_VERSION}.${CLConform_VERSION_MICRO}${CLConform_VERSION_EXTRA}")
add_definitions(-DCL_TARGET_OPENCL_VERSION=200) add_definitions(-DCL_TARGET_OPENCL_VERSION=220)
add_definitions(-DCL_USE_DEPRECATED_OPENCL_2_0_APIS=1) add_definitions(-DCL_USE_DEPRECATED_OPENCL_2_0_APIS=1)
add_definitions(-DCL_USE_DEPRECATED_OPENCL_1_2_APIS=1) add_definitions(-DCL_USE_DEPRECATED_OPENCL_1_2_APIS=1)

104
test_common/harness/crc32.c Normal file
View File

@@ -0,0 +1,104 @@
/*-
* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
* code or tables extracted from it, as desired without restriction.
*
* First, the polynomial itself and its table of feedback terms. The
* polynomial is
* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
*
* Note that we take it "backwards" and put the highest-order term in
* the lowest-order bit. The X^32 term is "implied"; the LSB is the
* X^31 term, etc. The X^0 term (usually shown as "+1") results in
* the MSB being 1
*
* Note that the usual hardware shift register implementation, which
* is what we're using (we're merely optimizing it by doing eight-bit
* chunks at a time) shifts bits into the lowest-order term. In our
* implementation, that means shifting towards the right. Why do we
* do it this way? Because the calculated CRC must be transmitted in
* order from highest-order term to lowest-order term. UARTs transmit
* characters in order from LSB to MSB. By storing the CRC this way
* we hand it to the UART in the order low-byte to high-byte; the UART
* sends each low-bit to hight-bit; and the result is transmission bit
* by bit from highest- to lowest-order term without requiring any bit
* shuffling on our part. Reception works similarly
*
* The feedback terms table consists of 256, 32-bit entries. Notes
*
* The table can be generated at runtime if desired; code to do so
* is shown later. It might not be obvious, but the feedback
* terms simply represent the results of eight shift/xor opera
* tions for all combinations of data and CRC register values
*
* The values must be right-shifted by eight bits by the "updcrc
* logic; the shift must be unsigned (bring in zeroes). On some
* hardware you could probably optimize the shift in assembler by
* using byte-swap instructions
* polynomial $edb88320
*
*
* CRC32 code derived from work by Gary S. Brown.
*/
#include "crc32.h"
static uint32_t crc32_tab[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
uint32_t
crc32(const void *buf, size_t size)
{
const uint8_t *p;
p = (const uint8_t*)buf;
uint32_t crc = ~0U;
while (size--)
crc = crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
return crc ^ ~0U;
}

View File

@@ -0,0 +1,34 @@
/******************************************************************
Copyright (c) 2016 The Khronos Group Inc.
All Rights Reserved. This code is protected by copyright laws and
contains material proprietary to the Khronos Group, Inc.
This is UNPUBLISHED PROPRIETARY SOURCE CODE that may not be disclosed
in whole or in part to third parties, and may not be reproduced, republished,
distributed, transmitted, displayed, broadcast or otherwise exploited in any
manner without the express prior written permission of Khronos Group.
The receipt or possession of this code does not convey any rights to
reproduce, disclose, or distribute its contents, or to
manufacture, use, or sell anything that it may describe, in whole
or in part other than under the terms of the Khronos Adopters
Agreement or Khronos Conformance Test Source License Agreement as
executed between Khronos and the recipient.
******************************************************************/
#ifndef _CRC32_H_
#define _CRC32_H_
#include <stdint.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
uint32_t crc32(const void *buf, size_t size);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -20,6 +20,8 @@
#include "errorHelpers.h" #include "errorHelpers.h"
#include "parseParameters.h"
const char *IGetErrorString( int clErrorCode ) const char *IGetErrorString( int clErrorCode )
{ {
switch( clErrorCode ) switch( clErrorCode )
@@ -705,6 +707,48 @@ const char * subtests_requiring_opencl_1_2[] = {
"popcount" "popcount"
}; };
const char * subtests_to_skip_with_offline_compiler[] = {
"get_kernel_arg_info",
"binary_create",
"load_program_source",
"load_multistring_source",
"load_two_kernel_source",
"load_null_terminated_source",
"load_null_terminated_multi_line_source",
"load_null_terminated_partial_multi_line_source",
"load_discreet_length_source",
"get_program_source",
"get_program_build_info",
"options_build_optimizations",
"options_build_macro",
"options_build_macro_existence",
"options_include_directory",
"options_denorm_cache",
"preprocessor_define_udef",
"preprocessor_include",
"preprocessor_line_error",
"preprocessor_pragma",
"compiler_defines_for_extensions",
"image_macro",
"simple_extern_compile_only",
"simple_embedded_header_compile",
"two_file_regular_variable_access",
"two_file_regular_struct_access",
"two_file_regular_function_access",
"simple_embedded_header_link",
"execute_after_simple_compile_and_link_with_defines",
"execute_after_simple_compile_and_link_with_callbacks",
"execute_after_embedded_header_link",
"execute_after_included_header_link",
"multi_file_libraries",
"multiple_files",
"multiple_libraries",
"multiple_files_multiple_libraries",
"multiple_embedded_headers",
"program_binary_type",
"compile_and_link_status_options_log",
"kernel_preprocessor_macros",
};
int check_opencl_version_with_testname(const char *subtestname, cl_device_id device) int check_opencl_version_with_testname(const char *subtestname, cl_device_id device)
{ {
@@ -751,4 +795,17 @@ int check_opencl_version(cl_device_id device, cl_uint requestedMajorVersion, cl_
return 1; return 1;
} }
int check_functions_for_offline_compiler(const char *subtestname, cl_device_id device)
{
if (gCompilationMode != kOnline)
{
int nNotRequiredWithOfflineCompiler = sizeof(subtests_to_skip_with_offline_compiler)/sizeof(char *);
size_t i;
for(i=0; i < nNotRequiredWithOfflineCompiler; ++i) {
if(!strcmp(subtestname, subtests_to_skip_with_offline_compiler[i])) {
return 1;
}
}
}
return 0;
}

View File

@@ -87,6 +87,10 @@ extern "C" {
#define test_missing_feature_ret(errCode,msg,retValue) { if( errCode != CL_SUCCESS ) { print_missing_feature( errCode, msg ); return CL_SUCCESS ; } } #define test_missing_feature_ret(errCode,msg,retValue) { if( errCode != CL_SUCCESS ) { print_missing_feature( errCode, msg ); return CL_SUCCESS ; } }
#define print_missing_feature(errCode, msg) log_missing_feature("ERROR: Subtest %s tests a feature not supported by the device version! (from %s:%d)\n", msg, __FILE__, __LINE__ ); #define print_missing_feature(errCode, msg) log_missing_feature("ERROR: Subtest %s tests a feature not supported by the device version! (from %s:%d)\n", msg, __FILE__, __LINE__ );
#define test_missing_support_offline_cmpiler(errCode, msg) test_missing_support_offline_cmpiler_ret(errCode, msg, errCode)
// this macro should always return CL_SUCCESS, but print the skip message on test not supported with offline compiler
#define test_missing_support_offline_cmpiler_ret(errCode,msg,retValue) { if( errCode != CL_SUCCESS ) { log_info( "INFO: Subtest %s tests is not supported in offline compiler execution path! (from %s:%d)\n", msg, __FILE__, __LINE__ ); return TEST_SKIP ; } }
// expected error code vs. what we got // expected error code vs. what we got
#define test_failure_error(errCode, expectedErrCode, msg) test_failure_error_ret(errCode, expectedErrCode, msg, errCode != expectedErrCode) #define test_failure_error(errCode, expectedErrCode, msg) test_failure_error_ret(errCode, expectedErrCode, msg, errCode != expectedErrCode)
#define test_failure_error_ret(errCode, expectedErrCode, msg, retValue) { if( errCode != expectedErrCode ) { print_failure_error( errCode, expectedErrCode, msg ); return retValue ; } } #define test_failure_error_ret(errCode, expectedErrCode, msg, retValue) { if( errCode != expectedErrCode ) { print_failure_error( errCode, expectedErrCode, msg ); return retValue ; } }
@@ -123,6 +127,7 @@ extern const char *GetAddressModeName( cl_addressing_mode mode );
extern const char *GetDeviceTypeName( cl_device_type type ); extern const char *GetDeviceTypeName( cl_device_type type );
int check_opencl_version_with_testname(const char *subtestname, cl_device_id device); int check_opencl_version_with_testname(const char *subtestname, cl_device_id device);
int check_opencl_version(cl_device_id device, cl_uint requestedMajorVersion, cl_uint requestedMinorVersion); int check_opencl_version(cl_device_id device, cl_uint requestedMajorVersion, cl_uint requestedMinorVersion);
int check_functions_for_offline_compiler(const char *subtestname, cl_device_id device);
// NON-REENTRANT UNLESS YOU PROVIDE A BUFFER PTR (pass null to use static storage, but it's not reentrant then!) // NON-REENTRANT UNLESS YOU PROVIDE A BUFFER PTR (pass null to use static storage, but it's not reentrant then!)
extern const char *GetDataVectorString( void *dataBuffer, size_t typeSize, size_t vecSize, char *buffer ); extern const char *GetDataVectorString( void *dataBuffer, size_t typeSize, size_t vecSize, char *buffer );

View File

@@ -13,142 +13,591 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
// //
#include "crc32.h"
#include "kernelHelpers.h" #include "kernelHelpers.h"
#include "errorHelpers.h" #include "errorHelpers.h"
#include "imageHelpers.h" #include "imageHelpers.h"
#include "typeWrappers.h" #include "typeWrappers.h"
#include "testHarness.h"
#include "parseParameters.h"
#include <cassert>
#include <vector>
#include <string>
#include <fstream>
#include <sstream>
#include <iomanip>
#if defined(__MINGW32__) #if defined(__MINGW32__)
#include "mingw_compat.h" #include "mingw_compat.h"
#endif #endif
int create_single_kernel_helper( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, const char **kernelProgram, const char *kernelName ) #if defined(_WIN32)
{ std::string slash = "\\";
int error = CL_SUCCESS; #else
std::string slash = "/";
#endif
/* Create the program object from source */ std::string get_file_name(const std::string &baseName, int index, const std::string &extension)
*outProgram = clCreateProgramWithSource( context, numKernelLines, kernelProgram, NULL, &error );
if( *outProgram == NULL || error != CL_SUCCESS)
{ {
print_error( error, "clCreateProgramWithSource failed" ); std::ostringstream fileName;
return error; fileName << baseName << "." << index << extension;
return fileName.str();
} }
/* Compile the program */ long get_file_size(const std::string &fileName)
int buildProgramFailed = 0; {
int printedSource = 0; std::ifstream ifs(fileName.c_str(), std::ios::binary);
error = clBuildProgram( *outProgram, 0, NULL, NULL, NULL, NULL ); if (!ifs.good())
return 0;
// get length of file:
ifs.seekg(0, std::ios::end);
std::ios::pos_type length = ifs.tellg();
return static_cast<long>(length);
}
std::vector<char> get_file_content(const std::string &fileName)
{
std::ifstream ifs(fileName.c_str(), std::ios::binary);
if (!ifs.good())
return std::vector<char>(0);
// get length of file:
ifs.seekg(0, std::ios::end);
std::ios::pos_type length = ifs.tellg();
ifs.seekg(0, std::ios::beg);
// allocate memory:
std::vector<char> content(static_cast<size_t>(length));
// read data as a block:
ifs.read(&content[0], length);
return content;
}
static std::string get_kernel_content(unsigned int numKernelLines, const char *const *kernelProgram)
{
std::string kernel;
for (size_t i = 0; i < numKernelLines; ++i)
{
std::string chunk(kernelProgram[i], 0, std::string::npos);
kernel += chunk;
}
return kernel;
}
std::string get_kernel_name(const std::string &source)
{
// Count CRC
cl_uint crc = crc32(source.data(), source.size());
// Create list of kernel names
std::string kernelsList;
size_t kPos = source.find("kernel");
while (kPos != std::string::npos)
{
// check for '__kernel'
size_t pos = kPos;
if (pos >= 2 && source[pos - 1] == '_' && source[pos - 2] == '_')
pos -= 2;
//check character before 'kernel' (white space expected)
size_t wsPos = source.find_last_of(" \t\r\n", pos);
if (wsPos == std::string::npos || wsPos + 1 == pos)
{
//check character after 'kernel' (white space expected)
size_t akPos = kPos + sizeof("kernel") - 1;
wsPos = source.find_first_of(" \t\r\n", akPos);
if (!(wsPos == akPos))
{
kPos = source.find("kernel", kPos + 1);
continue;
}
bool attributeFound;
do
{
attributeFound = false;
// find '(' after kernel name name
size_t pPos = source.find("(", akPos);
if (!(pPos != std::string::npos))
continue;
// check for not empty kernel name before '('
pos = source.find_last_not_of(" \t\r\n", pPos - 1);
if (!(pos != std::string::npos && pos > akPos))
continue;
//find character before kernel name
wsPos = source.find_last_of(" \t\r\n", pos);
if (!(wsPos != std::string::npos && wsPos >= akPos))
continue;
std::string name = source.substr(wsPos + 1, pos + 1 - (wsPos + 1));
//check for kernel attribute
if (name == "__attribute__")
{
attributeFound = true;
int pCount = 1;
akPos = pPos + 1;
while (pCount > 0 && akPos != std::string::npos)
{
akPos = source.find_first_of("()", akPos + 1);
if (akPos != std::string::npos)
{
if (source[akPos] == '(')
pCount++;
else
pCount--;
}
}
}
else
{
kernelsList += name + ".";
}
} while (attributeFound);
}
kPos = source.find("kernel", kPos + 1);
}
std::ostringstream oss;
if (MAX_LEN_FOR_KERNEL_LIST > 0)
{
if (kernelsList.size() > MAX_LEN_FOR_KERNEL_LIST + 1)
{
kernelsList = kernelsList.substr(0, MAX_LEN_FOR_KERNEL_LIST + 1);
kernelsList[kernelsList.size() - 1] = '.';
kernelsList[kernelsList.size() - 1] = '.';
}
oss << kernelsList;
}
oss << std::hex << std::setfill('0') << std::setw(8) << crc;
return oss.str();
}
std::string add_build_options(const std::string &baseName, const char *options)
{
if (options == 0 || options[0] == 0)
return get_file_name(baseName, 0, "");
bool equal = false;
int i = 0;
do
{
i++;
std::string fileName = gCompilationCachePath + slash + get_file_name(baseName, i, ".options");
long fileSize = get_file_size(fileName);
if (fileSize == 0)
break;
//if(fileSize == strlen(options))
{
std::vector<char> options2 = get_file_content(fileName);
options2.push_back(0); //terminate string
equal = strcmp(options, &options2[0]) == 0;
}
} while (!equal);
if (equal)
return get_file_name(baseName, i, "");
std::string fileName = gCompilationCachePath + slash + get_file_name(baseName, i, ".options");
std::ofstream ofs(fileName.c_str(), std::ios::binary);
if (!ofs.good())
{
log_info("OfflineCompiler: can't create options: %s\n", fileName.c_str());
return "";
}
// write data as a block:
ofs.write(options, strlen(options));
log_info("OfflineCompiler: options added: %s\n", fileName.c_str());
return get_file_name(baseName, i, "");
}
static std::string get_offline_compilation_file_type_str(const CompilationMode compilationMode)
{
switch (compilationMode)
{
default:
assert(0 && "Invalid compilation mode for offline compilation");
abort();
case kBinary:
return "binary";
case kSpir_v:
return "SPIR-V";
}
}
static std::string get_khronos_compiler_command(const cl_uint device_address_space_size,
const bool openclCXX,
const std::string &bOptions,
const std::string &sourceFilename,
const std::string &outputFilename)
{
// Set compiler options
// Emit SPIR-V
std::string compilerOptions = " -cc1 -emit-spirv";
// <triple>: for 32 bit SPIR-V use spir-unknown-unknown, for 64 bit SPIR-V use spir64-unknown-unknown.
if(device_address_space_size == 32)
{
compilerOptions += " -triple=spir-unknown-unknown";
}
else
{
compilerOptions += " -triple=spir64-unknown-unknown";
}
// Set OpenCL C++ flag required by SPIR-V-ready clang (compiler provided by Khronos)
if(openclCXX)
{
compilerOptions = compilerOptions + " -cl-std=c++";
}
// Set correct includes
if(openclCXX)
{
compilerOptions += " -I ";
compilerOptions += STRINGIFY_VALUE(CL_LIBCLCXX_DIR);
}
else
{
compilerOptions += " -include opencl.h";
}
#ifdef KHRONOS_OFFLINE_COMPILER_OPTIONS
compilerOptions += STRINGIFY_VALUE(KHRONOS_OFFLINE_COMPILER_OPTIONS);
#endif
// Add build options passed to this function
compilerOptions += " " + bOptions;
compilerOptions +=
" " + sourceFilename +
" -o " + outputFilename;
std::string runString = STRINGIFY_VALUE(KHRONOS_OFFLINE_COMPILER) + compilerOptions;
return runString;
}
static std::string get_offline_compilation_command(const cl_uint device_address_space_size,
const CompilationMode compilationMode,
const std::string &bOptions,
const std::string &sourceFilename,
const std::string &outputFilename)
{
std::ostringstream size_t_width_stream;
size_t_width_stream << device_address_space_size;
std::string size_t_width_str = size_t_width_stream.str();
// set output type and default script
std::string outputTypeStr;
std::string defaultScript;
if (compilationMode == kBinary)
{
outputTypeStr = "binary";
#if defined(_WIN32)
defaultScript = "..\\build_script_binary.py ";
#else
defaultScript = "../build_script_binary.py ";
#endif
}
else if (compilationMode == kSpir_v)
{
outputTypeStr = "spir_v";
#if defined(_WIN32)
defaultScript = "..\\build_script_spirv.py ";
#else
defaultScript = "../build_script_spirv.py ";
#endif
}
// set script arguments
std::string scriptArgs = sourceFilename + " " + outputFilename + " " + size_t_width_str + " " + outputTypeStr;
if (!bOptions.empty())
{
//search for 2.0 build options
std::string oclVersion;
std::string buildOptions20 = "-cl-std=CL2.0";
std::size_t found = bOptions.find(buildOptions20);
if (found != std::string::npos)
oclVersion = "20";
else
oclVersion = "12";
std::string bOptionsWRemovedStd20 = bOptions;
std::string::size_type i = bOptions.find(buildOptions20);
if (i != std::string::npos)
bOptionsWRemovedStd20.erase(i, buildOptions20.length());
//remove space before -cl-std=CL2.0 if it was first build option
size_t spacePos = bOptionsWRemovedStd20.find_last_of(" \t\r\n", i);
if (spacePos != std::string::npos && i == 0)
bOptionsWRemovedStd20.erase(spacePos, sizeof(char));
//remove space after -cl-std=CL2.0
spacePos = bOptionsWRemovedStd20.find_first_of(" \t\r\n", i - 1);
if (spacePos != std::string::npos)
bOptionsWRemovedStd20.erase(spacePos, sizeof(char));
if (!bOptionsWRemovedStd20.empty())
scriptArgs += " " + oclVersion + " \"" + bOptionsWRemovedStd20 + "\"";
else
scriptArgs += " " + oclVersion;
}
else
scriptArgs += " 12";
// set script command line
std::string scriptToRunString = defaultScript + scriptArgs;
return scriptToRunString;
}
static int invoke_offline_compiler(cl_context context,
const cl_uint device_address_space_size,
const CompilationMode compilationMode,
const std::string &bOptions,
const std::string &sourceFilename,
const std::string &outputFilename,
const bool openclCXX)
{
std::string runString;
if (openclCXX)
{
#ifndef KHRONOS_OFFLINE_COMPILER
log_error("CL C++ compilation is not possible: KHRONOS_OFFLINE_COMPILER was not defined.\n");
return CL_INVALID_OPERATION;
#else
runString = get_khronos_compiler_command(device_address_space_size, openclCXX, bOptions,
sourceFilename, outputFilename);
#endif
}
else
{
runString = get_offline_compilation_command(device_address_space_size, compilationMode, bOptions,
sourceFilename, outputFilename);
}
// execute script
log_info("Executing command: %s\n", runString.c_str());
fflush(stdout);
int returnCode = system(runString.c_str());
if (returnCode != 0)
{
log_error("ERROR: Command finished with error: 0x%x\n", returnCode);
return CL_COMPILE_PROGRAM_FAILURE;
}
return CL_SUCCESS;
}
static cl_int get_first_device_id(const cl_context context, cl_device_id &device)
{
cl_uint numDevices = 0;
cl_int error = clGetContextInfo(context, CL_CONTEXT_NUM_DEVICES, sizeof(cl_uint), &numDevices, NULL);
test_error(error, "clGetContextInfo failed getting CL_CONTEXT_NUM_DEVICES");
if (numDevices == 0)
{
log_error("ERROR: No CL devices found\n");
return -1;
}
std::vector<cl_device_id> devices(numDevices, 0);
error = clGetContextInfo(context, CL_CONTEXT_DEVICES, numDevices*sizeof(cl_device_id), &devices[0], NULL);
test_error(error, "clGetContextInfo failed getting CL_CONTEXT_DEVICES");
device = devices[0];
return CL_SUCCESS;
}
static cl_int get_first_device_address_bits(const cl_context context, cl_uint &device_address_space_size)
{
cl_device_id device;
cl_int error = get_first_device_id(context, device);
if (error != CL_SUCCESS) if (error != CL_SUCCESS)
{ {
unsigned int i;
print_error(error, "clBuildProgram failed");
buildProgramFailed = 1;
printedSource = 1;
log_error( "Original source is: ------------\n" );
for( i = 0; i < numKernelLines; i++ )
log_error( "%s", kernelProgram[ i ] );
}
// Verify the build status on all devices
cl_uint deviceCount = 0;
error = clGetProgramInfo( *outProgram, CL_PROGRAM_NUM_DEVICES, sizeof( deviceCount ), &deviceCount, NULL );
if (error != CL_SUCCESS) {
print_error(error, "clGetProgramInfo CL_PROGRAM_NUM_DEVICES failed");
return error; return error;
} }
if (deviceCount == 0) { error = clGetDeviceInfo(device, CL_DEVICE_ADDRESS_BITS, sizeof(cl_uint), &device_address_space_size, NULL);
log_error("No devices found for program.\n"); test_error(error, "Unable to obtain device address bits");
return -1;
}
cl_device_id *devices = (cl_device_id*) malloc( deviceCount * sizeof( cl_device_id ) ); if (device_address_space_size != 32 && device_address_space_size != 64)
if( NULL == devices )
return -1;
BufferOwningPtr<cl_device_id> devicesBuf(devices);
memset( devices, 0, deviceCount * sizeof( cl_device_id ));
error = clGetProgramInfo( *outProgram, CL_PROGRAM_DEVICES, sizeof( cl_device_id ) * deviceCount, devices, NULL );
if (error != CL_SUCCESS) {
print_error(error, "clGetProgramInfo CL_PROGRAM_DEVICES failed");
return error;
}
cl_uint z;
for( z = 0; z < deviceCount; z++ )
{ {
char deviceName[4096] = ""; log_error("ERROR: Unexpected number of device address bits: %u\n", device_address_space_size);
error = clGetDeviceInfo(devices[z], CL_DEVICE_NAME, sizeof( deviceName), deviceName, NULL);
if (error != CL_SUCCESS || deviceName[0] == '\0') {
log_error("Device \"%d\" failed to return a name\n", z);
print_error(error, "clGetDeviceInfo CL_DEVICE_NAME failed");
}
cl_build_status buildStatus;
error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL);
if (error != CL_SUCCESS) {
print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_STATUS failed");
return error;
}
if (buildStatus != CL_BUILD_SUCCESS || buildProgramFailed) {
char log[10240] = "";
if (buildStatus == CL_BUILD_SUCCESS && buildProgramFailed) log_error("clBuildProgram returned an error, but buildStatus is marked as CL_BUILD_SUCCESS.\n");
char statusString[64] = "";
if (buildStatus == (cl_build_status)CL_BUILD_SUCCESS)
sprintf(statusString, "CL_BUILD_SUCCESS");
else if (buildStatus == (cl_build_status)CL_BUILD_NONE)
sprintf(statusString, "CL_BUILD_NONE");
else if (buildStatus == (cl_build_status)CL_BUILD_ERROR)
sprintf(statusString, "CL_BUILD_ERROR");
else if (buildStatus == (cl_build_status)CL_BUILD_IN_PROGRESS)
sprintf(statusString, "CL_BUILD_IN_PROGRESS");
else
sprintf(statusString, "UNKNOWN (%d)", buildStatus);
if (buildStatus != CL_BUILD_SUCCESS) log_error("Build not successful for device \"%s\", status: %s\n", deviceName, statusString);
error = clGetProgramBuildInfo( *outProgram, devices[z], CL_PROGRAM_BUILD_LOG, sizeof(log), log, NULL );
if (error != CL_SUCCESS || log[0]=='\0'){
log_error("Device %d (%s) failed to return a build log\n", z, deviceName);
if (error) {
print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed");
return error;
} else {
log_error("clGetProgramBuildInfo returned an empty log.\n");
return -1; return -1;
} }
return CL_SUCCESS;
} }
// In this case we've already printed out the code above.
if (!printedSource) static int get_offline_compiler_output(std::ifstream &ifs,
cl_context context,
const std::string &kernel,
const bool openclCXX,
const CompilationMode compilationMode,
const std::string &bOptions,
const std::string &kernelName)
{ {
unsigned int i; std::string sourceFilename = gCompilationCachePath + slash + kernelName + ".cl";
log_error( "Original source is: ------------\n" );
for( i = 0; i < numKernelLines; i++ ) // Get device CL_DEVICE_ADDRESS_BITS
log_error( "%s", kernelProgram[ i ] ); cl_uint device_address_space_size = 0;
printedSource = 1; int error = get_first_device_address_bits(context, device_address_space_size);
if (error != CL_SUCCESS)
return error;
std::string outputFilename = gCompilationCachePath + slash + kernelName;
if (compilationMode == kSpir_v)
{
std::ostringstream extension;
extension << ".spv" << device_address_space_size;
outputFilename += extension.str();
} }
log_error( "Build log for device \"%s\" is: ------------\n", deviceName );
log_error( "%s\n", log ); // try to read cached output file when test is run with gCompilationCacheMode != kCacheModeOverwrite
log_error( "\n----------\n" ); ifs.open(outputFilename.c_str(), std::ios::binary);
if (gCompilationCacheMode == kCacheModeOverwrite || !ifs.good())
{
std::string file_type = get_offline_compilation_file_type_str(compilationMode);
if (gCompilationCacheMode == kCacheModeForceRead)
{
log_info("OfflineCompiler: can't open cached %s file: %s\n",
file_type.c_str(), outputFilename.c_str());
return -1;
}
ifs.close();
if (gCompilationCacheMode != kCacheModeOverwrite)
log_info("OfflineCompiler: can't find cached %s file: %s\n",
file_type.c_str(), outputFilename.c_str());
std::ofstream ofs(sourceFilename.c_str(), std::ios::binary);
if (!ofs.good())
{
log_info("OfflineCompiler: can't create source file: %s\n", sourceFilename.c_str());
return -1;
}
// write source to input file
ofs.write(kernel.c_str(), kernel.size());
ofs.close();
error = invoke_offline_compiler(context, device_address_space_size, compilationMode,
bOptions, sourceFilename, outputFilename, openclCXX);
if (error != CL_SUCCESS)
return error;
// read output file
ifs.open(outputFilename.c_str(), std::ios::binary);
if (!ifs.good())
{
log_info("OfflineCompiler: can't read generated %s file: %s\n",
file_type.c_str(), outputFilename.c_str());
return -1; return -1;
} }
} }
/* And create a kernel from it */ return CL_SUCCESS;
*outKernel = clCreateKernel( *outProgram, kernelName, &error ); }
if( *outKernel == NULL || error != CL_SUCCESS)
static int create_single_kernel_helper_create_program_offline(cl_context context,
cl_program *outProgram,
unsigned int numKernelLines,
const char *const *kernelProgram,
const char *buildOptions,
const bool openclCXX,
CompilationMode compilationMode)
{ {
print_error( error, "Unable to create kernel" ); int error;
std::string kernel = get_kernel_content(numKernelLines, kernelProgram);
std::string kernelName = get_kernel_name(kernel);
// set build options
std::string bOptions;
bOptions += buildOptions ? std::string(buildOptions) : "";
kernelName = add_build_options(kernelName, buildOptions);
std::ifstream ifs;
error = get_offline_compiler_output(ifs, context, kernel, openclCXX, compilationMode, bOptions, kernelName);
if (error != CL_SUCCESS)
return error;
// -----------------------------------------------------------------------------------
// ------------- ONLY FOR OPENCL 22 CONFORMANCE TEST 22 DEVELOPMENT ------------------
// -----------------------------------------------------------------------------------
// Only OpenCL C++ to SPIR-V compilation
#if defined(DEVELOPMENT) && defined(ONLY_SPIRV_COMPILATION)
if(openclCXX)
{
return CL_SUCCESS;
}
#endif
ifs.seekg(0, ifs.end);
int length = ifs.tellg();
ifs.seekg(0, ifs.beg);
//treat modifiedProgram as input for clCreateProgramWithBinary
if (compilationMode == kBinary)
{
// read binary from file:
std::vector<unsigned char> modifiedKernelBuf(length);
ifs.read((char *)&modifiedKernelBuf[0], length);
ifs.close();
cl_device_id device;
error = get_first_device_id(context, device);
test_error(error, "Failed to get device ID");
size_t lengths = modifiedKernelBuf.size();
const unsigned char *binaries = { &modifiedKernelBuf[0] };
log_info("offlineCompiler: clCreateProgramWithSource replaced with clCreateProgramWithBinary\n");
*outProgram = clCreateProgramWithBinary(context, 1, &device, &lengths, &binaries, NULL, &error);
if (*outProgram == NULL || error != CL_SUCCESS)
{
print_error(error, "clCreateProgramWithBinary failed");
return error; return error;
} }
}
//treat modifiedProgram as input for clCreateProgramWithIL
else if (compilationMode == kSpir_v)
{
// read spir-v from file:
std::vector<unsigned char> modifiedKernelBuf(length);
return 0; ifs.read((char *)&modifiedKernelBuf[0], length);
ifs.close();
size_t length = modifiedKernelBuf.size();
log_info("offlineCompiler: clCreateProgramWithSource replaced with clCreateProgramWithIL\n");
*outProgram = clCreateProgramWithIL(context, &modifiedKernelBuf[0], length, &error);
if (*outProgram == NULL || error != CL_SUCCESS)
{
print_error(error, "clCreateProgramWithIL failed");
return error;
}
} }
return CL_SUCCESS;
}
int create_single_kernel_helper_with_build_options( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, static int create_single_kernel_helper_create_program(cl_context context,
const char **kernelProgram, const char *kernelName, const char *buildOptions ) cl_program *outProgram,
unsigned int numKernelLines,
const char **kernelProgram,
const char *buildOptions,
const bool openclCXX,
CompilationMode compilationMode)
{
if (compilationMode == kOnline)
{ {
int error = CL_SUCCESS; int error = CL_SUCCESS;
@@ -159,7 +608,140 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr
print_error(error, "clCreateProgramWithSource failed"); print_error(error, "clCreateProgramWithSource failed");
return error; return error;
} }
return CL_SUCCESS;
}
else
{
return create_single_kernel_helper_create_program_offline(context, outProgram, numKernelLines,
kernelProgram, buildOptions,
openclCXX, compilationMode);
}
}
int create_single_kernel_helper_create_program(cl_context context,
cl_program *outProgram,
unsigned int numKernelLines,
const char **kernelProgram,
const char *buildOptions,
const bool openclCXX)
{
return create_single_kernel_helper_create_program(context, outProgram, numKernelLines,
kernelProgram, buildOptions,
openclCXX, gCompilationMode);
}
int create_single_kernel_helper_with_build_options(cl_context context,
cl_program *outProgram,
cl_kernel *outKernel,
unsigned int numKernelLines,
const char **kernelProgram,
const char *kernelName,
const char *buildOptions,
const bool openclCXX)
{
return create_single_kernel_helper(context, outProgram, outKernel, numKernelLines, kernelProgram, kernelName, buildOptions, openclCXX);
}
// Creates and builds OpenCL C/C++ program, and creates a kernel
int create_single_kernel_helper(cl_context context,
cl_program *outProgram,
cl_kernel *outKernel,
unsigned int numKernelLines,
const char **kernelProgram,
const char *kernelName,
const char *buildOptions,
const bool openclCXX)
{
int error;
// Create OpenCL C++ program
if(openclCXX)
{
// -----------------------------------------------------------------------------------
// ------------- ONLY FOR OPENCL 22 CONFORMANCE TEST 22 DEVELOPMENT ------------------
// -----------------------------------------------------------------------------------
// Only OpenCL C++ to SPIR-V compilation
#if defined(DEVELOPMENT) && defined(ONLY_SPIRV_COMPILATION)
// Save global variable
bool tempgCompilationCacheMode = gCompilationCacheMode;
// Force OpenCL C++ -> SPIR-V compilation on every run
gCompilationCacheMode = kCacheModeOverwrite;
#endif
error = create_openclcpp_program(
context, outProgram, numKernelLines, kernelProgram, buildOptions
);
if (error != CL_SUCCESS)
{
log_error("Create program failed: %d, line: %d\n", error, __LINE__);
return error;
}
// -----------------------------------------------------------------------------------
// ------------- ONLY FOR OPENCL 22 CONFORMANCE TEST 22 DEVELOPMENT ------------------
// -----------------------------------------------------------------------------------
#if defined(DEVELOPMENT) && defined(ONLY_SPIRV_COMPILATION)
// Restore global variables
gCompilationCacheMode = tempgCompilationCacheMode;
log_info("WARNING: KERNEL %s WAS ONLY COMPILED TO SPIR-V\n", kernelName);
return error;
#endif
}
// Create OpenCL C program
else
{
error = create_single_kernel_helper_create_program(
context, outProgram, numKernelLines, kernelProgram, buildOptions
);
if (error != CL_SUCCESS)
{
log_error("Create program failed: %d, line: %d\n", error, __LINE__);
return error;
}
}
// Remove offline-compiler-only build options
std::string newBuildOptions;
if (buildOptions != NULL)
{
newBuildOptions = buildOptions;
std::string offlineCompierOptions[] = {
"-cl-fp16-enable",
"-cl-fp64-enable",
"-cl-zero-init-local-mem-vars"
};
for(auto& s : offlineCompierOptions)
{
std::string::size_type i = newBuildOptions.find(s);
if (i != std::string::npos)
newBuildOptions.erase(i, s.length());
}
}
// Build program and create kernel
return build_program_create_kernel_helper(
context, outProgram, outKernel, numKernelLines, kernelProgram, kernelName, newBuildOptions.c_str()
);
}
// Creates OpenCL C++ program
int create_openclcpp_program(cl_context context,
cl_program *outProgram,
unsigned int numKernelLines,
const char **kernelProgram,
const char *buildOptions)
{
// Create program
return create_single_kernel_helper_create_program(
context, outProgram, numKernelLines, kernelProgram, buildOptions, true, kSpir_v
);
}
// Builds OpenCL C/C++ program and creates
int build_program_create_kernel_helper(cl_context context,
cl_program *outProgram,
cl_kernel *outKernel,
unsigned int numKernelLines,
const char **kernelProgram,
const char *kernelName,
const char *buildOptions)
{
int error;
/* Compile the program */ /* Compile the program */
int buildProgramFailed = 0; int buildProgramFailed = 0;
int printedSource = 0; int printedSource = 0;
@@ -170,6 +752,7 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr
print_error(error, "clBuildProgram failed"); print_error(error, "clBuildProgram failed");
buildProgramFailed = 1; buildProgramFailed = 1;
printedSource = 1; printedSource = 1;
log_error("Build options: %s\n", buildOptions);
log_error("Original source is: ------------\n"); log_error("Original source is: ------------\n");
for (i = 0; i < numKernelLines; i++) for (i = 0; i < numKernelLines; i++)
log_error("%s", kernelProgram[i]); log_error("%s", kernelProgram[i]);
@@ -178,12 +761,14 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr
// Verify the build status on all devices // Verify the build status on all devices
cl_uint deviceCount = 0; cl_uint deviceCount = 0;
error = clGetProgramInfo(*outProgram, CL_PROGRAM_NUM_DEVICES, sizeof(deviceCount), &deviceCount, NULL); error = clGetProgramInfo(*outProgram, CL_PROGRAM_NUM_DEVICES, sizeof(deviceCount), &deviceCount, NULL);
if (error != CL_SUCCESS) { if (error != CL_SUCCESS)
{
print_error(error, "clGetProgramInfo CL_PROGRAM_NUM_DEVICES failed"); print_error(error, "clGetProgramInfo CL_PROGRAM_NUM_DEVICES failed");
return error; return error;
} }
if (deviceCount == 0) { if (deviceCount == 0)
{
log_error("No devices found for program.\n"); log_error("No devices found for program.\n");
return -1; return -1;
} }
@@ -195,31 +780,40 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr
memset(devices, 0, deviceCount * sizeof(cl_device_id)); memset(devices, 0, deviceCount * sizeof(cl_device_id));
error = clGetProgramInfo(*outProgram, CL_PROGRAM_DEVICES, sizeof(cl_device_id) * deviceCount, devices, NULL); error = clGetProgramInfo(*outProgram, CL_PROGRAM_DEVICES, sizeof(cl_device_id) * deviceCount, devices, NULL);
if (error != CL_SUCCESS) { if (error != CL_SUCCESS)
{
print_error(error, "clGetProgramInfo CL_PROGRAM_DEVICES failed"); print_error(error, "clGetProgramInfo CL_PROGRAM_DEVICES failed");
return error; return error;
} }
cl_uint z; cl_uint z;
bool buildFailed = false;
for (z = 0; z < deviceCount; z++) for (z = 0; z < deviceCount; z++)
{ {
char deviceName[4096] = ""; char deviceName[4096] = "";
error = clGetDeviceInfo(devices[z], CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL); error = clGetDeviceInfo(devices[z], CL_DEVICE_NAME, sizeof(deviceName), deviceName, NULL);
if (error != CL_SUCCESS || deviceName[0] == '\0') { if (error != CL_SUCCESS || deviceName[0] == '\0')
{
log_error("Device \"%d\" failed to return a name\n", z); log_error("Device \"%d\" failed to return a name\n", z);
print_error(error, "clGetDeviceInfo CL_DEVICE_NAME failed"); print_error(error, "clGetDeviceInfo CL_DEVICE_NAME failed");
} }
cl_build_status buildStatus; cl_build_status buildStatus;
error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL);
if (error != CL_SUCCESS) { if (error != CL_SUCCESS)
{
print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_STATUS failed"); print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_STATUS failed");
return error; return error;
} }
if (buildStatus != CL_BUILD_SUCCESS || buildProgramFailed) { if (buildStatus == CL_BUILD_SUCCESS && buildProgramFailed && deviceCount == 1)
char log[10240] = ""; {
if (buildStatus == CL_BUILD_SUCCESS && buildProgramFailed) log_error("clBuildProgram returned an error, but buildStatus is marked as CL_BUILD_SUCCESS.\n"); buildFailed = true;
log_error("clBuildProgram returned an error, but buildStatus is marked as CL_BUILD_SUCCESS.\n");
}
if (buildStatus != CL_BUILD_SUCCESS)
{
char statusString[64] = ""; char statusString[64] = "";
if (buildStatus == (cl_build_status)CL_BUILD_SUCCESS) if (buildStatus == (cl_build_status)CL_BUILD_SUCCESS)
@@ -233,14 +827,30 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr
else else
sprintf(statusString, "UNKNOWN (%d)", buildStatus); sprintf(statusString, "UNKNOWN (%d)", buildStatus);
if (buildStatus != CL_BUILD_SUCCESS) log_error("Build not successful for device \"%s\", status: %s\n", deviceName, statusString); if (buildStatus != CL_BUILD_SUCCESS)
error = clGetProgramBuildInfo( *outProgram, devices[z], CL_PROGRAM_BUILD_LOG, sizeof(log), log, NULL ); log_error("Build not successful for device \"%s\", status: %s\n", deviceName, statusString);
if (error != CL_SUCCESS || log[0]=='\0'){ size_t paramSize = 0;
log_error("Device %d (%s) failed to return a build log\n", z, deviceName); error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_LOG, 0, NULL, &paramSize);
if (error) { if (error != CL_SUCCESS)
{
print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed"); print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed");
return error; return error;
} else { }
std::string log;
log.resize(paramSize / sizeof(char));
error = clGetProgramBuildInfo(*outProgram, devices[z], CL_PROGRAM_BUILD_LOG, paramSize, &log[0], NULL);
if (error != CL_SUCCESS || log[0] == '\0')
{
log_error("Device %d (%s) failed to return a build log\n", z, deviceName);
if (error)
{
print_error(error, "clGetProgramBuildInfo CL_PROGRAM_BUILD_LOG failed");
return error;
}
else
{
log_error("clGetProgramBuildInfo returned an empty log.\n"); log_error("clGetProgramBuildInfo returned an empty log.\n");
return -1; return -1;
} }
@@ -255,25 +865,31 @@ int create_single_kernel_helper_with_build_options( cl_context context, cl_progr
printedSource = 1; printedSource = 1;
} }
log_error("Build log for device \"%s\" is: ------------\n", deviceName); log_error("Build log for device \"%s\" is: ------------\n", deviceName);
log_error( "%s\n", log ); log_error("%s\n", log.c_str());
log_error("\n----------\n"); log_error("\n----------\n");
return -1; return -1;
} }
} }
if (buildFailed)
{
return -1;
}
/* And create a kernel from it */ /* And create a kernel from it */
if (kernelName != NULL)
{
*outKernel = clCreateKernel(*outProgram, kernelName, &error); *outKernel = clCreateKernel(*outProgram, kernelName, &error);
if (*outKernel == NULL || error != CL_SUCCESS) if (*outKernel == NULL || error != CL_SUCCESS)
{ {
print_error(error, "Unable to create kernel"); print_error(error, "Unable to create kernel");
return error; return error;
} }
}
return 0; return 0;
} }
int get_device_version( cl_device_id id, size_t* major, size_t* minor) int get_device_version( cl_device_id id, size_t* major, size_t* minor)
{ {
cl_char buffer[ 4098 ]; cl_char buffer[ 4098 ];
@@ -543,11 +1159,9 @@ int is_extension_available( cl_device_id device, const char *extensionName )
return 0; return 0;
} }
int result = strstr( extString, extensionName ) != NULL; BufferOwningPtr<char> extStringBuf(extString);
free(extString); return strstr( extString, extensionName ) != NULL;
return result;
} }
/* Helper to determine if a device supports an image format */ /* Helper to determine if a device supports an image format */

View File

@@ -58,11 +58,49 @@ extern "C" {
#define STRINGIFY(_x) #_x #define STRINGIFY(_x) #_x
#endif #endif
/* Helper that creates a single program and kernel from a single-kernel program source */ const int MAX_LEN_FOR_KERNEL_LIST = 20;
extern int create_single_kernel_helper( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, const char **kernelProgram, const char *kernelName );
extern int create_single_kernel_helper_with_build_options( cl_context context, cl_program *outProgram, cl_kernel *outKernel, unsigned int numKernelLines, /* Helper that creates a single program and kernel from a single-kernel program source */
const char **kernelProgram, const char *kernelName, const char *buildOptions ); extern int create_single_kernel_helper(cl_context context,
cl_program *outProgram,
cl_kernel *outKernel,
unsigned int numKernelLines,
const char **kernelProgram,
const char *kernelName,
const char *buildOptions = NULL,
const bool openclCXX = false);
extern int create_single_kernel_helper_with_build_options(cl_context context,
cl_program *outProgram,
cl_kernel *outKernel,
unsigned int numKernelLines,
const char **kernelProgram,
const char *kernelName,
const char *buildOptions,
const bool openclCXX = false);
extern int create_single_kernel_helper_create_program(cl_context context,
cl_program *outProgram,
unsigned int numKernelLines,
const char **kernelProgram,
const char *buildOptions = NULL,
const bool openclCXX = false);
/* Creates OpenCL C++ program. This one must be used for creating OpenCL C++ program. */
extern int create_openclcpp_program(cl_context context,
cl_program *outProgram,
unsigned int numKernelLines,
const char **kernelProgram,
const char *buildOptions = NULL);
/* Builds program (outProgram) and creates one kernel */
int build_program_create_kernel_helper(cl_context context,
cl_program *outProgram,
cl_kernel *outKernel,
unsigned int numKernelLines,
const char **kernelProgram,
const char *kernelName,
const char *buildOptions = NULL);
/* Helper to obtain the biggest fit work group size for all the devices in a given group and for the given global thread size */ /* Helper to obtain the biggest fit work group size for all the devices in a given group and for the given global thread size */
extern int get_max_common_work_group_size( cl_context context, cl_kernel kernel, size_t globalThreadSize, size_t *outSize ); extern int get_max_common_work_group_size( cl_context context, cl_kernel kernel, size_t globalThreadSize, size_t *outSize );
@@ -125,6 +163,13 @@ cl_device_fp_config get_default_rounding_mode( cl_device_id device );
return 0; \ return 0; \
} }
#define PASSIVE_REQUIRE_FP16_SUPPORT(device) \
if (!is_extension_available(device, "cl_khr_fp16")) \
{ \
log_info("\n\tNote: device does not support fp16. Skipping test...\n"); \
return 0; \
}
/* Prints out the standard device header for all tests given the device to print for */ /* Prints out the standard device header for all tests given the device to print for */
extern int printDeviceHeader( cl_device_id device ); extern int printDeviceHeader( cl_device_id device );

View File

@@ -14,9 +14,167 @@
// limitations under the License. // limitations under the License.
// //
#include "parseParameters.h" #include "parseParameters.h"
#include "errorHelpers.h" #include "errorHelpers.h"
#include "testHarness.h"
#include "ThreadPool.h"
#include <iostream>
#include <sstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h> #include <string.h>
using namespace std;
CompilationMode gCompilationMode = kOnline;
CompilationCacheMode gCompilationCacheMode = kCacheModeCompileIfAbsent;
std::string gCompilationCachePath = ".";
void helpInfo ()
{
log_info("Common options:\n"
" -h, --help This help\n"
" --compilation-mode <mode> Specify a compilation mode. Mode can be:\n"
" online Use online compilation (default)\n"
" binary Use binary offline compilation\n"
" spir-v Use SPIR-V offline compilation\n"
"\n"
" For offline compilation (binary and spir-v modes) only:\n"
" --compilation-cache-mode <cache-mode> Specify a compilation caching mode:\n"
" compile-if-absent Read from cache if already populated, or\n"
" else perform offline compilation (default)\n"
" force-read Force reading from the cache\n"
" overwrite Disable reading from the cache\n"
" --compilation-cache-path <path> Path for offline compiler output and CL source\n"
"\n");
}
int parseCustomParam (int argc, const char *argv[], const char *ignore)
{
int delArg = 0;
for (int i=1; i<argc; i++)
{
if(ignore != 0)
{
// skip parameters that require special/different treatment in application
// (generic interpretation and parameter removal will not be performed)
const char * ptr = strstr(ignore, argv[i]);
if(ptr != 0 &&
(ptr == ignore || ptr[-1] == ' ') && //first on list or ' ' before
(ptr[strlen(argv[i])] == 0 || ptr[strlen(argv[i])] == ' ')) // last on list or ' ' after
continue;
}
delArg = 0;
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0)
{
// Note: we don't increment delArg to delete this argument,
// to allow the caller's argument parsing routine to see the
// option and print its own help.
helpInfo ();
}
else if (!strcmp(argv[i], "--compilation-mode"))
{
delArg++;
if ((i + 1) < argc)
{
delArg++;
const char *mode = argv[i + 1];
if (!strcmp(mode, "online"))
{
gCompilationMode = kOnline;
}
else if (!strcmp(mode, "binary"))
{
gCompilationMode = kBinary;
}
else if (!strcmp(mode, "spir-v"))
{
gCompilationMode = kSpir_v;
}
else
{
log_error("Compilation mode not recognized: %s\n", mode);
return -1;
}
log_info("Compilation mode specified: %s\n", mode);
}
else
{
log_error("Compilation mode parameters are incorrect. Usage:\n"
" --compilation-mode <online|binary|spir-v>\n");
return -1;
}
}
else if (!strcmp(argv[i], "--compilation-cache-mode"))
{
delArg++;
if ((i + 1) < argc)
{
delArg++;
const char *mode = argv[i + 1];
if (!strcmp(mode, "compile-if-absent"))
{
gCompilationCacheMode = kCacheModeCompileIfAbsent;
}
else if (!strcmp(mode, "force-read"))
{
gCompilationCacheMode = kCacheModeForceRead;
}
else if (!strcmp(mode, "overwrite"))
{
gCompilationCacheMode = kCacheModeOverwrite;
}
else
{
log_error("Compilation cache mode not recognized: %s\n", mode);
return -1;
}
log_info("Compilation cache mode specified: %s\n", mode);
}
else
{
log_error("Compilation cache mode parameters are incorrect. Usage:\n"
" --compilation-cache-mode <compile-if-absent|force-read|overwrite>\n");
return -1;
}
}
else if (!strcmp(argv[i], "--compilation-cache-path"))
{
delArg++;
if ((i + 1) < argc)
{
delArg++;
gCompilationCachePath = argv[i + 1];
}
else
{
log_error("Path argument for --compilation-cache-path was not specified.\n");
return -1;
}
}
//cleaning parameters from argv tab
for (int j = i; j < argc - delArg; j++)
argv[j] = argv[j + delArg];
argc -= delArg;
i -= delArg;
}
if (gCompilationCacheMode != kCacheModeCompileIfAbsent && gCompilationMode == kOnline)
{
log_error("Compilation cache mode can only be specified when using an offline compilation mode.\n");
return -1;
}
return argc;
}
bool is_power_of_two(int number) bool is_power_of_two(int number)
{ {
return number && !(number & (number - 1)); return number && !(number & (number - 1));

View File

@@ -19,6 +19,26 @@
#include "compat.h" #include "compat.h"
#include <string> #include <string>
enum CompilationMode
{
kOnline = 0,
kBinary,
kSpir_v
};
enum CompilationCacheMode
{
kCacheModeCompileIfAbsent = 0,
kCacheModeForceRead,
kCacheModeOverwrite
};
extern CompilationMode gCompilationMode;
extern CompilationCacheMode gCompilationCacheMode;
extern std::string gCompilationCachePath;
extern int parseCustomParam (int argc, const char *argv[], const char *ignore = 0 );
extern void parseWimpyReductionFactor(const char *&arg, int &wimpyReductionFactor); extern void parseWimpyReductionFactor(const char *&arg, int &wimpyReductionFactor);
#endif // _parseParameters_h #endif // _parseParameters_h

View File

@@ -26,6 +26,7 @@
#include "kernelHelpers.h" #include "kernelHelpers.h"
#include "fpcontrol.h" #include "fpcontrol.h"
#include "typeWrappers.h" #include "typeWrappers.h"
#include "parseParameters.h"
#if !defined(_WIN32) #if !defined(_WIN32)
#include <unistd.h> #include <unistd.h>
@@ -127,6 +128,13 @@ int runTestHarnessWithCheck( int argc, const char *argv[], int testNum, test_def
/* Process the command line arguments */ /* Process the command line arguments */
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
test_finish();
return EXIT_FAILURE;
}
/* Special case: just list the tests */ /* Special case: just list the tests */
if( ( argc > 1 ) && (!strcmp( argv[ 1 ], "-list" ) || !strcmp( argv[ 1 ], "-h" ) || !strcmp( argv[ 1 ], "--help" ))) if( ( argc > 1 ) && (!strcmp( argv[ 1 ], "-list" ) || !strcmp( argv[ 1 ], "-h" ) || !strcmp( argv[ 1 ], "--help" )))
{ {
@@ -707,6 +715,9 @@ test_status callSingleTestFunction( test_definition test, cl_device_id deviceToU
return TEST_SKIP; return TEST_SKIP;
} }
error = check_functions_for_offline_compiler(test.name, deviceToUse);
test_missing_support_offline_cmpiler(error, test.name);
if( test.func == NULL ) if( test.func == NULL )
{ {
// Skip unimplemented test, can happen when all of the tests are selected // Skip unimplemented test, can happen when all of the tests are selected

View File

@@ -21,6 +21,8 @@
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <string>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View File

@@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -13,6 +13,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/typeWrappers.cpp ../../test_common/harness/typeWrappers.cpp
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -19,6 +19,7 @@
#include "allocation_fill.h" #include "allocation_fill.h"
#include "allocation_execute.h" #include "allocation_execute.h"
#include "../../test_common/harness/testHarness.h" #include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
#include <time.h> #include <time.h>
typedef long long unsigned llu; typedef long long unsigned llu;
@@ -273,6 +274,13 @@ int main(int argc, const char *argv[])
char *endPtr; char *endPtr;
int r; int r;
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
test_finish();
return 1;
}
const char ** argList = (const char **)calloc( argc, sizeof( char*) ); const char ** argList = (const char **)calloc( argc, sizeof( char*) );
if( NULL == argList ) if( NULL == argList )

View File

@@ -29,6 +29,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/imageHelpers.cpp ../../test_common/harness/imageHelpers.cpp
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -73,6 +73,8 @@ set(${MODULE_NAME}_SOURCES
test_global_linear_id.c test_global_linear_id.c
test_local_linear_id.c test_local_linear_id.c
test_progvar.cpp test_progvar.cpp
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
if(APPLE) if(APPLE)

View File

@@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -11,8 +11,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -27,6 +27,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -19,6 +19,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/os_helpers.cpp ../../test_common/harness/os_helpers.cpp
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -14,7 +14,8 @@
// limitations under the License. // limitations under the License.
// //
#include "testBase.h" #include "testBase.h"
#include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
const char *sample_kernel_code_single_line[] = { const char *sample_kernel_code_single_line[] = {
"__kernel void sample_test(__global float *src, __global int *dst)\n" "__kernel void sample_test(__global float *src, __global int *dst)\n"

View File

@@ -5,7 +5,9 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -9,6 +9,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/rounding_mode.c ../../test_common/harness/rounding_mode.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -36,6 +36,7 @@
#include "../../test_common/harness/rounding_mode.h" #include "../../test_common/harness/rounding_mode.h"
#include "../../test_common/harness/fpcontrol.h" #include "../../test_common/harness/fpcontrol.h"
#include "../../test_common/harness/testHarness.h" #include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
#if defined( __APPLE__ ) #if defined( __APPLE__ )
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
@@ -321,6 +322,12 @@ const int test_num = ARRAY_SIZE( test_list );
int main( int argc, const char **argv ) int main( int argc, const char **argv )
{ {
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
return -1;
}
int error = ParseArgs( argc, argv ); int error = ParseArgs( argc, argv );
if( !error ) if( !error )

View File

@@ -17,9 +17,10 @@ set (${MODULE_NAME}_SOURCES
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/mingw_compat.c ../../test_common/harness/mingw_compat.c
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/harness/parseParameters.cpp ../../test_common/harness/crc32.c
) )
if(ANDROID) if(ANDROID)

View File

@@ -288,6 +288,12 @@ int main (int argc, const char **argv )
int error; int error;
cl_uint seed = (cl_uint) time( NULL ); cl_uint seed = (cl_uint) time( NULL );
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
return 1;
}
if( (error = ParseArgs( argc, argv )) ) if( (error = ParseArgs( argc, argv )) )
return error; return error;

View File

@@ -31,7 +31,10 @@ set(D3D10_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c) ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
)
add_executable(conformance_test_d3d10 add_executable(conformance_test_d3d10
${D3D10_SOURCES}) ${D3D10_SOURCES})

View File

@@ -17,13 +17,17 @@
#define _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS
#include "harness.h" #include "harness.h"
#include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
int main(int argc, char* argv[]) int main(int argc, const char* argv[])
{ {
cl_int result; cl_int result;
cl_platform_id platform = NULL; cl_platform_id platform = NULL;
cl_uint num_devices_tested = 0; cl_uint num_devices_tested = 0;
argc = parseCustomParam(argc, argv);
// get the platform to test // get the platform to test
result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms."); result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms.");

View File

@@ -31,7 +31,10 @@ set(D3D11_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c) ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
)
add_executable(conformance_test_d3d11 add_executable(conformance_test_d3d11
${D3D11_SOURCES}) ${D3D11_SOURCES})

View File

@@ -19,13 +19,17 @@
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
#include "harness.h" #include "harness.h"
#include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
int main(int argc, char* argv[]) int main(int argc, const char* argv[])
{ {
cl_int result; cl_int result;
cl_platform_id platform = NULL; cl_platform_id platform = NULL;
cl_uint num_devices_tested = 0; cl_uint num_devices_tested = 0;
argc = parseCustomParam(argc, argv);
// get the platforms to test // get the platforms to test
result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms."); result = clGetPlatformIDs(1, &platform, NULL); NonTestRequire(result == CL_SUCCESS, "Failed to get any platforms.");

View File

@@ -19,6 +19,8 @@ set(DEVICE_EXECUTION_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -21,6 +21,7 @@
#endif #endif
#include "../../test_common/harness/testHarness.h" #include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
#include "utils.h" #include "utils.h"
#include "procs.h" #include "procs.h"
@@ -75,6 +76,8 @@ test_status deviceCheck(cl_device_id device)
int main(int argc, const char *argv[]) int main(int argc, const char *argv[])
{ {
argc = parseCustomParam(argc, argv);
for (int i = 0; i < argc; ++i) { for (int i = 0; i < argc; ++i) {
int argsRemoveNum = 0; int argsRemoveNum = 0;
if ( strcmp(argv[i], "-kernelName") == 0 ) { if ( strcmp(argv[i], "-kernelName") == 0 ) {

View File

@@ -12,5 +12,7 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/typeWrappers.cpp ../../test_common/harness/typeWrappers.cpp
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -19,6 +19,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/ThreadPool.c ../../test_common/harness/ThreadPool.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -10,6 +10,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
# VS2005 optimization WAR for geom_length) # VS2005 optimization WAR for geom_length)

View File

@@ -31,6 +31,8 @@ set (GL_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
../../test_common/harness/imageHelpers.cpp ../../test_common/harness/imageHelpers.cpp
) )

View File

@@ -25,6 +25,7 @@
#include "procs.h" #include "procs.h"
#include "../../test_common/gl/setup.h" #include "../../test_common/gl/setup.h"
#include "../../test_common/harness/testHarness.h" #include "../../test_common/harness/testHarness.h"
#include "../../test_common/harness/parseParameters.h"
#if !defined(_WIN32) #if !defined(_WIN32)
#include <unistd.h> #include <unistd.h>
@@ -161,6 +162,12 @@ int main(int argc, const char *argv[])
int numErrors = 0; int numErrors = 0;
test_start(); test_start();
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
test_finish ();
return -1;
}
cl_device_type requestedDeviceType = CL_DEVICE_TYPE_DEFAULT; cl_device_type requestedDeviceType = CL_DEVICE_TYPE_DEFAULT;
checkDeviceTypeOverride(&requestedDeviceType); checkDeviceTypeOverride(&requestedDeviceType);

View File

@@ -21,6 +21,8 @@ set (${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
if(ANDROID) if(ANDROID)

View File

@@ -10,8 +10,9 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/ThreadPool.c ../../test_common/harness/ThreadPool.c
../../test_common/harness/testHarness.c
../../test_common/harness/parseParameters.cpp ../../test_common/harness/parseParameters.cpp
../../test_common/harness/testHarness.c
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -93,6 +93,13 @@ int main (int argc, const char **argv )
g_arrVecAligns[i] = alignbound; g_arrVecAligns[i] = alignbound;
} }
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
test_finish();
return -1;
}
if( (error = ParseArgs( argc, argv )) ) if( (error = ParseArgs( argc, argv )) )
goto exit; goto exit;

View File

@@ -4,6 +4,8 @@ set(HEADERS_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
set_source_files_properties(${HEADERS_SOURCES} PROPERTIES LANGUAGE CXX) set_source_files_properties(${HEADERS_SOURCES} PROPERTIES LANGUAGE CXX)

View File

@@ -18,7 +18,7 @@
#else #else
#include <CL/cl_platform.h> #include <CL/cl_platform.h>
#endif #endif
#include <stdio.h>
#include "../../test_common/harness/errorHelpers.h" #include "../../test_common/harness/errorHelpers.h"
#include "../../test_common/harness/testHarness.h" #include "../../test_common/harness/testHarness.h"

View File

@@ -21,6 +21,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/conversions.c ../../../test_common/harness/conversions.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )
include(../../CMakeCommon.txt) include(../../CMakeCommon.txt)

View File

@@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/conversions.c ../../../test_common/harness/conversions.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )

View File

@@ -16,6 +16,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/testHarness.c ../../../test_common/harness/testHarness.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )
include(../../CMakeCommon.txt) include(../../CMakeCommon.txt)

View File

@@ -17,6 +17,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/testHarness.c ../../../test_common/harness/testHarness.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )
include(../../CMakeCommon.txt) include(../../CMakeCommon.txt)

View File

@@ -17,6 +17,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/testHarness.c ../../../test_common/harness/testHarness.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )
include(../../CMakeCommon.txt) include(../../CMakeCommon.txt)

View File

@@ -14,6 +14,7 @@
// limitations under the License. // limitations under the License.
// //
#include "../../../test_common/harness/compat.h" #include "../../../test_common/harness/compat.h"
#include "../../../test_common/harness/parseParameters.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@@ -74,6 +75,13 @@ int main(int argc, const char *argv[])
{ {
cl_channel_type chanType; cl_channel_type chanType;
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
test_finish();
return -1;
}
checkDeviceTypeOverride( &gDeviceType ); checkDeviceTypeOverride( &gDeviceType );
const char ** argList = (const char **)calloc( argc, sizeof( char*) ); const char ** argList = (const char **)calloc( argc, sizeof( char*) );

View File

@@ -22,6 +22,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/testHarness.c ../../../test_common/harness/testHarness.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )
include(../../CMakeCommon.txt) include(../../CMakeCommon.txt)

View File

@@ -25,6 +25,7 @@
#include "../testBase.h" #include "../testBase.h"
#include "../../../test_common/harness/fpcontrol.h" #include "../../../test_common/harness/fpcontrol.h"
#include "../../../test_common/harness/parseParameters.h"
#include <vector> #include <vector>
@@ -266,6 +267,13 @@ int main(int argc, const char *argv[])
cl_channel_type chanType; cl_channel_type chanType;
cl_channel_order chanOrder; cl_channel_order chanOrder;
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
test_finish();
return -1;
}
//Check CL_DEVICE_TYPE environment variable //Check CL_DEVICE_TYPE environment variable
checkDeviceTypeOverride( &gDeviceType ); checkDeviceTypeOverride( &gDeviceType );

View File

@@ -18,6 +18,8 @@ set(${MODULE_NAME}_SOURCES
../../../test_common/harness/testHarness.c ../../../test_common/harness/testHarness.c
../../../test_common/harness/typeWrappers.cpp ../../../test_common/harness/typeWrappers.cpp
../../../test_common/harness/msvc9.c ../../../test_common/harness/msvc9.c
../../../test_common/harness/parseParameters.cpp
../../../test_common/harness/crc32.c
) )
include(../../CMakeCommon.txt) include(../../CMakeCommon.txt)

View File

@@ -25,6 +25,7 @@
#include "../testBase.h" #include "../testBase.h"
#include "../../../test_common/harness/fpcontrol.h" #include "../../../test_common/harness/fpcontrol.h"
#include "../../../test_common/harness/parseParameters.h"
#if defined(__PPC__) #if defined(__PPC__)
// Global varaiable used to hold the FPU control register state. The FPSCR register can not // Global varaiable used to hold the FPU control register state. The FPSCR register can not
@@ -87,6 +88,12 @@ int main(int argc, const char *argv[])
cl_channel_type chanType; cl_channel_type chanType;
cl_channel_order chanOrder; cl_channel_order chanOrder;
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
return -1;
}
//Check CL_DEVICE_TYPE environment variable //Check CL_DEVICE_TYPE environment variable
checkDeviceTypeOverride( &gDeviceType ); checkDeviceTypeOverride( &gDeviceType );

View File

@@ -19,8 +19,9 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -23,10 +23,11 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/ThreadPool.c ../../test_common/harness/ThreadPool.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/harness/parseParameters.cpp ../../test_common/harness/crc32.c
) )
@@ -51,6 +52,7 @@ endif(NOT ANDROID)
set_source_files_properties( set_source_files_properties(
${MODULE_NAME}_SOURCES ${MODULE_NAME}_SOURCES
../../test_common/harness/crc32.c
PROPERTIES LANGUAGE CXX) PROPERTIES LANGUAGE CXX)
if(CMAKE_COMPILER_IS_GNUCC) if(CMAKE_COMPILER_IS_GNUCC)

View File

@@ -13,7 +13,6 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
// //
#include "../../test_common/harness/parseParameters.h"
#include "Utility.h" #include "Utility.h"
#include <stdio.h> #include <stdio.h>
@@ -26,6 +25,7 @@
#include "../../test_common/harness/errorHelpers.h" #include "../../test_common/harness/errorHelpers.h"
#include "../../test_common/harness/kernelHelpers.h" #include "../../test_common/harness/kernelHelpers.h"
#include "../../test_common/harness/parseParameters.h"
#if defined( __APPLE__ ) #if defined( __APPLE__ )
#include <sys/sysctl.h> #include <sys/sysctl.h>
@@ -814,6 +814,11 @@ int main (int argc, const char * argv[])
{ {
int error; int error;
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
return -1;
}
atexit(TestFinishAtExit); atexit(TestFinishAtExit);
#if defined( __APPLE__ ) #if defined( __APPLE__ )

View File

@@ -14,6 +14,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/ThreadPool.c ../../test_common/harness/ThreadPool.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -13,6 +13,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
@@ -28,6 +30,8 @@ set_source_files_properties(
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
PROPERTIES LANGUAGE CXX) PROPERTIES LANGUAGE CXX)
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -12,6 +12,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -16,6 +16,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -14,6 +14,9 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
#../../test_common/harness/imageHelpers.cpp #../../test_common/harness/imageHelpers.cpp
../../test_common/harness/parseParameters.cpp
../../test_common/harness/kernelHelpers.c
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -41,6 +41,7 @@
#include "../../test_common/harness/errorHelpers.h" #include "../../test_common/harness/errorHelpers.h"
#include "../../test_common/harness/kernelHelpers.h" #include "../../test_common/harness/kernelHelpers.h"
#include "../../test_common/harness/mt19937.h" #include "../../test_common/harness/mt19937.h"
#include "../../test_common/harness/parseParameters.h"
typedef unsigned int uint32_t; typedef unsigned int uint32_t;
@@ -994,8 +995,14 @@ const int test_num = ARRAY_SIZE( test_list );
//----------------------------------------- //-----------------------------------------
// main // main
//----------------------------------------- //-----------------------------------------
int main(int argc, char* argv[]) int main(int argc, const char* argv[])
{ {
argc = parseCustomParam(argc, argv);
if (argc == -1)
{
return -1;
}
const char ** argList = (const char **)calloc( argc, sizeof( char*) ); const char ** argList = (const char **)calloc( argc, sizeof( char*) );
if( NULL == argList ) if( NULL == argList )

View File

@@ -17,6 +17,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -13,6 +13,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -9,6 +9,7 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/parseParameters.cpp ../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -17,7 +17,8 @@ set (SPIR_SOURCES
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/os_helpers.cpp ../../test_common/harness/os_helpers.cpp
../../test_common/harness/testHarness.c ../../test_common/harness/testHarness.c
../../test_common/miniz/miniz.c) ../../test_common/miniz/miniz.c
../../test_common/harness/crc32.c)
add_executable(${SPIR_OUT} add_executable(${SPIR_OUT}
${SPIR_SOURCES}) ${SPIR_SOURCES})

View File

@@ -349,7 +349,6 @@ bool test_suite(cl_device_id device, cl_uint size_t_width, const char *folder,
std::cout << std::endl; std::cout << std::endl;
return false; return false;
} }
std::cout << std::endl; std::cout << std::endl;
return true; return true;
} }

View File

@@ -14,7 +14,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/ThreadPool.c ../../test_common/harness/ThreadPool.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
set_source_files_properties( set_source_files_properties(

View File

@@ -12,6 +12,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
set_source_files_properties( set_source_files_properties(

View File

@@ -11,6 +11,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/kernelHelpers.c ../../test_common/harness/kernelHelpers.c
../../test_common/harness/errorHelpers.c ../../test_common/harness/errorHelpers.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
set_source_files_properties( set_source_files_properties(

View File

@@ -20,6 +20,8 @@ set(${MODULE_NAME}_SOURCES
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
../../test_common/harness/conversions.c ../../test_common/harness/conversions.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
) )
include(../CMakeCommon.txt) include(../CMakeCommon.txt)

View File

@@ -18,6 +18,8 @@ set (MEDIA_SOURCES
../../test_common/harness/rounding_mode.c ../../test_common/harness/rounding_mode.c
../../test_common/harness/typeWrappers.cpp ../../test_common/harness/typeWrappers.cpp
../../test_common/harness/mt19937.c ../../test_common/harness/mt19937.c
../../test_common/harness/parseParameters.cpp
../../test_common/harness/crc32.c
../../test_common/harness/msvc9.c ../../test_common/harness/msvc9.c
) )